the net/http should set header first,the set http status code and then write the content

This commit is contained in:
JessonChan 2016-02-24 11:47:55 +08:00
parent 76d69b6e51
commit 8c37e76503
2 changed files with 20 additions and 7 deletions

View File

@ -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

View File

@ -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)