Skip to content

Commit 5df8290

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 5df8290

File tree

4 files changed

+26
-15
lines changed

4 files changed

+26
-15
lines changed

cli/root.go

Lines changed: 15 additions & 12 deletions
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

Lines changed: 1 addition & 1 deletion
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

Lines changed: 8 additions & 2 deletions
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

Lines changed: 2 additions & 0 deletions
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 // indirect

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy