diff --git a/core/router/api_builder.go b/core/router/api_builder.go index 8cc58924..d682584e 100644 --- a/core/router/api_builder.go +++ b/core/router/api_builder.go @@ -132,10 +132,18 @@ func overlapRoute(r *Route, next *Route) { next.BuildHandlers() nextHandlers := next.Handlers[0:] + isErrorRoutes := r.StatusCode > 0 && next.StatusCode > 0 + decisionHandler := func(ctx *context.Context) { ctx.Next() - if !defaultOverlapFilter(ctx) { + if isErrorRoutes { // fixes issue #1602. + // If it's an error we don't need to reset (see defaultOverlapFilter) + // its status code(!) and its body, we just check if it was proceed or not. + if !ctx.IsStopped() { + return + } + } else if !defaultOverlapFilter(ctx) { return } diff --git a/core/router/router_handlers_order_test.go b/core/router/router_handlers_order_test.go index 42083ae0..49f97200 100644 --- a/core/router/router_handlers_order_test.go +++ b/core/router/router_handlers_order_test.go @@ -339,7 +339,7 @@ func TestUseWrapOrder(t *testing.T) { Iris Handler without any content written then we would able to change the status code later on. When you need to change that behavior you should - start the handler with a [ctx.Record()](responses/recorder.md) call. + start the handler with a ctx.Record() call. */ } diff --git a/hero/container.go b/hero/container.go index 86347d4b..655461ad 100644 --- a/hero/container.go +++ b/hero/container.go @@ -131,7 +131,11 @@ var BuiltinDependencies = []*Dependency{ NewDependency(func(ctx *context.Context) *sessions.Session { session := sessions.Get(ctx) if session == nil { - panic("binding: session is nil - app.Use(sess.Handler()) to fix it") + ctx.Application().Logger().Debugf("binding: session is nil\nMaybe inside HandleHTTPError? Register it with app.UseRouter(sess.Handler()) to fix it") + // let's don't panic here and let the application continue, now we support + // not matched routes inside the controller through HandleHTTPError, + // so each dependency can check if session was not nil or just use `UseRouter` instead of `Use` + // to register the sessions middleware. } return session