From 9299416754989f46f2752e3639a87faa8b46b9c1 Mon Sep 17 00:00:00 2001 From: Vincent Jordan Date: Tue, 9 Jan 2024 15:22:35 +0100 Subject: [PATCH] fix(chore): Wrong panic in singleflight --- pkg/middleware/middleware.go | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/pkg/middleware/middleware.go b/pkg/middleware/middleware.go index 4158031ed..6b4c51316 100644 --- a/pkg/middleware/middleware.go +++ b/pkg/middleware/middleware.go @@ -300,6 +300,19 @@ func (s *SouinBaseHandler) Upstream( prometheus.Increment(prometheus.RequestCounter) shared := true + var recoveredFromErr error = nil + defer func() { + // In case of "http.ErrAbortHandler" panic, + // prevent singleflight from wrapping it into "singleflight.panicError". + if r := recover(); r != nil { + err := r.(error) + if errors.Is(err, http.ErrAbortHandler) { + recoveredFromErr = errors.Unwrap(err) + } else { + panic(err) + } + } + }() sfValue, err, _ := s.singleflightPool.Do(cachedKey, func() (interface{}, error) { shared = false if e := next(customWriter, rq); e != nil { @@ -330,7 +343,9 @@ func (s *SouinBaseHandler) Upstream( code: customWriter.statusCode, }, err }) - + if recoveredFromErr != nil { + panic(recoveredFromErr) + } if err != nil { return err }