mirror of
https://github.com/gin-gonic/gin.git
synced 2025-10-14 20:22:20 +08:00
add status handling to .Write(data)
This commit is contained in:
parent
ad80fc5826
commit
d44d2e1aed
8
gin.go
8
gin.go
@ -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,
|
||||||
|
@ -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
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user