Skip to content

Commit 7f2e32b

Browse files
author
Becir Basic
committed
fix #2133: Recover middleware should not log panic for aborted handler
1 parent b445958 commit 7f2e32b

File tree

2 files changed

+33
-0
lines changed

2 files changed

+33
-0
lines changed

middleware/recover.go

+4
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package middleware
22

33
import (
44
"fmt"
5+
"net/http"
56
"runtime"
67

78
"github.com/labstack/echo/v4"
@@ -77,6 +78,9 @@ func RecoverWithConfig(config RecoverConfig) echo.MiddlewareFunc {
7778

7879
defer func() {
7980
if r := recover(); r != nil {
81+
if r == http.ErrAbortHandler {
82+
panic(r)
83+
}
8084
err, ok := r.(error)
8185
if !ok {
8286
err = fmt.Errorf("%v", r)

middleware/recover_test.go

+29
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,35 @@ func TestRecover(t *testing.T) {
2828
assert.Contains(t, buf.String(), "PANIC RECOVER")
2929
}
3030

31+
func TestRecoverErrAbortHandler(t *testing.T) {
32+
e := echo.New()
33+
buf := new(bytes.Buffer)
34+
e.Logger.SetOutput(buf)
35+
req := httptest.NewRequest(http.MethodGet, "/", nil)
36+
rec := httptest.NewRecorder()
37+
c := e.NewContext(req, rec)
38+
h := Recover()(echo.HandlerFunc(func(c echo.Context) error {
39+
panic(http.ErrAbortHandler)
40+
}))
41+
defer func() {
42+
r := recover()
43+
if r == nil {
44+
assert.Fail(t, "expecting `http.ErrAbortHandler`, got `nil`")
45+
} else {
46+
if err, ok := r.(error); ok {
47+
assert.ErrorIs(t, err, http.ErrAbortHandler)
48+
} else {
49+
assert.Fail(t, "not of error type")
50+
}
51+
}
52+
}()
53+
54+
h(c)
55+
56+
assert.Equal(t, http.StatusInternalServerError, rec.Code)
57+
assert.NotContains(t, buf.String(), "PANIC RECOVER")
58+
}
59+
3160
func TestRecoverWithConfig_LogLevel(t *testing.T) {
3261
tests := []struct {
3362
logLevel log.Lvl

0 commit comments

Comments
 (0)