From a6c6ebce8fbdeabeee151511baed0259fc2b7bad Mon Sep 17 00:00:00 2001 From: Zachary Marcantel Date: Tue, 1 Jul 2014 17:09:17 -0500 Subject: [PATCH] expose status code (or anything) by wrapping http.ResponseWriter --- gin.go | 16 ++++++++-------- response_writer.go | 19 +++++++++++++++++++ 2 files changed, 27 insertions(+), 8 deletions(-) create mode 100644 response_writer.go diff --git a/gin.go b/gin.go index 197b98ca..3192f6c4 100644 --- a/gin.go +++ b/gin.go @@ -35,7 +35,7 @@ type ( // manage the flow, validate the JSON of a request and render a JSON response for example. Context struct { Req *http.Request - Writer http.ResponseWriter + Writer ResponseWriter Keys map[string]interface{} Errors ErrorMsgs Params httprouter.Params @@ -101,7 +101,7 @@ func (engine *Engine) handle404(w http.ResponseWriter, req *http.Request) { handlers := engine.combineHandlers(engine.handlers404) c := engine.createContext(w, req, nil, handlers) if engine.handlers404 == nil { - http.NotFound(c.Writer, c.Req) + http.NotFound(&c.Writer, c.Req) } else { c.Writer.WriteHeader(404) } @@ -125,7 +125,7 @@ func (engine *Engine) ServeFiles(path string, root http.FileSystem) { // ServeHTTP makes the router implement the http.Handler interface. func (engine *Engine) ServeHTTP(w http.ResponseWriter, req *http.Request) { - engine.router.ServeHTTP(w, req) + engine.router.ServeHTTP(&ResponseWriter{w, -1}, req) } func (engine *Engine) Run(addr string) { @@ -138,7 +138,7 @@ func (engine *Engine) Run(addr string) { func (group *RouterGroup) createContext(w http.ResponseWriter, req *http.Request, params httprouter.Params, handlers []HandlerFunc) *Context { return &Context{ - Writer: w, + Writer: ResponseWriter{w, -1}, Req: req, index: -1, engine: group.engine, @@ -178,7 +178,7 @@ func (group *RouterGroup) Handle(method, p string, handlers []HandlerFunc) { p = path.Join(group.prefix, p) handlers = group.combineHandlers(handlers) group.engine.router.Handle(method, p, func(w http.ResponseWriter, req *http.Request, params httprouter.Params) { - group.createContext(w, req, params, handlers).Next() + group.createContext(&ResponseWriter{w, -1}, req, params, handlers).Next() }) } @@ -330,7 +330,7 @@ func (c *Context) JSON(code int, obj interface{}) { encoder := json.NewEncoder(c.Writer) if err := encoder.Encode(obj); err != nil { c.Error(err, obj) - http.Error(c.Writer, err.Error(), 500) + http.Error(&c.Writer, err.Error(), 500) } } @@ -344,7 +344,7 @@ func (c *Context) XML(code int, obj interface{}) { encoder := xml.NewEncoder(c.Writer) if err := encoder.Encode(obj); err != nil { c.Error(err, obj) - http.Error(c.Writer, err.Error(), 500) + http.Error(&c.Writer, err.Error(), 500) } } @@ -361,7 +361,7 @@ func (c *Context) HTML(code int, name string, data interface{}) { "name": name, "data": data, }) - http.Error(c.Writer, err.Error(), 500) + http.Error(&c.Writer, err.Error(), 500) } } diff --git a/response_writer.go b/response_writer.go new file mode 100644 index 00000000..91a4595e --- /dev/null +++ b/response_writer.go @@ -0,0 +1,19 @@ +package gin + +import ( + "net/http" +) + +type ResponseWriter struct { + http.ResponseWriter + status int +} + +func (w *ResponseWriter) WriteHeader(code int) { + w.status = code + w.ResponseWriter.WriteHeader(code) +} + +func (w *ResponseWriter) Status() int { + return w.status +}