From 91d2844df152e1006b3f2b6918c29c4a6a27db2b Mon Sep 17 00:00:00 2001 From: zeripath Date: Tue, 31 May 2022 21:27:44 +0100 Subject: [PATCH] Ensure responses are context.ResponseWriters (#19843) In order for web.Wrap to be able to detect if a response has been written we need to wrap any non-context.ResponseWriters as a such. Otherwise responses will be incorrectly detected as non-written to and handlers can double run. In the case of GZip this handler will change the response to a non-context.RW and this failure to correctly detect response writing causes fallthrough and a NPE. Fix #19839 Signed-off-by: Andrew Thornton --- modules/web/wrap_convert.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modules/web/wrap_convert.go b/modules/web/wrap_convert.go index 8dc4e6d62bd8a..b7bcbc64394cc 100644 --- a/modules/web/wrap_convert.go +++ b/modules/web/wrap_convert.go @@ -21,6 +21,9 @@ func convertHandler(handler interface{}) wrappedHandlerFunc { case http.HandlerFunc: return func(resp http.ResponseWriter, req *http.Request, others ...wrappedHandlerFunc) (done bool, deferrable func()) { routing.UpdateFuncInfo(req.Context(), funcInfo) + if _, ok := resp.(context.ResponseWriter); !ok { + resp = context.NewResponse(resp) + } t(resp, req) if r, ok := resp.(context.ResponseWriter); ok && r.Status() > 0 { done = true @@ -92,6 +95,9 @@ func convertHandler(handler interface{}) wrappedHandlerFunc { next = wrapInternal(others) } routing.UpdateFuncInfo(req.Context(), funcInfo) + if _, ok := resp.(context.ResponseWriter); !ok { + resp = context.NewResponse(resp) + } t(next).ServeHTTP(resp, req) if r, ok := resp.(context.ResponseWriter); ok && r.Status() > 0 { done = true