Skip to content

Commit 97f77c4

Browse files
JoshVeekylecarbs
andauthored
feat: allow DERP headers to be set (#6572)
* feat: allow DERP headers to be set * chore: remove custom flag * Clone DERP header on client create * Adjust to use interface to cast headers --------- Co-authored-by: Kyle Carberry <kyle@carberry.com>
1 parent d8aee26 commit 97f77c4

File tree

4 files changed

+30
-11
lines changed

4 files changed

+30
-11
lines changed

cli/root.go

+11-5
Original file line numberDiff line numberDiff line change
@@ -334,14 +334,14 @@ func createUnauthenticatedClient(cmd *cobra.Command, serverURL *url.URL) (*coder
334334
}
335335
transport := &headerTransport{
336336
transport: http.DefaultTransport,
337-
headers: map[string]string{},
337+
header: http.Header{},
338338
}
339339
for _, header := range headers {
340340
parts := strings.SplitN(header, "=", 2)
341341
if len(parts) < 2 {
342342
return nil, xerrors.Errorf("split header %q had less than two parts", header)
343343
}
344-
transport.headers[parts[0]] = parts[1]
344+
transport.header.Add(parts[0], parts[1])
345345
}
346346
client.HTTPClient.Transport = transport
347347
return client, nil
@@ -655,12 +655,18 @@ func checkWarnings(cmd *cobra.Command, client *codersdk.Client) error {
655655

656656
type headerTransport struct {
657657
transport http.RoundTripper
658-
headers map[string]string
658+
header http.Header
659+
}
660+
661+
func (h *headerTransport) Header() http.Header {
662+
return h.header.Clone()
659663
}
660664

661665
func (h *headerTransport) RoundTrip(req *http.Request) (*http.Response, error) {
662-
for k, v := range h.headers {
663-
req.Header.Add(k, v)
666+
for k, v := range h.header {
667+
for _, vv := range v {
668+
req.Header.Add(k, vv)
669+
}
664670
}
665671
return h.transport.RoundTrip(req)
666672
}

cli/scaletest.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -330,8 +330,8 @@ func scaletestCleanup() *cobra.Command {
330330
client.HTTPClient = &http.Client{
331331
Transport: &headerTransport{
332332
transport: http.DefaultTransport,
333-
headers: map[string]string{
334-
codersdk.BypassRatelimitHeader: "true",
333+
header: map[string][]string{
334+
codersdk.BypassRatelimitHeader: {"true"},
335335
},
336336
},
337337
}
@@ -515,8 +515,8 @@ It is recommended that all rate limits are disabled on the server before running
515515
client.HTTPClient = &http.Client{
516516
Transport: &headerTransport{
517517
transport: http.DefaultTransport,
518-
headers: map[string]string{
519-
codersdk.BypassRatelimitHeader: "true",
518+
header: map[string][]string{
519+
codersdk.BypassRatelimitHeader: {"true"},
520520
},
521521
},
522522
}

codersdk/workspaceagents.go

+8
Original file line numberDiff line numberDiff line change
@@ -143,9 +143,17 @@ func (c *Client) DialWorkspaceAgent(ctx context.Context, agentID uuid.UUID, opti
143143
}
144144

145145
ip := tailnet.IP()
146+
var header http.Header
147+
headerTransport, ok := c.HTTPClient.Transport.(interface {
148+
Header() http.Header
149+
})
150+
if ok {
151+
header = headerTransport.Header()
152+
}
146153
conn, err := tailnet.NewConn(&tailnet.Options{
147154
Addresses: []netip.Prefix{netip.PrefixFrom(ip, 128)},
148155
DERPMap: connInfo.DERPMap,
156+
DERPHeader: &header,
149157
Logger: options.Logger,
150158
BlockEndpoints: options.BlockEndpoints,
151159
})

tailnet/conn.go

+7-2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"fmt"
77
"io"
88
"net"
9+
"net/http"
910
"net/netip"
1011
"reflect"
1112
"strconv"
@@ -50,8 +51,9 @@ func init() {
5051
}
5152

5253
type Options struct {
53-
Addresses []netip.Prefix
54-
DERPMap *tailcfg.DERPMap
54+
Addresses []netip.Prefix
55+
DERPMap *tailcfg.DERPMap
56+
DERPHeader *http.Header
5557

5658
// BlockEndpoints specifies whether P2P endpoints are blocked.
5759
// If so, only DERPs can establish connections.
@@ -159,6 +161,9 @@ func NewConn(options *Options) (conn *Conn, err error) {
159161
if !ok {
160162
return nil, xerrors.New("get wireguard internals")
161163
}
164+
if options.DERPHeader != nil {
165+
magicConn.SetDERPHeader(options.DERPHeader.Clone())
166+
}
162167

163168
// Update the keys for the magic connection!
164169
err = magicConn.SetPrivateKey(nodePrivateKey)

0 commit comments

Comments
 (0)