Skip to content

Commit 8a50d7b

Browse files
Add AfterNextSkipper option to the Middleware config (#32)
1 parent d00cbe5 commit 8a50d7b

File tree

2 files changed

+71
-0
lines changed

2 files changed

+71
-0
lines changed

middleware.go

+10
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ type (
1919
Logger *Logger
2020
// Skipper defines a function to skip middleware.
2121
Skipper middleware.Skipper
22+
// AfterNextSkipper defines a function to skip middleware after the next handler is called.
23+
AfterNextSkipper middleware.Skipper
2224
// BeforeNext is a function that is executed before the next handler is called.
2325
BeforeNext middleware.BeforeFunc
2426
// Enricher is a function that can be used to enrich the logger with additional information.
@@ -62,6 +64,10 @@ func Middleware(config Config) echo.MiddlewareFunc {
6264
config.Skipper = middleware.DefaultSkipper
6365
}
6466

67+
if config.AfterNextSkipper == nil {
68+
config.AfterNextSkipper = middleware.DefaultSkipper
69+
}
70+
6571
if config.Logger == nil {
6672
config.Logger = New(os.Stdout, WithTimestamp())
6773
}
@@ -129,6 +135,10 @@ func Middleware(config Config) echo.MiddlewareFunc {
129135
}
130136
}
131137

138+
if config.AfterNextSkipper(c) {
139+
return err
140+
}
141+
132142
stop := time.Now()
133143
latency := stop.Sub(start)
134144
var mainEvt *zerolog.Event

middleware_test.go

+61
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"github.com/labstack/gommon/log"
1313
"github.com/rs/zerolog"
1414
"github.com/stretchr/testify/assert"
15+
1516
"github.com/ziflex/lecho/v3"
1617
)
1718

@@ -161,4 +162,64 @@ func TestMiddleware(t *testing.T) {
161162
assert.Contains(t, str, `"level":"info"`)
162163
assert.NotContains(t, str, `"level":"warn"`)
163164
})
165+
166+
t.Run("should skip middleware before calling next handler when Skipper func returns true", func(t *testing.T) {
167+
e := echo.New()
168+
req := httptest.NewRequest(http.MethodGet, "/skip", nil)
169+
req.Header.Set(echo.HeaderContentType, echo.MIMEApplicationJSON)
170+
rec := httptest.NewRecorder()
171+
c := e.NewContext(req, rec)
172+
173+
b := &bytes.Buffer{}
174+
l := lecho.New(b)
175+
l.SetLevel(log.INFO)
176+
m := lecho.Middleware(lecho.Config{
177+
Logger: l,
178+
Skipper: func(c echo.Context) bool {
179+
return c.Request().URL.Path == "/skip"
180+
},
181+
})
182+
183+
next := func(c echo.Context) error {
184+
return nil
185+
}
186+
187+
handler := m(next)
188+
err := handler(c)
189+
190+
assert.NoError(t, err, "should not return error")
191+
192+
str := b.String()
193+
assert.Empty(t, str, "should not log anything")
194+
})
195+
196+
t.Run("should skip middleware after calling next handler when AfterNextSkipper func returns true", func(t *testing.T) {
197+
e := echo.New()
198+
req := httptest.NewRequest(http.MethodGet, "/", nil)
199+
req.Header.Set(echo.HeaderContentType, echo.MIMEApplicationJSON)
200+
rec := httptest.NewRecorder()
201+
c := e.NewContext(req, rec)
202+
203+
b := &bytes.Buffer{}
204+
l := lecho.New(b)
205+
l.SetLevel(log.INFO)
206+
m := lecho.Middleware(lecho.Config{
207+
Logger: l,
208+
AfterNextSkipper: func(c echo.Context) bool {
209+
return c.Response().Status == http.StatusMovedPermanently
210+
},
211+
})
212+
213+
next := func(c echo.Context) error {
214+
return c.Redirect(http.StatusMovedPermanently, "/other")
215+
}
216+
217+
handler := m(next)
218+
err := handler(c)
219+
220+
assert.NoError(t, err, "should not return error")
221+
222+
str := b.String()
223+
assert.Empty(t, str, "should not log anything")
224+
})
164225
}

0 commit comments

Comments
 (0)