From adbdcceff3ed4d92edf0134f30c73129fb7da22e Mon Sep 17 00:00:00 2001 From: Sai Asish Y Date: Thu, 28 May 2026 01:09:22 -0700 Subject: [PATCH] response_writer: keep Written() false when Hijack is unsupported Signed-off-by: Sai Asish Y --- response_writer.go | 6 +++--- response_writer_test.go | 6 ++++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/response_writer.go b/response_writer.go index 22438e1b..8e2d8b30 100644 --- a/response_writer.go +++ b/response_writer.go @@ -114,13 +114,13 @@ func (w *responseWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) { if w.size > 0 { return nil, nil, errHijackAlreadyWritten } - if w.size < 0 { - w.size = 0 - } hijacker, ok := w.ResponseWriter.(http.Hijacker) if !ok { return nil, nil, http.ErrNotSupported } + if w.size < 0 { + w.size = 0 + } return hijacker.Hijack() } diff --git a/response_writer_test.go b/response_writer_test.go index d79ad7c6..83d3fc8b 100644 --- a/response_writer_test.go +++ b/response_writer_test.go @@ -114,12 +114,14 @@ func TestResponseWriterHijack(t *testing.T) { w := ResponseWriter(writer) // httptest.ResponseRecorder doesn't implement http.Hijacker; return - // http.ErrNotSupported instead of panicking (#4638). + // http.ErrNotSupported instead of panicking (#4638). On unsupported the + // writer state stays untouched so the handler can still emit a normal + // HTTP response as a fallback. conn, buf, err := w.Hijack() assert.Nil(t, conn) assert.Nil(t, buf) require.ErrorIs(t, err, http.ErrNotSupported) - assert.True(t, w.Written()) + assert.False(t, w.Written()) // CloseNotify on a non-CloseNotifier returns nil instead of panicking. assert.Nil(t, w.CloseNotify())