From 5c38c3b770c2e477f17266e09fe77ee07ab70dfe Mon Sep 17 00:00:00 2001 From: Becir Basic Date: Wed, 16 Mar 2022 00:29:42 +0100 Subject: [PATCH] Recover middleware should not log panic for aborted handler (#2134, fixes #2133) Co-authored-by: Becir Basic --- middleware/recover.go | 4 ++++ middleware/recover_test.go | 29 +++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/middleware/recover.go b/middleware/recover.go index a621a9efe..7b6128533 100644 --- a/middleware/recover.go +++ b/middleware/recover.go @@ -2,6 +2,7 @@ package middleware import ( "fmt" + "net/http" "runtime" "github.com/labstack/echo/v4" @@ -77,6 +78,9 @@ func RecoverWithConfig(config RecoverConfig) echo.MiddlewareFunc { defer func() { if r := recover(); r != nil { + if r == http.ErrAbortHandler { + panic(r) + } err, ok := r.(error) if !ok { err = fmt.Errorf("%v", r) diff --git a/middleware/recover_test.go b/middleware/recover_test.go index 9ac4feedc..b27f3b41c 100644 --- a/middleware/recover_test.go +++ b/middleware/recover_test.go @@ -28,6 +28,35 @@ func TestRecover(t *testing.T) { assert.Contains(t, buf.String(), "PANIC RECOVER") } +func TestRecoverErrAbortHandler(t *testing.T) { + e := echo.New() + buf := new(bytes.Buffer) + e.Logger.SetOutput(buf) + req := httptest.NewRequest(http.MethodGet, "/", nil) + rec := httptest.NewRecorder() + c := e.NewContext(req, rec) + h := Recover()(echo.HandlerFunc(func(c echo.Context) error { + panic(http.ErrAbortHandler) + })) + defer func() { + r := recover() + if r == nil { + assert.Fail(t, "expecting `http.ErrAbortHandler`, got `nil`") + } else { + if err, ok := r.(error); ok { + assert.ErrorIs(t, err, http.ErrAbortHandler) + } else { + assert.Fail(t, "not of error type") + } + } + }() + + h(c) + + assert.Equal(t, http.StatusInternalServerError, rec.Code) + assert.NotContains(t, buf.String(), "PANIC RECOVER") +} + func TestRecoverWithConfig_LogLevel(t *testing.T) { tests := []struct { logLevel log.Lvl