From b27eb7161dd7bee4845b530d1d56281827689579 Mon Sep 17 00:00:00 2001 From: Josh Vawdrey Date: Sun, 12 Mar 2023 18:30:56 +1100 Subject: [PATCH 1/3] derp/derphttp: pass the headers to the websocket dial --- derp/derphttp/derphttp_client.go | 4 ++-- derp/derphttp/websocket.go | 3 ++- derp/derphttp/websocket_js.go | 3 ++- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/derp/derphttp/derphttp_client.go b/derp/derphttp/derphttp_client.go index 0915227cceaaf..7899868581afe 100644 --- a/derp/derphttp/derphttp_client.go +++ b/derp/derphttp/derphttp_client.go @@ -247,7 +247,7 @@ func (c *Client) preferIPv6() bool { } // dialWebsocketFunc is non-nil (set by websocket.go's init) when compiled in. -var dialWebsocketFunc func(ctx context.Context, urlStr string, tlsConfig *tls.Config) (net.Conn, error) +var dialWebsocketFunc func(ctx context.Context, urlStr string, tlsConfig *tls.Config, httpHeader http.Header) (net.Conn, error) func (c *Client) useWebsockets() bool { if runtime.GOOS == "js" { @@ -326,7 +326,7 @@ func (c *Client) connect(ctx context.Context, caller string) (client *derp.Clien tlsConfig = c.tlsConfig(reg.Nodes[0]) } c.logf("%s: connecting websocket to %v", caller, urlStr) - conn, err := dialWebsocketFunc(ctx, urlStr, tlsConfig) + conn, err := dialWebsocketFunc(ctx, urlStr, tlsConfig, c.Header) if err != nil { c.logf("%s: websocket to %v error: %v", caller, urlStr, err) return nil, 0, err diff --git a/derp/derphttp/websocket.go b/derp/derphttp/websocket.go index 7dc0029b23106..278b647caeb01 100644 --- a/derp/derphttp/websocket.go +++ b/derp/derphttp/websocket.go @@ -17,9 +17,10 @@ func init() { dialWebsocketFunc = dialWebsocket } -func dialWebsocket(ctx context.Context, urlStr string, tlsConfig *tls.Config) (net.Conn, error) { +func dialWebsocket(ctx context.Context, urlStr string, tlsConfig *tls.Config, httpHeader http.Header) (net.Conn, error) { c, res, err := websocket.Dial(ctx, urlStr, &websocket.DialOptions{ Subprotocols: []string{"derp"}, + HTTPHeader: httpHeader, HTTPClient: &http.Client{ Transport: &http.Transport{ TLSClientConfig: tlsConfig, diff --git a/derp/derphttp/websocket_js.go b/derp/derphttp/websocket_js.go index 8dce5ffdf4665..9d14e8c42296f 100644 --- a/derp/derphttp/websocket_js.go +++ b/derp/derphttp/websocket_js.go @@ -19,8 +19,9 @@ func init() { dialWebsocketFunc = dialWebsocket } -func dialWebsocket(ctx context.Context, urlStr string, _ *tls.Config) (net.Conn, error) { +func dialWebsocket(ctx context.Context, urlStr string, _ *tls.Config, httpHeader http.Header) (net.Conn, error) { c, res, err := websocket.Dial(ctx, urlStr, &websocket.DialOptions{ + HTTPHeader: httpHeader Subprotocols: []string{"derp"}, }) if err != nil { From f5d3074d7640da8b36f7e87496460008f45cd23c Mon Sep 17 00:00:00 2001 From: Josh Vawdrey Date: Sun, 12 Mar 2023 18:43:59 +1100 Subject: [PATCH 2/3] chore: fix syntax --- derp/derphttp/websocket_js.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/derp/derphttp/websocket_js.go b/derp/derphttp/websocket_js.go index 9d14e8c42296f..5a317bf079695 100644 --- a/derp/derphttp/websocket_js.go +++ b/derp/derphttp/websocket_js.go @@ -21,7 +21,7 @@ func init() { func dialWebsocket(ctx context.Context, urlStr string, _ *tls.Config, httpHeader http.Header) (net.Conn, error) { c, res, err := websocket.Dial(ctx, urlStr, &websocket.DialOptions{ - HTTPHeader: httpHeader + HTTPHeader: httpHeader, Subprotocols: []string{"derp"}, }) if err != nil { From 979756badabf5b5b7469df539ca5e5c285d5a7e3 Mon Sep 17 00:00:00 2001 From: Josh Vawdrey Date: Sun, 12 Mar 2023 18:57:37 +1100 Subject: [PATCH 3/3] chore:commit --- derp/derphttp/websocket_js.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/derp/derphttp/websocket_js.go b/derp/derphttp/websocket_js.go index 5a317bf079695..5f0ff3f4a042a 100644 --- a/derp/derphttp/websocket_js.go +++ b/derp/derphttp/websocket_js.go @@ -10,6 +10,7 @@ import ( "crypto/tls" "log" "net" + "net/http" "nhooyr.io/websocket" "tailscale.com/net/wsconn" @@ -19,9 +20,8 @@ func init() { dialWebsocketFunc = dialWebsocket } -func dialWebsocket(ctx context.Context, urlStr string, _ *tls.Config, httpHeader http.Header) (net.Conn, error) { +func dialWebsocket(ctx context.Context, urlStr string, _ *tls.Config, _ http.Header) (net.Conn, error) { c, res, err := websocket.Dial(ctx, urlStr, &websocket.DialOptions{ - HTTPHeader: httpHeader, Subprotocols: []string{"derp"}, }) if err != nil {