Skip to content

Commit 4d1003e

Browse files
authored
fix: remove initial global HTTP client usage (coder#20128)
This PR makes the initial steps at removing usage of the global Go HTTP client, which was seen to have impacts on test flakiness in coder/internal#1020. The first commit removes uses from tests, with the exception of one test that is tightly coupled to the default client. The second commit makes easy/low-risk removals from application code. This should have some impact to reduce test flakiness.
1 parent 0d2ccac commit 4d1003e

File tree

18 files changed

+59
-33
lines changed

18 files changed

+59
-33
lines changed

agent/agent_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2027,7 +2027,8 @@ func runSubAgentMain() int {
20272027
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
20282028
defer cancel()
20292029
req = req.WithContext(ctx)
2030-
resp, err := http.DefaultClient.Do(req)
2030+
client := &http.Client{}
2031+
resp, err := client.Do(req)
20312032
if err != nil {
20322033
_, _ = fmt.Fprintf(os.Stderr, "agent connection failed: %v\n", err)
20332034
return 11

agent/apphealth.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ func NewAppHealthReporterWithClock(
6363
// run a ticker for each app health check.
6464
var mu sync.RWMutex
6565
failures := make(map[uuid.UUID]int, 0)
66+
client := &http.Client{}
6667
for _, nextApp := range apps {
6768
if !shouldStartTicker(nextApp) {
6869
continue
@@ -91,7 +92,7 @@ func NewAppHealthReporterWithClock(
9192
if err != nil {
9293
return err
9394
}
94-
res, err := http.DefaultClient.Do(req)
95+
res, err := client.Do(req)
9596
if err != nil {
9697
return err
9798
}

cli/server_test.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1254,8 +1254,9 @@ func TestServer(t *testing.T) {
12541254
t.Logf("error creating request: %s", err.Error())
12551255
return false
12561256
}
1257+
client := &http.Client{}
12571258
// nolint:bodyclose
1258-
res, err := http.DefaultClient.Do(req)
1259+
res, err := client.Do(req)
12591260
if err != nil {
12601261
t.Logf("error hitting prometheus endpoint: %s", err.Error())
12611262
return false
@@ -1316,8 +1317,9 @@ func TestServer(t *testing.T) {
13161317
t.Logf("error creating request: %s", err.Error())
13171318
return false
13181319
}
1320+
client := &http.Client{}
13191321
// nolint:bodyclose
1320-
res, err := http.DefaultClient.Do(req)
1322+
res, err := client.Do(req)
13211323
if err != nil {
13221324
t.Logf("error hitting prometheus endpoint: %s", err.Error())
13231325
return false

cli/ssh_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1242,7 +1242,8 @@ func TestSSH(t *testing.T) {
12421242
// true exits the loop.
12431243
return true
12441244
}
1245-
resp, err := http.DefaultClient.Do(req)
1245+
client := &http.Client{}
1246+
resp, err := client.Do(req)
12461247
if err != nil {
12471248
t.Logf("HTTP GET http://localhost:8222/ %s", err)
12481249
return false

coderd/healthcheck/accessurl_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ func TestAccessURL(t *testing.T) {
5555
defer cancel()
5656

5757
report.Run(ctx, &healthcheck.AccessURLReportOptions{
58-
Client: nil, // defaults to http.DefaultClient
58+
Client: &http.Client{},
5959
AccessURL: nil,
6060
})
6161

coderd/healthcheck/derphealth/derp_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -511,7 +511,8 @@ func tsDERPMap(ctx context.Context, t testing.TB) *tailcfg.DERPMap {
511511
req, err := http.NewRequestWithContext(ctx, "GET", ipn.DefaultControlURL+"/derpmap/default", nil)
512512
require.NoError(t, err)
513513

514-
res, err := http.DefaultClient.Do(req)
514+
client := &http.Client{}
515+
res, err := client.Do(req)
515516
require.NoError(t, err)
516517
defer res.Body.Close()
517518
require.Equal(t, http.StatusOK, res.StatusCode)

coderd/mcp/mcp_e2e_test.go

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,8 @@ func TestMCPHTTP_E2E_UnauthenticatedAccess(t *testing.T) {
141141
require.NoError(t, err, "Should be able to create HTTP request")
142142
req.Header.Set("Content-Type", "application/json")
143143

144-
resp, err := http.DefaultClient.Do(req)
144+
client := &http.Client{}
145+
resp, err := client.Do(req)
145146
require.NoError(t, err, "Should be able to make HTTP request")
146147
defer resp.Body.Close()
147148

@@ -613,7 +614,7 @@ func TestMCPHTTP_E2E_OAuth2_EndToEnd(t *testing.T) {
613614
require.NoError(t, err)
614615
tokenReq.Header.Set("Content-Type", "application/x-www-form-urlencoded")
615616

616-
tokenResp, err := http.DefaultClient.Do(tokenReq)
617+
tokenResp, err := client.Do(tokenReq)
617618
require.NoError(t, err)
618619
defer tokenResp.Body.Close()
619620

@@ -711,7 +712,7 @@ func TestMCPHTTP_E2E_OAuth2_EndToEnd(t *testing.T) {
711712
require.NoError(t, err)
712713
refreshReq.Header.Set("Content-Type", "application/x-www-form-urlencoded")
713714

714-
refreshResp, err := http.DefaultClient.Do(refreshReq)
715+
refreshResp, err := client.Do(refreshReq)
715716
require.NoError(t, err)
716717
defer refreshResp.Body.Close()
717718

@@ -846,7 +847,7 @@ func TestMCPHTTP_E2E_OAuth2_EndToEnd(t *testing.T) {
846847
regReq.Header.Set("Content-Type", "application/json")
847848

848849
// Dynamic client registration should not require authentication (public endpoint)
849-
regResp, err := http.DefaultClient.Do(regReq)
850+
regResp, err := client.Do(regReq)
850851
require.NoError(t, err)
851852
defer regResp.Body.Close()
852853

@@ -936,7 +937,7 @@ func TestMCPHTTP_E2E_OAuth2_EndToEnd(t *testing.T) {
936937
require.NoError(t, err)
937938
tokenReq.Header.Set("Content-Type", "application/x-www-form-urlencoded")
938939

939-
tokenResp, err := http.DefaultClient.Do(tokenReq)
940+
tokenResp, err := client.Do(tokenReq)
940941
require.NoError(t, err)
941942
defer tokenResp.Body.Close()
942943

@@ -1037,7 +1038,7 @@ func TestMCPHTTP_E2E_OAuth2_EndToEnd(t *testing.T) {
10371038
require.NoError(t, err)
10381039
refreshReq.Header.Set("Content-Type", "application/x-www-form-urlencoded")
10391040

1040-
refreshResp, err := http.DefaultClient.Do(refreshReq)
1041+
refreshResp, err := client.Do(refreshReq)
10411042
require.NoError(t, err)
10421043
defer refreshResp.Body.Close()
10431044

@@ -1151,7 +1152,8 @@ func TestMCPHTTP_E2E_OAuth2_EndToEnd(t *testing.T) {
11511152
require.NoError(t, err)
11521153
regReq1.Header.Set("Content-Type", "application/json")
11531154

1154-
regResp1, err := http.DefaultClient.Do(regReq1)
1155+
client := &http.Client{}
1156+
regResp1, err := client.Do(regReq1)
11551157
require.NoError(t, err)
11561158
defer regResp1.Body.Close()
11571159

@@ -1181,7 +1183,7 @@ func TestMCPHTTP_E2E_OAuth2_EndToEnd(t *testing.T) {
11811183
require.NoError(t, err)
11821184
regReq2.Header.Set("Content-Type", "application/json")
11831185

1184-
regResp2, err := http.DefaultClient.Do(regReq2)
1186+
regResp2, err := client.Do(regReq2)
11851187
require.NoError(t, err)
11861188
defer regResp2.Body.Close()
11871189

coderd/oauth2_metadata_test.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ func TestOAuth2AuthorizationServerMetadata(t *testing.T) {
2929
req, err := http.NewRequestWithContext(ctx, http.MethodGet, endpoint, nil)
3030
require.NoError(t, err)
3131

32-
resp, err := http.DefaultClient.Do(req)
32+
httpClient := &http.Client{}
33+
resp, err := httpClient.Do(req)
3334
require.NoError(t, err)
3435
defer resp.Body.Close()
3536

@@ -65,7 +66,8 @@ func TestOAuth2ProtectedResourceMetadata(t *testing.T) {
6566
req, err := http.NewRequestWithContext(ctx, http.MethodGet, endpoint, nil)
6667
require.NoError(t, err)
6768

68-
resp, err := http.DefaultClient.Do(req)
69+
httpClient := &http.Client{}
70+
resp, err := httpClient.Do(req)
6971
require.NoError(t, err)
7072
defer resp.Body.Close()
7173

coderd/promoauth/oauth2_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,8 @@ func TestInstrument(t *testing.T) {
9494
must[*url.URL](t)(idp.IssuerURL().Parse("/.well-known/openid-configuration")).String(), nil)
9595
require.NoError(t, err)
9696

97-
resp, err := http.DefaultClient.Do(req)
97+
client := &http.Client{}
98+
resp, err := client.Do(req)
9899
require.NoError(t, err)
99100
_ = resp.Body.Close()
100101

coderd/telemetry/telemetry.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ func New(options Options) (Reporter, error) {
8787
deploymentURL: deploymentURL,
8888
snapshotURL: snapshotURL,
8989
startedAt: dbtime.Now(),
90+
client: &http.Client{},
9091
}
9192
go reporter.runSnapshotter()
9293
return reporter, nil
@@ -119,6 +120,7 @@ type remoteReporter struct {
119120
snapshotURL *url.URL
120121
startedAt time.Time
121122
shutdownAt *time.Time
123+
client *http.Client
122124
}
123125

124126
func (r *remoteReporter) Enabled() bool {
@@ -142,7 +144,7 @@ func (r *remoteReporter) reportSync(snapshot *Snapshot) {
142144
return
143145
}
144146
req.Header.Set(VersionHeader, buildinfo.Version())
145-
resp, err := http.DefaultClient.Do(req)
147+
resp, err := r.client.Do(req)
146148
if err != nil {
147149
// If the request fails it's not necessarily an error.
148150
// In an airgapped environment, it's fine if this fails!

0 commit comments

Comments
 (0)