Skip to content

Commit 6bf3888

Browse files
authored
Merge pull request #4250 from gofiber/fix/adapter-case5-next-error-propagation
2 parents 3e610ae + 12acb9e commit 6bf3888

2 files changed

Lines changed: 66 additions & 2 deletions

File tree

adapter.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,15 @@ func adaptExpressHandler(handler any) (Handler, bool) {
7171
return nil, false
7272
}
7373
return func(c Ctx) error {
74-
return h(c.Req(), c.Res(), func() error {
75-
return c.Next()
74+
var nextErr error
75+
err := h(c.Req(), c.Res(), func() error {
76+
nextErr = c.Next()
77+
return nextErr
7678
})
79+
if err != nil {
80+
return err
81+
}
82+
return nextErr
7783
}, true
7884
case func(Req, Res, func() error): // (6) Express-style handler with error-returning next callback
7985
if h == nil {

adapter_test.go

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,64 @@ func TestToFiberHandler_ExpressThreeParamsWithError(t *testing.T) {
153153
require.True(t, nextCalled)
154154
}
155155

156+
func TestToFiberHandler_ExpressThreeParamsWithError_PrefersHandlerErrorOverNextError(t *testing.T) {
157+
t.Parallel()
158+
159+
app, ctx := newTestCtx(t)
160+
161+
handler := func(req Req, res Res, next func() error) error {
162+
assert.Equal(t, app, req.App())
163+
assert.Equal(t, app, res.App())
164+
require.EqualError(t, next(), "next error")
165+
return errors.New("handler error")
166+
}
167+
168+
converted, ok := toFiberHandler(handler)
169+
require.True(t, ok)
170+
171+
nextCalled := false
172+
nextHandler := func(_ Ctx) error {
173+
nextCalled = true
174+
return errors.New("next error")
175+
}
176+
177+
withRouteHandlers(t, ctx, converted, nextHandler)
178+
179+
err := converted(ctx)
180+
require.EqualError(t, err, "handler error")
181+
require.True(t, nextCalled)
182+
}
183+
184+
func TestToFiberHandler_ExpressThreeParamsWithError_PropagatesNextErrorWhenNoReturnError(t *testing.T) {
185+
t.Parallel()
186+
187+
app, ctx := newTestCtx(t)
188+
189+
nextErr := errors.New("next error")
190+
191+
handler := func(req Req, res Res, next func() error) error {
192+
assert.Equal(t, app, req.App())
193+
assert.Equal(t, app, res.App())
194+
require.ErrorIs(t, next(), nextErr)
195+
return nil
196+
}
197+
198+
converted, ok := toFiberHandler(handler)
199+
require.True(t, ok)
200+
201+
nextCalled := false
202+
nextHandler := func(_ Ctx) error {
203+
nextCalled = true
204+
return nextErr
205+
}
206+
207+
withRouteHandlers(t, ctx, converted, nextHandler)
208+
209+
err := converted(ctx)
210+
require.ErrorIs(t, err, nextErr)
211+
require.True(t, nextCalled)
212+
}
213+
156214
func TestToFiberHandler_ExpressThreeParamsWithoutError(t *testing.T) {
157215
t.Parallel()
158216

0 commit comments

Comments
 (0)