add status handling to .Write(data)

This commit is contained in:
Zach Marcantel 2014-07-04 00:23:03 -05:00
parent ad80fc5826
commit d44d2e1aed
2 changed files with 33 additions and 4 deletions

8
gin.go
View File

@ -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 { func (group *RouterGroup) createContext(w http.ResponseWriter, req *http.Request, params httprouter.Params, handlers []HandlerFunc) *Context {
return &Context{ return &Context{
Writer: ResponseWriter{w, -1}, Writer: ResponseWriter{w, StatusUnset},
Req: req, Req: req,
index: -1, index: -1,
engine: group.engine, engine: group.engine,
@ -327,7 +327,7 @@ func (c *Context) JSON(code int, obj interface{}) {
if code >= 0 { if code >= 0 {
c.Writer.WriteHeader(code) c.Writer.WriteHeader(code)
} }
encoder := json.NewEncoder(c.Writer) encoder := json.NewEncoder(&c.Writer)
if err := encoder.Encode(obj); err != nil { if err := encoder.Encode(obj); err != nil {
c.Error(err, obj) c.Error(err, obj)
http.Error(&c.Writer, err.Error(), 500) http.Error(&c.Writer, err.Error(), 500)
@ -341,7 +341,7 @@ func (c *Context) XML(code int, obj interface{}) {
if code >= 0 { if code >= 0 {
c.Writer.WriteHeader(code) c.Writer.WriteHeader(code)
} }
encoder := xml.NewEncoder(c.Writer) encoder := xml.NewEncoder(&c.Writer)
if err := encoder.Encode(obj); err != nil { if err := encoder.Encode(obj); err != nil {
c.Error(err, obj) c.Error(err, obj)
http.Error(&c.Writer, err.Error(), 500) http.Error(&c.Writer, err.Error(), 500)
@ -356,7 +356,7 @@ func (c *Context) HTML(code int, name string, data interface{}) {
if code >= 0 { if code >= 0 {
c.Writer.WriteHeader(code) c.Writer.WriteHeader(code)
} }
if err := c.engine.HTMLTemplates.ExecuteTemplate(c.Writer, name, data); err != nil { if err := c.engine.HTMLTemplates.ExecuteTemplate(&c.Writer, name, data); err != nil {
c.Error(err, map[string]interface{}{ c.Error(err, map[string]interface{}{
"name": name, "name": name,
"data": data, "data": data,

View File

@ -4,6 +4,10 @@ import (
"net/http" "net/http"
) )
const (
StatusUnset int = -1
)
type ResponseWriter struct { type ResponseWriter struct {
http.ResponseWriter http.ResponseWriter
status int status int
@ -14,6 +18,31 @@ func (w *ResponseWriter) WriteHeader(code int) {
w.ResponseWriter.WriteHeader(code) w.ResponseWriter.WriteHeader(code)
} }
func (w *ResponseWriter) Write(data []byte) (int, error) {
// net/http.Response.Write only has two options: 200 or 500
// we will follow that lead and defer to their logic
// check if the write gave an error and set status accordingly
size, err := w.ResponseWriter.Write(data)
if err != nil {
// error on write, we give a 500
w.status = http.StatusInternalServerError
} else if w.WasWritten() == false {
// everything went okay and we never set a custom
// status so 200 it is
w.status = http.StatusOK
}
// can easily tap into Content-Length here with 'size'
return size, err
}
// returns the status of the given response
func (w *ResponseWriter) Status() int { func (w *ResponseWriter) Status() int {
return w.status return w.status
} }
// return a boolean acknowledging if a status code has all ready been set
func (w *ResponseWriter) WasWritten() bool {
return w.status == StatusUnset
}