From 4cb8421b734ff62438fa5002cd5a829871c664da Mon Sep 17 00:00:00 2001 From: Oleg Lobanov Date: Fri, 29 Jan 2016 14:22:18 +0400 Subject: [PATCH] Change context.Bind() return type to HTTPError #344 --- context_test.go | 35 ++++++++++++++++++++++++++++------- echo.go | 11 ++++++++--- 2 files changed, 36 insertions(+), 10 deletions(-) diff --git a/context_test.go b/context_test.go index 04f4ea8f..622ca62d 100644 --- a/context_test.go +++ b/context_test.go @@ -34,6 +34,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 @@ -68,14 +69,18 @@ func TestContext(t *testing.T) { //------ // JSON - testBind(t, c, "application/json") + testBindOk(t, c, ApplicationJSON) + c.request, _ = http.NewRequest(POST, "/", strings.NewReader(incorrectContent)) + testBindError(t, c, ApplicationJSON) // XML c.request, _ = http.NewRequest(POST, "/", strings.NewReader(userXML)) - testBind(t, c, ApplicationXML) + testBindOk(t, c, ApplicationXML) + c.request, _ = http.NewRequest(POST, "/", strings.NewReader(incorrectContent)) + testBindError(t, c, ApplicationXML) // Unsupported - testBind(t, c, "") + testBindError(t, c, "") //-------- // Render @@ -280,14 +285,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 51d209f6..fa512796 100644 --- a/echo.go +++ b/echo.go @@ -164,7 +164,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") @@ -693,9 +693,14 @@ func (binder) Bind(r *http.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 }