diff --git a/context/context.go b/context/context.go index 837a1b45..83d5a866 100644 --- a/context/context.go +++ b/context/context.go @@ -59,7 +59,10 @@ type Context struct { // Reset init Context, BeegoInput and BeegoOutput func (ctx *Context) Reset(rw http.ResponseWriter, r *http.Request) { ctx.Request = r - ctx.ResponseWriter = &Response{rw, false, 0} + if ctx.ResponseWriter == nil { + ctx.ResponseWriter = &Response{} + } + ctx.ResponseWriter.reset(rw) ctx.Input.Reset(ctx) ctx.Output.Reset(ctx) } @@ -172,8 +175,16 @@ func (ctx *Context) CheckXSRFCookie() bool { //started set to true if response was written to then don't execute other handler type Response struct { http.ResponseWriter - Started bool - Status int + Started bool + Status int + wroteHeader bool +} + +func (r *Response) reset(rw http.ResponseWriter) { + r.ResponseWriter = rw + r.Status = 0 + r.Started = false + r.wroteHeader = false } // Write writes the data to the connection as part of an HTTP reply, @@ -181,6 +192,11 @@ type Response struct { // started means the response has sent out. func (w *Response) Write(p []byte) (int, error) { w.Started = true + if !w.wroteHeader { + w.ResponseWriter.WriteHeader(w.Status) + //prevent multiple response.WriteHeader calls + w.wroteHeader = true + } return w.ResponseWriter.Write(p) } @@ -188,12 +204,10 @@ func (w *Response) Write(p []byte) (int, error) { // and sets `started` to true. func (w *Response) WriteHeader(code int) { if w.Status > 0 { - //prevent multiple response.WriteHeader calls return } w.Status = code w.Started = true - w.ResponseWriter.WriteHeader(code) } // Hijack hijacker for http diff --git a/router.go b/router.go index 80956bd7..d0bf534f 100644 --- a/router.go +++ b/router.go @@ -607,6 +607,7 @@ func (p *ControllerRegister) ServeHTTP(rw http.ResponseWriter, r *http.Request) ) context := p.pool.Get().(*beecontext.Context) context.Reset(rw, r) + defer p.pool.Put(context) defer p.recoverPanic(context) @@ -616,8 +617,6 @@ func (p *ControllerRegister) ServeHTTP(rw http.ResponseWriter, r *http.Request) context.Output.Header("Server", BConfig.ServerName) } - context.Output.Header("Content-Type", "text/html; charset=utf-8") - var urlPath string if !BConfig.RouterCaseSensitive { urlPath = strings.ToLower(r.URL.Path)