Keep the logic of handling errors in render

This commit is contained in:
chainhelen 2018-05-24 23:14:34 -04:00
parent bf7803815b
commit 5036adbb9b
5 changed files with 34 additions and 30 deletions

View File

@ -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) {

View File

@ -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

View File

@ -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)

View File

@ -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
}

View File

@ -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) {