Skip to content

Commit 1d0e79f

Browse files
authored
chore: refactor InitClient() to use ClientOptions (coder#19761)
Refactors `InitClient` and friends to use the ClientBuilder rather than modifying a Client in place.
1 parent 606ae89 commit 1d0e79f

File tree

2 files changed

+51
-32
lines changed

2 files changed

+51
-32
lines changed

cli/root.go

Lines changed: 44 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -529,19 +529,29 @@ func (r *RootCmd) InitClient(inv *serpent.Invocation) (*codersdk.Client, error)
529529
}
530530
}
531531

532-
client := &codersdk.Client{}
533-
err = r.configureClient(inv.Context(), client, r.clientURL, inv)
532+
// Configure HTTP client with transport wrappers
533+
httpClient, err := r.createHTTPClient(inv.Context(), r.clientURL, inv)
534534
if err != nil {
535535
return nil, err
536536
}
537-
client.SetSessionToken(r.token)
537+
538+
clientOpts := []codersdk.ClientOption{
539+
codersdk.WithSessionToken(r.token),
540+
codersdk.WithHTTPClient(httpClient),
541+
}
542+
543+
if r.disableDirect {
544+
clientOpts = append(clientOpts, codersdk.WithDisableDirectConnections())
545+
}
538546

539547
if r.debugHTTP {
540-
client.PlainLogger = os.Stderr
541-
client.SetLogBodies(true)
548+
clientOpts = append(clientOpts,
549+
codersdk.WithPlainLogger(os.Stderr),
550+
codersdk.WithLogBodies(),
551+
)
542552
}
543-
client.DisableDirectConnections = r.disableDirect
544-
return client, nil
553+
554+
return codersdk.New(r.clientURL, clientOpts...), nil
545555
}
546556

547557
// TryInitClient is similar to InitClient but doesn't error when credentials are missing.
@@ -577,19 +587,29 @@ func (r *RootCmd) TryInitClient(inv *serpent.Invocation) (*codersdk.Client, erro
577587

578588
// Only configure the client if we have a URL
579589
if r.clientURL != nil && r.clientURL.String() != "" {
580-
client := &codersdk.Client{}
581-
err = r.configureClient(inv.Context(), client, r.clientURL, inv)
590+
// Configure HTTP client with transport wrappers
591+
httpClient, err := r.createHTTPClient(inv.Context(), r.clientURL, inv)
582592
if err != nil {
583593
return nil, err
584594
}
585-
client.SetSessionToken(r.token)
595+
596+
clientOpts := []codersdk.ClientOption{
597+
codersdk.WithSessionToken(r.token),
598+
codersdk.WithHTTPClient(httpClient),
599+
}
600+
601+
if r.disableDirect {
602+
clientOpts = append(clientOpts, codersdk.WithDisableDirectConnections())
603+
}
586604

587605
if r.debugHTTP {
588-
client.PlainLogger = os.Stderr
589-
client.SetLogBodies(true)
606+
clientOpts = append(clientOpts,
607+
codersdk.WithPlainLogger(os.Stderr),
608+
codersdk.WithLogBodies(),
609+
)
590610
}
591-
client.DisableDirectConnections = r.disableDirect
592-
return client, nil
611+
612+
return codersdk.New(r.clientURL, clientOpts...), nil
593613
}
594614

595615
// Return a minimal client if no URL is available
@@ -602,10 +622,7 @@ func (r *RootCmd) HeaderTransport(ctx context.Context, serverURL *url.URL) (*cod
602622
return headerTransport(ctx, serverURL, r.header, r.headerCommand)
603623
}
604624

605-
func (r *RootCmd) configureClient(ctx context.Context, client *codersdk.Client, serverURL *url.URL, inv *serpent.Invocation) error {
606-
if client.SessionTokenProvider == nil {
607-
client.SessionTokenProvider = codersdk.FixedSessionTokenProvider{}
608-
}
625+
func (r *RootCmd) createHTTPClient(ctx context.Context, serverURL *url.URL, inv *serpent.Invocation) (*http.Client, error) {
609626
transport := http.DefaultTransport
610627
transport = wrapTransportWithTelemetryHeader(transport, inv)
611628
if !r.noVersionCheck {
@@ -621,23 +638,24 @@ func (r *RootCmd) configureClient(ctx context.Context, client *codersdk.Client,
621638
}
622639
headerTransport, err := r.HeaderTransport(ctx, serverURL)
623640
if err != nil {
624-
return xerrors.Errorf("create header transport: %w", err)
641+
return nil, xerrors.Errorf("create header transport: %w", err)
625642
}
626643
// The header transport has to come last.
627644
// codersdk checks for the header transport to get headers
628645
// to clone on the DERP client.
629646
headerTransport.Transport = transport
630-
client.HTTPClient = &http.Client{
647+
return &http.Client{
631648
Transport: headerTransport,
632-
}
633-
client.URL = serverURL
634-
return nil
649+
}, nil
635650
}
636651

637652
func (r *RootCmd) createUnauthenticatedClient(ctx context.Context, serverURL *url.URL, inv *serpent.Invocation) (*codersdk.Client, error) {
638-
var client codersdk.Client
639-
err := r.configureClient(ctx, &client, serverURL, inv)
640-
return &client, err
653+
httpClient, err := r.createHTTPClient(ctx, serverURL, inv)
654+
if err != nil {
655+
return nil, err
656+
}
657+
client := codersdk.New(serverURL, codersdk.WithHTTPClient(httpClient))
658+
return client, nil
641659
}
642660

643661
type AgentAuth struct {

cli/vscodessh.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -79,14 +79,15 @@ func (r *RootCmd) vscodeSSH() *serpent.Command {
7979
ctx, cancel := context.WithCancel(inv.Context())
8080
defer cancel()
8181

82-
client := codersdk.New(serverURL)
83-
client.SetSessionToken(string(sessionToken))
84-
85-
// This adds custom headers to the request!
86-
err = r.configureClient(ctx, client, serverURL, inv)
82+
// Configure HTTP client with transport wrappers
83+
httpClient, err := r.createHTTPClient(ctx, serverURL, inv)
8784
if err != nil {
88-
return xerrors.Errorf("set client: %w", err)
85+
return xerrors.Errorf("create HTTP client: %w", err)
8986
}
87+
client := codersdk.New(serverURL,
88+
codersdk.WithSessionToken(string(sessionToken)),
89+
codersdk.WithHTTPClient(httpClient),
90+
)
9091

9192
parts := strings.Split(inv.Args[0], "--")
9293
if len(parts) < 3 {

0 commit comments

Comments
 (0)