mirror of
https://github.com/kataras/iris.git
synced 2025-02-02 15:30:36 +01:00
mvc: give the end-developer the option to skip an error through the HandleError method
relative to: https://github.com/kataras/iris/issues/1628#issuecomment-691668764
This commit is contained in:
parent
7431fcc9cf
commit
99fd50bf9d
|
@ -118,7 +118,12 @@ func makeHandler(fn interface{}, c *Container, paramsCount int) context.Handler
|
||||||
// }
|
// }
|
||||||
|
|
||||||
c.GetErrorHandler(ctx).HandleError(ctx, err)
|
c.GetErrorHandler(ctx).HandleError(ctx, err)
|
||||||
return
|
// return [13 Sep 2020, commented that in order to be able to
|
||||||
|
// give end-developer the option not only to handle the error
|
||||||
|
// but to skip it if necessary, example:
|
||||||
|
// read form, unknown field, continue without StopWith,
|
||||||
|
// the binder should bind the method's input argument and continue
|
||||||
|
// without errors. See `mvc.TestErrorHandlerContinue` test.]
|
||||||
}
|
}
|
||||||
|
|
||||||
// If ~an error status code is set or~ execution has stopped
|
// If ~an error status code is set or~ execution has stopped
|
||||||
|
|
|
@ -137,6 +137,16 @@ func TestPayloadBinding(t *testing.T) {
|
||||||
return input.Username
|
return input.Username
|
||||||
})
|
})
|
||||||
|
|
||||||
|
h.GetErrorHandler = func(iris.Context) ErrorHandler {
|
||||||
|
return ErrorHandlerFunc(func(ctx iris.Context, err error) {
|
||||||
|
if iris.IsErrPath(err) {
|
||||||
|
return // continue.
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx.StopWithError(iris.StatusBadRequest, err)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
app := iris.New()
|
app := iris.New()
|
||||||
app.Get("/", ptrHandler)
|
app.Get("/", ptrHandler)
|
||||||
app.Post("/", ptrHandler)
|
app.Post("/", ptrHandler)
|
||||||
|
@ -152,6 +162,9 @@ func TestPayloadBinding(t *testing.T) {
|
||||||
e.POST("/").WithFormField("username", "makis").Expect().Status(httptest.StatusOK).Body().Equal("makis")
|
e.POST("/").WithFormField("username", "makis").Expect().Status(httptest.StatusOK).Body().Equal("makis")
|
||||||
// FORM (multipart)
|
// FORM (multipart)
|
||||||
e.POST("/").WithMultipart().WithFormField("username", "makis").Expect().Status(httptest.StatusOK).Body().Equal("makis")
|
e.POST("/").WithMultipart().WithFormField("username", "makis").Expect().Status(httptest.StatusOK).Body().Equal("makis")
|
||||||
|
// FORM: test ErrorHandler skip the ErrPath.
|
||||||
|
e.POST("/").WithMultipart().WithFormField("username", "makis").WithFormField("unknown", "continue").
|
||||||
|
Expect().Status(httptest.StatusOK).Body().Equal("makis")
|
||||||
|
|
||||||
// POST URL query.
|
// POST URL query.
|
||||||
e.POST("/").WithQuery("username", "makis").Expect().Status(httptest.StatusOK).Body().Equal("makis")
|
e.POST("/").WithQuery("username", "makis").Expect().Status(httptest.StatusOK).Body().Equal("makis")
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
package mvc_test
|
package mvc_test
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/kataras/iris/v12"
|
"github.com/kataras/iris/v12"
|
||||||
|
@ -707,3 +708,36 @@ func TestControllerMethodHandlerBindStruct(t *testing.T) {
|
||||||
e.POST("/data/42/slicetypeptr").WithJSON(manyData).Expect().Status(httptest.StatusOK).JSON().Equal(manyData)
|
e.POST("/data/42/slicetypeptr").WithJSON(manyData).Expect().Status(httptest.StatusOK).JSON().Equal(manyData)
|
||||||
// more tests inside the hero package itself.
|
// more tests inside the hero package itself.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestErrorHandlerContinue(t *testing.T) {
|
||||||
|
app := iris.New()
|
||||||
|
m := New(app)
|
||||||
|
m.Handle(new(testControllerErrorHandlerContinue))
|
||||||
|
|
||||||
|
e := httptest.New(t, app)
|
||||||
|
|
||||||
|
e.POST("/test").WithMultipart().
|
||||||
|
WithFormField("username", "makis").
|
||||||
|
WithFormField("age", "27").
|
||||||
|
WithFormField("unknown", "continue").
|
||||||
|
Expect().Status(httptest.StatusOK).Body().Equal("makis is 27 years old\n")
|
||||||
|
}
|
||||||
|
|
||||||
|
type testControllerErrorHandlerContinue struct{}
|
||||||
|
|
||||||
|
type registerForm struct {
|
||||||
|
Username string `form:"username"`
|
||||||
|
Age int `form:"age"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *testControllerErrorHandlerContinue) HandleError(ctx iris.Context, err error) {
|
||||||
|
if iris.IsErrPath(err) {
|
||||||
|
return // continue.
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx.StopWithError(iris.StatusBadRequest, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *testControllerErrorHandlerContinue) PostTest(form registerForm) string {
|
||||||
|
return fmt.Sprintf("%s is %d years old\n", form.Username, form.Age)
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user