diff --git a/context/context.go b/context/context.go index 5f095f1a..31698c85 100644 --- a/context/context.go +++ b/context/context.go @@ -61,7 +61,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) } @@ -178,6 +181,12 @@ type Response struct { Status int } +func (r *Response) reset(rw http.ResponseWriter) { + r.ResponseWriter = rw + r.Status = 0 + r.Started = false +} + // Write writes the data to the connection as part of an HTTP reply, // and sets `started` to true. // started means the response has sent out. @@ -197,6 +206,10 @@ func (w *Response) Copy(buf *bytes.Buffer) (int64, error) { // WriteHeader sends an HTTP response header with status code, // 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) diff --git a/controller.go b/controller.go index fb481b57..85894275 100644 --- a/controller.go +++ b/controller.go @@ -261,7 +261,7 @@ func (c *Controller) Abort(code string) { // CustomAbort stops controller handler and show the error data, it's similar Aborts, but support status code and body. func (c *Controller) CustomAbort(status int, body string) { - c.Ctx.ResponseWriter.WriteHeader(status) + c.Ctx.Output.Status = status // first panic from ErrorMaps, is is user defined error functions. if _, ok := ErrorMaps[body]; ok { panic(body) diff --git a/logs/mulitfile.go b/logs/multifile.go similarity index 90% rename from logs/mulitfile.go rename to logs/multifile.go index cf22f7a8..b82ba274 100644 --- a/logs/mulitfile.go +++ b/logs/multifile.go @@ -24,7 +24,7 @@ import ( // means if the file name in configuration is project.log filesLogWriter will create project.error.log/project.debug.log // and write the error-level logs to project.error.log and write the debug-level logs to project.debug.log // the rotate attribute also acts like fileLogWriter -type mulitFileLogWriter struct { +type multiFileLogWriter struct { writers [LevelDebug + 1 + 1]*fileLogWriter // the last one for fullLogWriter fullLogWriter *fileLogWriter Separate []string `json:"separate"` @@ -45,7 +45,7 @@ var levelNames = [...]string{"emergency", "alert", "critical", "error", "warning // "separate":["emergency", "alert", "critical", "error", "warning", "notice", "info", "debug"], // } -func (f *mulitFileLogWriter) Init(config string) error { +func (f *multiFileLogWriter) Init(config string) error { writer := newFileWriter().(*fileLogWriter) err := writer.Init(config) if err != nil { @@ -76,7 +76,7 @@ func (f *mulitFileLogWriter) Init(config string) error { return nil } -func (f *mulitFileLogWriter) Destroy() { +func (f *multiFileLogWriter) Destroy() { for i := 0; i < len(f.writers); i++ { if f.writers[i] != nil { f.writers[i].Destroy() @@ -84,7 +84,7 @@ func (f *mulitFileLogWriter) Destroy() { } } -func (f *mulitFileLogWriter) WriteMsg(when time.Time, msg string, level int) error { +func (f *multiFileLogWriter) WriteMsg(when time.Time, msg string, level int) error { if f.fullLogWriter != nil { f.fullLogWriter.WriteMsg(when, msg, level) } @@ -98,7 +98,7 @@ func (f *mulitFileLogWriter) WriteMsg(when time.Time, msg string, level int) err return nil } -func (f *mulitFileLogWriter) Flush() { +func (f *multiFileLogWriter) Flush() { for i := 0; i < len(f.writers); i++ { if f.writers[i] != nil { f.writers[i].Flush() @@ -108,9 +108,9 @@ func (f *mulitFileLogWriter) Flush() { // newFilesWriter create a FileLogWriter returning as LoggerInterface. func newFilesWriter() Logger { - return &mulitFileLogWriter{} + return &multiFileLogWriter{} } func init() { - Register("mulitfile", newFilesWriter) + Register("multifile", newFilesWriter) } diff --git a/logs/mulitfile_test.go b/logs/multifile_test.go similarity index 96% rename from logs/mulitfile_test.go rename to logs/multifile_test.go index 5e1e3f06..57b96094 100644 --- a/logs/mulitfile_test.go +++ b/logs/multifile_test.go @@ -24,7 +24,7 @@ import ( func TestFiles_1(t *testing.T) { log := NewLogger(10000) - log.SetLogger("mulitfile", `{"filename":"test.log","separate":["emergency", "alert", "critical", "error", "warning", "notice", "info", "debug"]}`) + log.SetLogger("multifile", `{"filename":"test.log","separate":["emergency", "alert", "critical", "error", "warning", "notice", "info", "debug"]}`) log.Debug("debug") log.Informational("info") log.Notice("notice") diff --git a/router.go b/router.go index 82a602e1..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)