From adbb7898773abbda87a5cdd1fb9501415c15646f Mon Sep 17 00:00:00 2001 From: sh0rez Date: Tue, 9 Aug 2022 16:04:21 +0200 Subject: [PATCH] pkg/web: detect Hijack() as chain write (#53466) --- pkg/web/response_writer.go | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/pkg/web/response_writer.go b/pkg/web/response_writer.go index 62d90642419..b41634e2bdb 100644 --- a/pkg/web/response_writer.go +++ b/pkg/web/response_writer.go @@ -21,6 +21,11 @@ import ( "net/http" ) +var ( + _ http.ResponseWriter = &responseWriter{} + _ http.Hijacker = &responseWriter{} +) + // ResponseWriter is a wrapper around http.ResponseWriter that provides extra information about // the response. It is recommended that middleware handlers use this construct to wrap a responsewriter // if the functionality calls for it. @@ -106,12 +111,20 @@ func (rw *responseWriter) Before(before BeforeFunc) { rw.beforeFuncs = append(rw.beforeFuncs, before) } +const StatusHijacked = -1 + func (rw *responseWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) { hijacker, ok := rw.ResponseWriter.(http.Hijacker) if !ok { return nil, nil, errors.New("the ResponseWriter doesn't support the Hijacker interface") } - return hijacker.Hijack() + + conn, brw, err := hijacker.Hijack() + if err == nil { + rw.status = StatusHijacked + } + + return conn, brw, err } func (rw *responseWriter) callBefore() {