mirror of
https://github.com/labstack/echo.git
synced 2024-12-24 20:14:31 +02:00
Merge pull request #350 from o1egl/binder_http_error_v2
Change context.Bind() return type to HTTPError. #344
This commit is contained in:
commit
443a0bb48d
@ -32,6 +32,7 @@ func TestContext(t *testing.T) {
|
||||
userJSONIndent := "{\n_?\"id\": \"1\",\n_?\"name\": \"Joe\"\n_}"
|
||||
userXML := `<user><id>1</id><name>Joe</name></user>`
|
||||
userXMLIndent := "_<user>\n_?<id>1</id>\n_?<name>Joe</name>\n_</user>"
|
||||
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)
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
10
echo.go
10
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
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user