From 661bda84701e2d4a63710d33e8056d892f746048 Mon Sep 17 00:00:00 2001 From: merlin Date: Wed, 22 Nov 2023 21:47:04 +0200 Subject: [PATCH 1/2] use http.ResposnseController --- server.go | 10 ++++------ server_test.go | 22 ++++++++++++++++++++++ 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/server.go b/server.go index d8a205ef..da960882 100644 --- a/server.go +++ b/server.go @@ -174,13 +174,11 @@ func (u *Upgrader) Upgrade(w http.ResponseWriter, r *http.Request, responseHeade } } - h, ok := w.(http.Hijacker) - if !ok { + netConn, brw, err := http.NewResponseController(w).Hijack() + switch { + case errors.Is(err, errors.ErrUnsupported): return u.returnError(w, r, http.StatusInternalServerError, "websocket: response does not implement http.Hijacker") - } - var brw *bufio.ReadWriter - netConn, brw, err := h.Hijack() - if err != nil { + case err != nil: return u.returnError(w, r, http.StatusInternalServerError, err.Error()) } diff --git a/server_test.go b/server_test.go index b0dc625f..d7eb8806 100644 --- a/server_test.go +++ b/server_test.go @@ -7,8 +7,10 @@ package websocket import ( "bufio" "bytes" + "errors" "net" "net/http" + "net/http/httptest" "reflect" "strings" "testing" @@ -152,3 +154,23 @@ func TestBufioReuse(t *testing.T) { } } } + +func TestHijack_NotSupported(t *testing.T) { + t.Parallel() + + req := httptest.NewRequest(http.MethodGet, "http://example.com", nil) + req.Header.Set("Upgrade", "websocket") + req.Header.Set("Connection", "upgrade") + req.Header.Set("Sec-Websocket-Key", "dGhlIHNhbXBsZSBub25jZQ==") + req.Header.Set("Sec-Websocket-Version", "13") + + recorder := httptest.NewRecorder() + + upgrader := Upgrader{} + _, err := upgrader.Upgrade(recorder, req, nil) + + if want := (HandshakeError{}); !errors.As(err, &want) || recorder.Code != http.StatusInternalServerError { + t.Errorf("want %T and status_code=%d", want, http.StatusInternalServerError) + t.Fatalf("got err=%T and status_code=%d", err, recorder.Code) + } +} From 1c378f1df1222a6004932e7771aada7aec515dae Mon Sep 17 00:00:00 2001 From: merlin Date: Wed, 13 Dec 2023 22:28:24 +0200 Subject: [PATCH 2/2] fix: don't use errors.ErrUnsupported, it's available only since go1.21 --- server.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/server.go b/server.go index da960882..357de704 100644 --- a/server.go +++ b/server.go @@ -175,10 +175,7 @@ func (u *Upgrader) Upgrade(w http.ResponseWriter, r *http.Request, responseHeade } netConn, brw, err := http.NewResponseController(w).Hijack() - switch { - case errors.Is(err, errors.ErrUnsupported): - return u.returnError(w, r, http.StatusInternalServerError, "websocket: response does not implement http.Hijacker") - case err != nil: + if err != nil { return u.returnError(w, r, http.StatusInternalServerError, err.Error()) }