diff --git a/middleware/recoverer.go b/middleware/recoverer.go index 79c7826d..8fa69bad 100644 --- a/middleware/recoverer.go +++ b/middleware/recoverer.go @@ -22,7 +22,12 @@ import ( func Recoverer(next http.Handler) http.Handler { fn := func(w http.ResponseWriter, r *http.Request) { defer func() { - if rvr := recover(); rvr != nil && rvr != http.ErrAbortHandler { + if rvr := recover(); rvr != nil { + if rvr == http.ErrAbortHandler { + // we don't recover http.ErrAbortHandler so the response + // to the client is aborted, this should not be logged + panic(rvr) + } logEntry := GetLogEntry(r) if logEntry != nil { diff --git a/middleware/recoverer_test.go b/middleware/recoverer_test.go index 942cc033..15e8ae58 100644 --- a/middleware/recoverer_test.go +++ b/middleware/recoverer_test.go @@ -40,3 +40,28 @@ func TestRecoverer(t *testing.T) { } t.Fatal("First func call line should start with ->.") } + +func TestRecovererAbortHandler(t *testing.T) { + defer func() { + rcv := recover() + if rcv != http.ErrAbortHandler { + t.Fatalf("http.ErrAbortHandler should not be recovered") + } + }() + + w := httptest.NewRecorder() + + r := chi.NewRouter() + r.Use(Recoverer) + + r.Get("/", func(w http.ResponseWriter, r *http.Request) { + panic(http.ErrAbortHandler) + }) + + req, err := http.NewRequest("GET", "/", nil) + if err != nil { + t.Fatal(err) + } + + r.ServeHTTP(w, req) +}