diff --git a/.gitignore b/.gitignore index 0072ff55..9f686b6a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ .vscode _authortools +/_examples/issue-*/ .directory node_modules package-lock.json diff --git a/context/context.go b/context/context.go index 39fd73c5..52b6f812 100644 --- a/context/context.go +++ b/context/context.go @@ -1382,8 +1382,8 @@ func (ctx *context) Next() { // or context.Next(ctx) // it sends a Status Not Found (404) to the client and it stops the execution. func (ctx *context) NextOr(handlers ...Handler) bool { if next := ctx.NextHandler(); next != nil { - next(ctx) ctx.Skip() // skip this handler from the chain. + next(ctx) return true } diff --git a/mvc/controller_test.go b/mvc/controller_test.go index 0995efad..1919b08c 100644 --- a/mvc/controller_test.go +++ b/mvc/controller_test.go @@ -585,3 +585,42 @@ func TestControllerRequestScopedDependencies(t *testing.T) { }) e.GET("/custom/context").Expect().Status(httptest.StatusOK).Body().Equal("test") } + +type ( + testServiceDoSomething struct{} + + TestControllerAsDeepDep struct { + Ctx iris.Context + Service *testServiceDoSomething + } + + FooController struct { + TestControllerAsDeepDep + } + + BarController struct { + FooController + } + + FinalController struct { + BarController + } +) + +func (s *testServiceDoSomething) DoSomething(ctx iris.Context) { + ctx.WriteString("foo bar") +} + +func (c *FinalController) GetSomething() { + c.Service.DoSomething(c.Ctx) +} + +func TestControllersInsideControllerDeep(t *testing.T) { + app := iris.New() + m := New(app) + m.Register(new(testServiceDoSomething)) + m.Handle(new(FinalController)) + + e := httptest.New(t, app) + e.GET("/something").Expect().Status(httptest.StatusOK).Body().Equal("foo bar") +}