diff --git a/feature.go b/feature.go index 50ca301..3c4288c 100644 --- a/feature.go +++ b/feature.go @@ -1,10 +1,6 @@ package dotweb import ( - "compress/gzip" - "io" - "net/http" - "net/url" "strconv" "github.com/devfeel/dotweb/feature" @@ -26,62 +22,3 @@ func (f *xFeatureTools) SetCROSConfig(ctx *HttpContext, c *feature.CROSConfig) { ctx.Response().SetHeader(HeaderAccessControlAllowCredentials, strconv.FormatBool(c.AllowCredentials)) ctx.Response().SetHeader(HeaderP3P, c.AllowedP3P) } - -// set CROS config on HttpContext -func (f *xFeatureTools) SetSession(httpCtx *HttpContext) { - sessionId, err := httpCtx.HttpServer().GetSessionManager().GetClientSessionID(httpCtx.Request().Request) - if err == nil && sessionId != "" { - httpCtx.sessionID = sessionId - } else { - httpCtx.sessionID = httpCtx.HttpServer().GetSessionManager().NewSessionID() - cookie := &http.Cookie{ - Name: httpCtx.HttpServer().sessionManager.StoreConfig().CookieName, - Value: url.QueryEscape(httpCtx.SessionID()), - Path: "/", - } - httpCtx.SetCookie(cookie) - } -} - -func (f *xFeatureTools) SetGzip(httpCtx *HttpContext) { - gw, err := gzip.NewWriterLevel(httpCtx.Response().Writer(), DefaultGzipLevel) - if err != nil { - panic("use gzip error -> " + err.Error()) - } - grw := &gzipResponseWriter{Writer: gw, ResponseWriter: httpCtx.Response().Writer()} - httpCtx.Response().reset(grw) - httpCtx.Response().SetHeader(HeaderContentEncoding, gzipScheme) -} - -// doFeatures do features... -func (f *xFeatureTools) InitFeatures(server *HttpServer, httpCtx *HttpContext) { - - // gzip - if server.ServerConfig().EnabledGzip { - FeatureTools.SetGzip(httpCtx) - } - - // session - // if exists client-sessionid, use it - // if not exists client-sessionid, new one - if server.SessionConfig().EnabledSession { - FeatureTools.SetSession(httpCtx) - } - - // CROS handling - if server.Features.CROSConfig != nil { - c := server.Features.CROSConfig - if c.EnabledCROS { - FeatureTools.SetCROSConfig(httpCtx, c) - } - } - -} - -func (f *xFeatureTools) ReleaseFeatures(server *HttpServer, httpCtx *HttpContext) { - if server.ServerConfig().EnabledGzip { - var w io.Writer - w = httpCtx.Response().Writer().(*gzipResponseWriter).Writer - w.(*gzip.Writer).Close() - } -} diff --git a/router.go b/router.go index 75364d2..b934e7f 100644 --- a/router.go +++ b/router.go @@ -275,9 +275,6 @@ func (r *router) wrapRouterHandle(handler HttpHandle, isHijack bool) RouterHandl return func(httpCtx *HttpContext) { httpCtx.handler = handler - // do features - FeatureTools.InitFeatures(r.server, httpCtx) - // hijack handling if isHijack { _, hijack_err := httpCtx.Hijack() @@ -316,8 +313,6 @@ func (r *router) wrapRouterHandle(handler HttpHandle, isHijack bool) RouterHandl core.GlobalState.AddErrorCount(httpCtx.Request().Path(), fmt.Errorf("%v", err), 1) } - FeatureTools.ReleaseFeatures(r.server, httpCtx) - // cancle Context if httpCtx.cancle != nil { httpCtx.cancle() diff --git a/server.go b/server.go index c94e81b..8da9bd8 100644 --- a/server.go +++ b/server.go @@ -1,7 +1,10 @@ package dotweb import ( + "compress/gzip" + "io" "net/http" + "net/url" "strings" "sync" @@ -160,13 +163,7 @@ func (server *HttpServer) ServeHTTP(w http.ResponseWriter, req *http.Request) { if server.IsOffline() { server.DotApp.OfflineServer.ServeHTTP(w, req) } else { - // get from pool - response := server.pool.response.Get().(*Response) - request := server.pool.request.Get().(*Request) - httpCtx := server.pool.context.Get().(*HttpContext) - httpCtx.reset(response, request, server, nil, nil, nil) - response.reset(w) - request.reset(req, httpCtx) + httpCtx := prepareHttpContext(server, w, req) // process OnBeginRequest of modules for _, module := range server.Modules { @@ -185,17 +182,9 @@ func (server *HttpServer) ServeHTTP(w http.ResponseWriter, req *http.Request) { module.OnEndRequest(httpCtx) } } - core.GlobalState.AddRequestCount(httpCtx.Request().Path(), httpCtx.Response().HttpCode(), 1) - // release response - response.release() - server.pool.response.Put(response) - // release request - request.release() - server.pool.request.Put(request) - // release context - httpCtx.release() - server.pool.context.Put(httpCtx) + + releaseHttpContext(server, httpCtx) } } } @@ -484,3 +473,71 @@ func checkIsDebugRequest(req *http.Request) bool { } return false } + +// prepareHttpContext init HttpContext, init session & gzip config on HttpContext +func prepareHttpContext(server *HttpServer, w http.ResponseWriter, req *http.Request) *HttpContext { + // get from pool + response := server.pool.response.Get().(*Response) + request := server.pool.request.Get().(*Request) + httpCtx := server.pool.context.Get().(*HttpContext) + httpCtx.reset(response, request, server, nil, nil, nil) + response.reset(w) + request.reset(req, httpCtx) + + // session + // if exists client-sessionid, use it + // if not exists client-sessionid, new one + if httpCtx.HttpServer().SessionConfig().EnabledSession { + sessionId, err := httpCtx.HttpServer().GetSessionManager().GetClientSessionID(httpCtx.Request().Request) + if err == nil && sessionId != "" { + httpCtx.sessionID = sessionId + } else { + httpCtx.sessionID = httpCtx.HttpServer().GetSessionManager().NewSessionID() + cookie := &http.Cookie{ + Name: httpCtx.HttpServer().sessionManager.StoreConfig().CookieName, + Value: url.QueryEscape(httpCtx.SessionID()), + Path: "/", + } + httpCtx.SetCookie(cookie) + } + } + // init gzip + if httpCtx.HttpServer().ServerConfig().EnabledGzip { + gw, err := gzip.NewWriterLevel(httpCtx.Response().Writer(), DefaultGzipLevel) + if err != nil { + panic("use gzip error -> " + err.Error()) + } + grw := &gzipResponseWriter{Writer: gw, ResponseWriter: httpCtx.Response().Writer()} + httpCtx.Response().reset(grw) + httpCtx.Response().SetHeader(HeaderContentEncoding, gzipScheme) + } + + // CROS handling + if server.Features.CROSConfig != nil { + c := server.Features.CROSConfig + if c.EnabledCROS { + FeatureTools.SetCROSConfig(httpCtx, c) + } + } + + return httpCtx +} + +// releaseHttpContext release HttpContext, release gzip writer +func releaseHttpContext(server *HttpServer, httpCtx *HttpContext){ + // release response + httpCtx.Response().release() + server.pool.response.Put(httpCtx.Response()) + // release request + httpCtx.Request().release() + server.pool.request.Put(httpCtx.Request()) + // release context + httpCtx.release() + server.pool.context.Put(httpCtx) + + if server.ServerConfig().EnabledGzip { + var w io.Writer + w = httpCtx.Response().Writer().(*gzipResponseWriter).Writer + w.(*gzip.Writer).Close() + } +} \ No newline at end of file diff --git a/version.MD b/version.MD index e6df52f..818df4d 100644 --- a/version.MD +++ b/version.MD @@ -1,5 +1,12 @@ ## dotweb版本记录: + +#### Version 1.5.9.9 +* Fix Bug for #184 ServerFile不能正确获取SessionID() +* Remove Init Session & Gzip in feature.go +* Important: We will remove feature.go in dotweb, so will remove ServerConfig().EnabledAutoCORS on version 1.6. +* 2019-01-28 12:00 + #### Version 1.5.9.8 * New Feature: Fix UT and add scripts for UT * Detail: