From 113a8ab8d478377388c3c889e84eb8bc9173f3b3 Mon Sep 17 00:00:00 2001 From: Jareth Gomes Date: Tue, 21 Jun 2022 19:12:23 -0500 Subject: [PATCH 1/4] Implemented forwarding of all headers --- websocketproxy.go | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/websocketproxy.go b/websocketproxy.go index 63d39ba..dee7d72 100644 --- a/websocketproxy.go +++ b/websocketproxy.go @@ -87,7 +87,16 @@ func (w *WebsocketProxy) ServeHTTP(rw http.ResponseWriter, req *http.Request) { // Pass headers from the incoming request to the dialer to forward them to // the final destinations. - requestHeader := http.Header{} + requestHeader := req.Header.Clone() + + // gorilla/websocket adds these headers back, but it never .Set() them, so leaving these + // headers leads to duplicates + requestHeader.Del("Connection") + requestHeader.Del("Sec-Websocket-Extensions") + requestHeader.Del("Sec-Websocket-Key") + requestHeader.Del("Sec-Websocket-Version") + requestHeader.Del("Upgrade") + if origin := req.Header.Get("Origin"); origin != "" { requestHeader.Add("Origin", origin) } From f9bd747dfe3df73171a89cadfe7e50e8ad77840c Mon Sep 17 00:00:00 2001 From: Jareth Gomes Date: Tue, 21 Jun 2022 19:18:41 -0500 Subject: [PATCH 2/4] Clarified comment --- websocketproxy.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/websocketproxy.go b/websocketproxy.go index dee7d72..455133b 100644 --- a/websocketproxy.go +++ b/websocketproxy.go @@ -89,8 +89,10 @@ func (w *WebsocketProxy) ServeHTTP(rw http.ResponseWriter, req *http.Request) { // the final destinations. requestHeader := req.Header.Clone() - // gorilla/websocket adds these headers back, but it never .Set() them, so leaving these - // headers leads to duplicates + // gorilla/websocket automatically adds these headers back when Dial() is called, but it never + // uses Set(), rather it sets these headers using normal assignment might can so lead to + // duplicate headers. Hence, we can remove them. (If this problem gets fixed in gorilla/websocket, + // these 4 lines become redundant, but will not break the current implementation) requestHeader.Del("Connection") requestHeader.Del("Sec-Websocket-Extensions") requestHeader.Del("Sec-Websocket-Key") From 62c94c2ac5edebf004d654d253a242661b4604bb Mon Sep 17 00:00:00 2001 From: Jareth Gomes Date: Tue, 21 Jun 2022 19:33:15 -0500 Subject: [PATCH 3/4] Added hop-by-hop header removal --- websocketproxy.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/websocketproxy.go b/websocketproxy.go index 455133b..ef29355 100644 --- a/websocketproxy.go +++ b/websocketproxy.go @@ -99,6 +99,14 @@ func (w *WebsocketProxy) ServeHTTP(rw http.ResponseWriter, req *http.Request) { requestHeader.Del("Sec-Websocket-Version") requestHeader.Del("Upgrade") + // Remove all hop-by-hop headers + requestHeader.Del("Keep-Alive") + requestHeader.Del("Transfer-Encoding") + requestHeader.Del("TE") + requestHeader.Del("Trailer") + requestHeader.Del("Proxy-Authorization") + requestHeader.Del("Proxy-Authenticate") + if origin := req.Header.Get("Origin"); origin != "" { requestHeader.Add("Origin", origin) } From 9c247a147a156bc7b75545ad5f873868cf105f31 Mon Sep 17 00:00:00 2001 From: Jareth Gomes Date: Tue, 21 Jun 2022 19:35:05 -0500 Subject: [PATCH 4/4] Fixed typo --- websocketproxy.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/websocketproxy.go b/websocketproxy.go index ef29355..63251d2 100644 --- a/websocketproxy.go +++ b/websocketproxy.go @@ -92,7 +92,7 @@ func (w *WebsocketProxy) ServeHTTP(rw http.ResponseWriter, req *http.Request) { // gorilla/websocket automatically adds these headers back when Dial() is called, but it never // uses Set(), rather it sets these headers using normal assignment might can so lead to // duplicate headers. Hence, we can remove them. (If this problem gets fixed in gorilla/websocket, - // these 4 lines become redundant, but will not break the current implementation) + // these 5 lines become redundant, but will not break the current implementation) requestHeader.Del("Connection") requestHeader.Del("Sec-Websocket-Extensions") requestHeader.Del("Sec-Websocket-Key")