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
}