重构项目的实现,优化使用方法与使用逻辑
This commit is contained in:
@@ -4,77 +4,48 @@ import (
|
||||
"context"
|
||||
"net/http"
|
||||
|
||||
"git.toowon.com/jimmy/go-common/requestctx"
|
||||
"git.toowon.com/jimmy/go-common/tools"
|
||||
)
|
||||
|
||||
// TimezoneKey context中存储时区的key
|
||||
type timezoneKey struct{}
|
||||
|
||||
// TimezoneHeaderName 时区请求头名称
|
||||
const TimezoneHeaderName = "X-Timezone"
|
||||
|
||||
// DefaultTimezone 默认时区
|
||||
const DefaultTimezone = tools.AsiaShanghai
|
||||
|
||||
// GetTimezoneFromContext 从context中获取时区
|
||||
// GetTimezoneFromContext 从 context 中获取时区
|
||||
func GetTimezoneFromContext(ctx context.Context) string {
|
||||
if tz, ok := ctx.Value(timezoneKey{}).(string); ok && tz != "" {
|
||||
return tz
|
||||
}
|
||||
return DefaultTimezone
|
||||
return requestctx.Timezone(ctx)
|
||||
}
|
||||
|
||||
// Timezone 时区处理中间件
|
||||
// 从请求头 X-Timezone 读取时区信息,如果未传递则使用默认时区 AsiaShanghai
|
||||
// 时区信息会存储到context中,可以通过 GetTimezoneFromContext 获取
|
||||
func Timezone(next http.Handler) http.Handler {
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
// 从请求头获取时区
|
||||
timezone := r.Header.Get(TimezoneHeaderName)
|
||||
|
||||
// 如果未传递时区信息,使用默认时区
|
||||
if timezone == "" {
|
||||
timezone = DefaultTimezone
|
||||
timezone = requestctx.DefaultTimezone
|
||||
}
|
||||
|
||||
// 验证时区是否有效
|
||||
if _, err := tools.GetLocation(timezone); err != nil {
|
||||
// 如果时区无效,使用默认时区
|
||||
timezone = DefaultTimezone
|
||||
timezone = requestctx.DefaultTimezone
|
||||
}
|
||||
|
||||
// 将时区存储到context中
|
||||
ctx := context.WithValue(r.Context(), timezoneKey{}, timezone)
|
||||
ctx := requestctx.WithTimezone(r.Context(), timezone)
|
||||
next.ServeHTTP(w, r.WithContext(ctx))
|
||||
})
|
||||
}
|
||||
|
||||
// TimezoneWithDefault 时区处理中间件(可自定义默认时区)
|
||||
// defaultTimezone: 默认时区,如果未指定则使用 AsiaShanghai
|
||||
func TimezoneWithDefault(defaultTimezone string) func(http.Handler) http.Handler {
|
||||
// 验证默认时区是否有效
|
||||
if _, err := tools.GetLocation(defaultTimezone); err != nil {
|
||||
defaultTimezone = DefaultTimezone
|
||||
defaultTimezone = requestctx.DefaultTimezone
|
||||
}
|
||||
|
||||
return func(next http.Handler) http.Handler {
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
// 从请求头获取时区
|
||||
timezone := r.Header.Get(TimezoneHeaderName)
|
||||
|
||||
// 如果未传递时区信息,使用指定的默认时区
|
||||
if timezone == "" {
|
||||
timezone = defaultTimezone
|
||||
}
|
||||
|
||||
// 验证时区是否有效
|
||||
if _, err := tools.GetLocation(timezone); err != nil {
|
||||
// 如果时区无效,使用默认时区
|
||||
timezone = defaultTimezone
|
||||
}
|
||||
|
||||
// 将时区存储到context中
|
||||
ctx := context.WithValue(r.Context(), timezoneKey{}, timezone)
|
||||
ctx := requestctx.WithTimezone(r.Context(), timezone)
|
||||
next.ServeHTTP(w, r.WithContext(ctx))
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user