diff --git a/context_test.go b/context_test.go index b48bcd661..3a5aa80c5 100644 --- a/context_test.go +++ b/context_test.go @@ -32,6 +32,7 @@ func TestContext(t *testing.T) { userJSONIndent := "{\n_?\"id\": \"1\",\n_?\"name\": \"Joe\"\n_}" userXML := `1Joe` userXMLIndent := "_\n_?1\n_?Joe\n_" + incorrectContent := "this is incorrect content" var nonMarshallableChannel chan bool @@ -66,14 +67,18 @@ func TestContext(t *testing.T) { //------ // JSON - testBind(t, c, "application/json") + testBindOk(t, c, ApplicationJSON) + c.X().request = test.NewRequest(POST, "/", strings.NewReader(incorrectContent)) + testBindError(t, c, ApplicationJSON) // XML c.X().request = test.NewRequest(POST, "/", strings.NewReader(userXML)) - testBind(t, c, ApplicationXML) + testBindOk(t, c, ApplicationXML) + c.X().request = test.NewRequest(POST, "/", strings.NewReader(incorrectContent)) + testBindError(t, c, ApplicationXML) // Unsupported - testBind(t, c, "") + testBindError(t, c, "") //-------- // Render @@ -273,14 +278,30 @@ func TestContextNetContext(t *testing.T) { // assert.Equal(t, "val", c.Value("key")) } -func testBind(t *testing.T, c Context, ct string) { +func testBindOk(t *testing.T, c Context, ct string) { c.Request().Header().Set(ContentType, ct) u := new(user) err := c.Bind(u) - if ct == "" { - assert.Error(t, UnsupportedMediaType) - } else if assert.NoError(t, err) { + if assert.NoError(t, err) { assert.Equal(t, "1", u.ID) assert.Equal(t, "Joe", u.Name) } } + +func testBindError(t *testing.T, c Context, ct string) { + c.Request().Header().Set(ContentType, ct) + u := new(user) + err := c.Bind(u) + + switch ct { + case ApplicationJSON, ApplicationXML: + if assert.IsType(t, new(HTTPError), err) { + assert.Equal(t, http.StatusBadRequest, err.(*HTTPError).code) + } + default: + if assert.IsType(t, new(HTTPError), err) { + assert.Equal(t, UnsupportedMediaType, err) + } + + } +} diff --git a/echo.go b/echo.go index ce0581c07..4865d572b 100644 --- a/echo.go +++ b/echo.go @@ -169,7 +169,7 @@ var ( // Errors //-------- - UnsupportedMediaType = errors.New("unsupported media type") + UnsupportedMediaType = NewHTTPError(http.StatusUnsupportedMediaType) RendererNotRegistered = errors.New("renderer not registered") InvalidRedirectCode = errors.New("invalid redirect status code") @@ -647,9 +647,13 @@ func (binder) Bind(r engine.Request, i interface{}) (err error) { ct := r.Header().Get(ContentType) err = UnsupportedMediaType if strings.HasPrefix(ct, ApplicationJSON) { - err = json.NewDecoder(r.Body()).Decode(i) + if err = json.NewDecoder(r.Body()).Decode(i); err != nil { + err = NewHTTPError(http.StatusBadRequest, err.Error()) + } } else if strings.HasPrefix(ct, ApplicationXML) { - err = xml.NewDecoder(r.Body()).Decode(i) + if err = xml.NewDecoder(r.Body()).Decode(i); err != nil { + err = NewHTTPError(http.StatusBadRequest, err.Error()) + } } return }