From 5036adbb9bb7127adf0f8d9cd7d34a70c24d634f Mon Sep 17 00:00:00 2001 From: chainhelen Date: Thu, 24 May 2018 23:14:34 -0400 Subject: [PATCH] Keep the logic of handling errors in render --- render/json.go | 36 ++++++++++++++++++------------------ render/redirect.go | 3 ++- render/render_test.go | 10 ++++++---- render/text.go | 11 ++++++----- render/yaml.go | 4 ++-- 5 files changed, 34 insertions(+), 30 deletions(-) diff --git a/render/json.go b/render/json.go index 3a2e8b2f..9983efa3 100755 --- a/render/json.go +++ b/render/json.go @@ -36,10 +36,7 @@ var jsonContentType = []string{"application/json; charset=utf-8"} var jsonpContentType = []string{"application/javascript; charset=utf-8"} func (r JSON) Render(w http.ResponseWriter) (err error) { - if err = WriteJSON(w, r.Data); err != nil { - panic(err) - } - return + return WriteJSON(w, r.Data) } func (r JSON) WriteContentType(w http.ResponseWriter) { @@ -52,8 +49,8 @@ func WriteJSON(w http.ResponseWriter, obj interface{}) error { if err != nil { return err } - w.Write(jsonBytes) - return nil + _, err = w.Write(jsonBytes) + return err } func (r IndentedJSON) Render(w http.ResponseWriter) error { @@ -62,8 +59,8 @@ func (r IndentedJSON) Render(w http.ResponseWriter) error { if err != nil { return err } - w.Write(jsonBytes) - return nil + _, err = w.Write(jsonBytes) + return err } func (r IndentedJSON) WriteContentType(w http.ResponseWriter) { @@ -78,10 +75,10 @@ func (r SecureJSON) Render(w http.ResponseWriter) error { } // if the jsonBytes is array values if bytes.HasPrefix(jsonBytes, []byte("[")) && bytes.HasSuffix(jsonBytes, []byte("]")) { - w.Write([]byte(r.Prefix)) + jsonBytes = append([]byte(r.Prefix), jsonBytes...) } - w.Write(jsonBytes) - return nil + _, err = w.Write(jsonBytes) + return err } func (r SecureJSON) WriteContentType(w http.ResponseWriter) { @@ -96,17 +93,20 @@ func (r JsonpJSON) Render(w http.ResponseWriter) (err error) { } if r.Callback == "" { - w.Write(ret) - return nil + _, err := w.Write(ret) + return err } callback := template.JSEscapeString(r.Callback) - w.Write([]byte(callback)) - w.Write([]byte("(")) - w.Write(ret) - w.Write([]byte(")")) - return nil + tmp := []byte("") + tmp = append(tmp, []byte(callback)...) + tmp = append(tmp, []byte("(")...) + tmp = append(tmp, ret...) + tmp = append(tmp, []byte(")")...) + + _, err = w.Write(tmp) + return err } func (r JsonpJSON) WriteContentType(w http.ResponseWriter) { diff --git a/render/redirect.go b/render/redirect.go index f874a351..53cc99f7 100644 --- a/render/redirect.go +++ b/render/redirect.go @@ -5,6 +5,7 @@ package render import ( + "errors" "fmt" "net/http" ) @@ -17,7 +18,7 @@ type Redirect struct { func (r Redirect) Render(w http.ResponseWriter) error { if (r.Code < 300 || r.Code > 308) && r.Code != 201 { - panic(fmt.Sprintf("Cannot redirect with status code %d", r.Code)) + return errors.New(fmt.Sprintf("Cannot redirect with status code %d", r.Code)) } http.Redirect(w, r.Request, r.Location, r.Code) return nil diff --git a/render/render_test.go b/render/render_test.go index 40ec806e..ebded478 100755 --- a/render/render_test.go +++ b/render/render_test.go @@ -62,12 +62,13 @@ func TestRenderJSON(t *testing.T) { assert.Equal(t, "application/json; charset=utf-8", w.Header().Get("Content-Type")) } -func TestRenderJSONPanics(t *testing.T) { +func TestRenderJSONFail(t *testing.T) { w := httptest.NewRecorder() data := make(chan int) // json: unsupported type: chan int - assert.Panics(t, func() { (JSON{data}).Render(w) }) + err := (JSON{data}).Render(w) + assert.Error(t, err) } func TestRenderIndentedJSON(t *testing.T) { @@ -84,7 +85,7 @@ func TestRenderIndentedJSON(t *testing.T) { assert.Equal(t, "application/json; charset=utf-8", w.Header().Get("Content-Type")) } -func TestRenderIndentedJSONPanics(t *testing.T) { +func TestRenderIndentedJSONFail(t *testing.T) { w := httptest.NewRecorder() data := make(chan int) @@ -258,7 +259,8 @@ func TestRenderRedirect(t *testing.T) { } w = httptest.NewRecorder() - assert.Panics(t, func() { data2.Render(w) }) + err = data2.Render(w) + assert.Error(t, err) // only improve coverage data2.WriteContentType(w) diff --git a/render/text.go b/render/text.go index 74cd26be..e89f8583 100644 --- a/render/text.go +++ b/render/text.go @@ -18,19 +18,20 @@ type String struct { var plainContentType = []string{"text/plain; charset=utf-8"} func (r String) Render(w http.ResponseWriter) error { - WriteString(w, r.Format, r.Data) - return nil + return WriteString(w, r.Format, r.Data) } func (r String) WriteContentType(w http.ResponseWriter) { writeContentType(w, plainContentType) } -func WriteString(w http.ResponseWriter, format string, data []interface{}) { +func WriteString(w http.ResponseWriter, format string, data []interface{}) error { + var err error writeContentType(w, plainContentType) if len(data) > 0 { - fmt.Fprintf(w, format, data...) + _, err = fmt.Fprintf(w, format, data...) } else { - io.WriteString(w, format) + _, err = io.WriteString(w, format) } + return err } diff --git a/render/yaml.go b/render/yaml.go index 25d0ebd4..0e242a19 100644 --- a/render/yaml.go +++ b/render/yaml.go @@ -24,8 +24,8 @@ func (r YAML) Render(w http.ResponseWriter) error { return err } - w.Write(bytes) - return nil + _, err = w.Write(bytes) + return err } func (r YAML) WriteContentType(w http.ResponseWriter) {