Skip to content

Commit e9af6ff

Browse files
committed
chore: refactor InitClient() to use ClientBuilder
1 parent a617309 commit e9af6ff

File tree

2 files changed

+48
-33
lines changed

2 files changed

+48
-33
lines changed

cli/root.go

Lines changed: 39 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -529,19 +529,26 @@ 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+
// Use ClientBuilder to construct the builder
539+
builder := codersdk.NewClientBuilder(r.clientURL).
540+
SessionToken(r.token).
541+
HTTPClient(httpClient)
542+
543+
if r.disableDirect {
544+
builder.DisableDirectConnections()
545+
}
538546

539547
if r.debugHTTP {
540-
client.PlainLogger = os.Stderr
541-
client.SetLogBodies(true)
548+
builder.PlainLogger(os.Stderr).LogBodies(true)
542549
}
543-
client.DisableDirectConnections = r.disableDirect
544-
return client, nil
550+
551+
return builder.Build(), nil
545552
}
546553

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

578585
// Only configure the client if we have a URL
579586
if r.clientURL != nil && r.clientURL.String() != "" {
580-
client := &codersdk.Client{}
581-
err = r.configureClient(inv.Context(), client, r.clientURL, inv)
587+
// Configure HTTP client with transport wrappers
588+
httpClient, err := r.createHTTPClient(inv.Context(), r.clientURL, inv)
582589
if err != nil {
583590
return nil, err
584591
}
585-
client.SetSessionToken(r.token)
592+
593+
// Use ClientBuilder to construct the builder
594+
builder := codersdk.NewClientBuilder(r.clientURL).
595+
SessionToken(r.token).
596+
HTTPClient(httpClient)
597+
598+
if r.disableDirect {
599+
builder.DisableDirectConnections()
600+
}
586601

587602
if r.debugHTTP {
588-
client.PlainLogger = os.Stderr
589-
client.SetLogBodies(true)
603+
builder.PlainLogger(os.Stderr).LogBodies(true)
590604
}
591-
client.DisableDirectConnections = r.disableDirect
592-
return client, nil
605+
606+
return builder.Build(), nil
593607
}
594608

595609
// Return a minimal client if no URL is available
@@ -602,17 +616,14 @@ func (r *RootCmd) HeaderTransport(ctx context.Context, serverURL *url.URL) (*cod
602616
return headerTransport(ctx, serverURL, r.header, r.headerCommand)
603617
}
604618

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-
}
619+
func (r *RootCmd) createHTTPClient(ctx context.Context, serverURL *url.URL, inv *serpent.Invocation) (*http.Client, error) {
609620
transport := http.DefaultTransport
610621
transport = wrapTransportWithTelemetryHeader(transport, inv)
611622
if !r.noVersionCheck {
612623
transport = wrapTransportWithVersionMismatchCheck(transport, inv, buildinfo.Version(), func(ctx context.Context) (codersdk.BuildInfoResponse, error) {
613624
// Create a new client without any wrapped transport
614625
// otherwise it creates an infinite loop!
615-
basicClient := codersdk.New(serverURL)
626+
basicClient := codersdk.NewClientBuilder(serverURL).Build()
616627
return basicClient.BuildInfo(ctx)
617628
})
618629
}
@@ -621,23 +632,24 @@ func (r *RootCmd) configureClient(ctx context.Context, client *codersdk.Client,
621632
}
622633
headerTransport, err := r.HeaderTransport(ctx, serverURL)
623634
if err != nil {
624-
return xerrors.Errorf("create header transport: %w", err)
635+
return nil, xerrors.Errorf("create header transport: %w", err)
625636
}
626637
// The header transport has to come last.
627638
// codersdk checks for the header transport to get headers
628639
// to clone on the DERP client.
629640
headerTransport.Transport = transport
630-
client.HTTPClient = &http.Client{
641+
return &http.Client{
631642
Transport: headerTransport,
632-
}
633-
client.URL = serverURL
634-
return nil
643+
}, nil
635644
}
636645

637646
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
647+
httpClient, err := r.createHTTPClient(ctx, serverURL, inv)
648+
if err != nil {
649+
return nil, err
650+
}
651+
client := codersdk.NewClientBuilder(serverURL).HTTPClient(httpClient)
652+
return client.Build(), nil
641653
}
642654

643655
type AgentAuth struct {

cli/vscodessh.go

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -79,15 +79,18 @@ 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
}
9087

88+
// Use ClientBuilder to construct the client
89+
client := codersdk.NewClientBuilder(serverURL).
90+
SessionToken(string(sessionToken)).
91+
HTTPClient(httpClient).
92+
Build()
93+
9194
parts := strings.Split(inv.Args[0], "--")
9295
if len(parts) < 3 {
9396
return xerrors.Errorf("invalid argument format. must be: coder-vscode--<owner>--<name>--<agent?>")

0 commit comments

Comments
 (0)