Skip to content

Commit 5c4e24b

Browse files
committed
chore(cli): correctly report telemetry even when transport replaced
By introducing the "ExtraHeaders" map, we can apply headers even when handlers replace the transport, as in the case of our scaletests.
1 parent d413b26 commit 5c4e24b

File tree

4 files changed

+26
-15
lines changed

4 files changed

+26
-15
lines changed

cli/root.go

+15-12
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import (
2727
"cdr.dev/slog"
2828

2929
"github.com/charmbracelet/lipgloss"
30+
"github.com/gobwas/httphead"
3031
"github.com/mattn/go-isatty"
3132

3233
"github.com/coder/coder/buildinfo"
@@ -494,14 +495,15 @@ func (r *RootCmd) InitClient(client *codersdk.Client) clibase.MiddlewareFunc {
494495
}
495496
err = r.setClient(
496497
client, r.clientURL,
497-
append(r.header, codersdk.CLITelemetryHeader+"="+
498-
base64.StdEncoding.EncodeToString(byt),
499-
),
500498
)
501499
if err != nil {
502500
return err
503501
}
504502

503+
client.ExtraHeaders.Set(codersdk.CLITelemetryHeader,
504+
base64.StdEncoding.EncodeToString(byt),
505+
)
506+
505507
client.SetSessionToken(r.token)
506508

507509
if r.debugHTTP {
@@ -544,28 +546,29 @@ func (r *RootCmd) InitClient(client *codersdk.Client) clibase.MiddlewareFunc {
544546
}
545547
}
546548

547-
func (*RootCmd) setClient(client *codersdk.Client, serverURL *url.URL, headers []string) error {
549+
func (r *RootCmd) setClient(client *codersdk.Client, serverURL *url.URL) error {
548550
transport := &headerTransport{
549551
transport: http.DefaultTransport,
550552
header: http.Header{},
551553
}
552-
for _, header := range headers {
553-
parts := strings.SplitN(header, "=", 2)
554-
if len(parts) < 2 {
555-
return xerrors.Errorf("split header %q had less than two parts", header)
556-
}
557-
transport.header.Add(parts[0], parts[1])
558-
}
559554
client.URL = serverURL
560555
client.HTTPClient = &http.Client{
561556
Transport: transport,
562557
}
558+
client.ExtraHeaders = make(http.Header)
559+
for _, hd := range r.header {
560+
k, v, ok := httphead.ParseHeaderLine([]byte(hd))
561+
if !ok {
562+
return xerrors.Errorf("invalid header: %s", hd)
563+
}
564+
client.ExtraHeaders.Add(string(k), string(v))
565+
}
563566
return nil
564567
}
565568

566569
func (r *RootCmd) createUnauthenticatedClient(serverURL *url.URL) (*codersdk.Client, error) {
567570
var client codersdk.Client
568-
err := r.setClient(&client, serverURL, r.header)
571+
err := r.setClient(&client, serverURL)
569572
return &client, err
570573
}
571574

cli/vscodessh.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ func (r *RootCmd) vscodeSSH() *clibase.Cmd {
8383
client.SetSessionToken(string(sessionToken))
8484

8585
// This adds custom headers to the request!
86-
err = r.setClient(client, serverURL, r.header)
86+
err = r.setClient(client, serverURL)
8787
if err != nil {
8888
return xerrors.Errorf("set client: %w", err)
8989
}

codersdk/client.go

+8-2
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,9 @@ var loggableMimeTypes = map[string]struct{}{
8585
// New creates a Coder client for the provided URL.
8686
func New(serverURL *url.URL) *Client {
8787
return &Client{
88-
URL: serverURL,
89-
HTTPClient: &http.Client{},
88+
URL: serverURL,
89+
HTTPClient: &http.Client{},
90+
ExtraHeaders: make(http.Header),
9091
}
9192
}
9293

@@ -96,6 +97,9 @@ type Client struct {
9697
mu sync.RWMutex // Protects following.
9798
sessionToken string
9899

100+
// ExtraHeaders are headers to add to every request.
101+
ExtraHeaders http.Header
102+
99103
HTTPClient *http.Client
100104
URL *url.URL
101105

@@ -189,6 +193,8 @@ func (c *Client) Request(ctx context.Context, method, path string, body interfac
189193
return nil, xerrors.Errorf("create request: %w", err)
190194
}
191195

196+
req.Header = c.ExtraHeaders.Clone()
197+
192198
tokenHeader := c.SessionTokenHeader
193199
if tokenHeader == "" {
194200
tokenHeader = SessionTokenHeader

go.mod

+2
Original file line numberDiff line numberDiff line change
@@ -352,3 +352,5 @@ require (
352352
howett.net/plist v1.0.0 // indirect
353353
inet.af/peercred v0.0.0-20210906144145-0893ea02156a // indirect
354354
)
355+
356+
require github.com/gobwas/httphead v0.1.0

0 commit comments

Comments
 (0)