Skip to content

Commit 1480acd

Browse files
spboyerCopilot
andcommitted
chore: replace http.NewRequest with http.NewRequestWithContext
Ensure proper context propagation for cancellation and timeout support in all HTTP requests. The codebase already uses NewRequestWithContext in 30+ places — these are the remaining inconsistencies. Fixes #7087 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 2d19fcf commit 1480acd

File tree

7 files changed

+35
-22
lines changed

7 files changed

+35
-22
lines changed

cli/azd/extensions/azure.ai.agents/internal/project/parser.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ func (p *FoundryParser) SetIdentity(ctx context.Context, args *azdext.ProjectEve
146146

147147
// Get Application ID from Principal ID
148148
fmt.Println("Retrieving Application ID...")
149-
projectClientID, err := getApplicationID(context.Background(), cred, projectPrincipalID)
149+
projectClientID, err := getApplicationID(ctx, cred, projectPrincipalID)
150150
if err != nil {
151151
return fmt.Errorf("failed to get Application ID: %w", err)
152152
}
@@ -484,12 +484,12 @@ func (p *FoundryParser) CoboPostDeploy(ctx context.Context, args *azdext.Project
484484
}
485485

486486
// Register agent with retry logic
487-
agentVersion := registerAgent(uri, token, resourceID, ingressSuffix)
487+
agentVersion := registerAgent(ctx, uri, token, resourceID, ingressSuffix)
488488

489489
// Test authentication and agent
490490
if agentVersion != "" {
491-
testUnauthenticatedAccess(acaEndpoint)
492-
testDataPlane(aiFoundryProjectEndpoint, token, agentName, agentVersion)
491+
testUnauthenticatedAccess(ctx, acaEndpoint)
492+
testDataPlane(ctx, aiFoundryProjectEndpoint, token, agentName, agentVersion)
493493
}
494494

495495
// Print Azure Portal link
@@ -1005,7 +1005,7 @@ func getLatestRevisionName(
10051005
}
10061006

10071007
// registerAgent registers the agent with Microsoft Foundry
1008-
func registerAgent(uri, token, resourceID, ingressSuffix string) string {
1008+
func registerAgent(ctx context.Context, uri, token, resourceID, ingressSuffix string) string {
10091009
fmt.Println()
10101010
fmt.Println("======================================")
10111011
fmt.Println("Registering Agent Version")
@@ -1038,7 +1038,7 @@ func registerAgent(uri, token, resourceID, ingressSuffix string) string {
10381038
}
10391039

10401040
client := &http.Client{}
1041-
req, err := http.NewRequest("POST", uri, bytes.NewBuffer(payloadBytes))
1041+
req, err := http.NewRequestWithContext(ctx, "POST", uri, bytes.NewBuffer(payloadBytes))
10421042
if err != nil {
10431043
fmt.Fprintf(os.Stderr, "Error creating request: %v\n", err)
10441044
continue
@@ -1090,7 +1090,7 @@ func registerAgent(uri, token, resourceID, ingressSuffix string) string {
10901090
}
10911091

10921092
// testUnauthenticatedAccess tests unauthenticated access (should return 401)
1093-
func testUnauthenticatedAccess(acaEndpoint string) {
1093+
func testUnauthenticatedAccess(ctx context.Context, acaEndpoint string) {
10941094
fmt.Println()
10951095
fmt.Println("======================================")
10961096
fmt.Println("Testing Unauthenticated Access")
@@ -1103,7 +1103,7 @@ func testUnauthenticatedAccess(acaEndpoint string) {
11031103
fmt.Printf("Request Body: %s\n", string(payload))
11041104

11051105
client := &http.Client{}
1106-
req, err := http.NewRequest("POST", uri, bytes.NewBuffer(payload))
1106+
req, err := http.NewRequestWithContext(ctx, "POST", uri, bytes.NewBuffer(payload))
11071107
if err != nil {
11081108
fmt.Fprintf(os.Stderr, "Error creating request: %v\n", err)
11091109
return
@@ -1134,7 +1134,7 @@ func testUnauthenticatedAccess(acaEndpoint string) {
11341134
}
11351135

11361136
// testDataPlane tests the agent data plane with authenticated request
1137-
func testDataPlane(endpoint, token, agentName, agentVersion string) {
1137+
func testDataPlane(ctx context.Context, endpoint, token, agentName, agentVersion string) {
11381138
fmt.Println()
11391139
fmt.Println("======================================")
11401140
fmt.Println("Testing Agent Data Plane")
@@ -1158,7 +1158,7 @@ func testDataPlane(endpoint, token, agentName, agentVersion string) {
11581158
fmt.Println(string(payloadBytes))
11591159

11601160
client := &http.Client{}
1161-
req, err := http.NewRequest("POST", uri, bytes.NewBuffer(payloadBytes))
1161+
req, err := http.NewRequestWithContext(ctx, "POST", uri, bytes.NewBuffer(payloadBytes))
11621162
if err != nil {
11631163
fmt.Fprintf(os.Stderr, "Error creating request: %v\n", err)
11641164
return

cli/azd/internal/telemetry/appinsights-exporter/transmitter.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ package appinsightsexporter
88
import (
99
"bytes"
1010
"compress/gzip"
11+
"context"
1112
"encoding/json"
1213
"io"
1314
"net/http"
@@ -16,7 +17,7 @@ import (
1617
)
1718

1819
type Transmitter interface {
19-
Transmit(payload []byte, items TelemetryItems) (*TransmissionResult, error)
20+
Transmit(ctx context.Context, payload []byte, items TelemetryItems) (*TransmissionResult, error)
2021
}
2122

2223
type httpTransmitter struct {
@@ -63,7 +64,11 @@ func NewTransmitter(endpointAddress string, client *http.Client) Transmitter {
6364
return &httpTransmitter{endpointAddress, client}
6465
}
6566

66-
func (transmitter *httpTransmitter) Transmit(payload []byte, items TelemetryItems) (*TransmissionResult, error) {
67+
func (transmitter *httpTransmitter) Transmit(
68+
ctx context.Context,
69+
payload []byte,
70+
items TelemetryItems,
71+
) (*TransmissionResult, error) {
6772
startTime := time.Now()
6873

6974
// Compress the payload
@@ -77,7 +82,7 @@ func (transmitter *httpTransmitter) Transmit(payload []byte, items TelemetryItem
7782

7883
gzipWriter.Close()
7984

80-
req, err := http.NewRequest(http.MethodPost, transmitter.endpoint, &postBody)
85+
req, err := http.NewRequestWithContext(ctx, http.MethodPost, transmitter.endpoint, &postBody)
8186
if err != nil {
8287
return nil, err
8388
}

cli/azd/internal/telemetry/appinsights-exporter/transmitter_test.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ package appinsightsexporter
66
import (
77
"bytes"
88
"compress/gzip"
9+
"context"
910
"fmt"
1011
"io"
1112
"net/http"
@@ -106,7 +107,7 @@ func doBasicTransmit(client Transmitter, server *testServer, t *testing.T) {
106107

107108
server.responseData = []byte(`{"itemsReceived":3, "itemsAccepted":5, "errors":[]}`)
108109
server.responseHeaders["Content-type"] = "application/json"
109-
result, err := client.Transmit([]byte("foobar"), make(TelemetryItems, 0))
110+
result, err := client.Transmit(context.Background(), []byte("foobar"), make(TelemetryItems, 0))
110111
if err != nil {
111112
t.Log(err.Error())
112113
}
@@ -185,7 +186,7 @@ func TestFailedTransmit(t *testing.T) {
185186
`{"itemsReceived":3, "itemsAccepted":0, "errors":[{"index": 2, "statusCode": 500, "message": "Hello"}]}`,
186187
)
187188
server.responseHeaders["Content-type"] = "application/json"
188-
result, err := client.Transmit([]byte("foobar"), make(TelemetryItems, 0))
189+
result, err := client.Transmit(context.Background(), []byte("foobar"), make(TelemetryItems, 0))
189190
server.waitForRequest(t)
190191

191192
if err != nil {
@@ -237,7 +238,7 @@ func TestThrottledTransmit(t *testing.T) {
237238
server.responseData = make([]byte, 0)
238239
server.responseHeaders["Content-type"] = "application/json"
239240
server.responseHeaders["retry-after"] = "Wed, 09 Aug 2017 23:43:57 UTC"
240-
result, err := client.Transmit([]byte("foobar"), make(TelemetryItems, 0))
241+
result, err := client.Transmit(context.Background(), []byte("foobar"), make(TelemetryItems, 0))
241242
server.waitForRequest(t)
242243

243244
if err != nil {

cli/azd/internal/telemetry/uploader.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ func (u *TelemetryUploader) transmit(ctx context.Context, item *StoredItem) {
180180
// When in debug mode, we deserialize to get better error messages
181181
telemetryItems.Deserialize(payload)
182182
}
183-
result, err := u.transmitter.Transmit(payload, telemetryItems)
183+
result, err := u.transmitter.Transmit(ctx, payload, telemetryItems)
184184
if err == nil && result != nil && result.IsSuccess() {
185185
return
186186
}

cli/azd/internal/telemetry/uploader_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ func NewTransmitterStub() *TransmitterStub {
116116
}
117117

118118
func (tr *TransmitterStub) Transmit(
119+
_ context.Context,
119120
payload []byte,
120121
items appinsightsexporter.TelemetryItems,
121122
) (*appinsightsexporter.TransmissionResult, error) {

cli/azd/pkg/llm/github_copilot.go

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,7 @@ func copilotToken(ctx context.Context, console input.Console) (*tokenData, error
258258
}
259259

260260
// Token is missing or expired, get a new one
261-
newToken, err := newCopilotToken(githubToken)
261+
newToken, err := newCopilotToken(ctx, githubToken)
262262
if err != nil {
263263
// If Copilot token request fails, GitHub token might be expired
264264
if strings.Contains(err.Error(), "status 401") || strings.Contains(err.Error(), "status 403") {
@@ -281,7 +281,7 @@ func copilotToken(ctx context.Context, console input.Console) (*tokenData, error
281281
}
282282

283283
// Try getting Copilot token again with new GitHub token
284-
newToken, err = newCopilotToken(githubToken)
284+
newToken, err = newCopilotToken(ctx, githubToken)
285285
if err != nil {
286286
return nil, fmt.Errorf("failed to get Copilot token after re-authentication: %w", err)
287287
}
@@ -383,9 +383,14 @@ func isTokenExpired(expiresAt int64) bool {
383383
}
384384

385385
// newCopilotToken gets a Copilot session token using the GitHub token
386-
func newCopilotToken(githubToken string) (*tokenData, error) {
386+
func newCopilotToken(ctx context.Context, githubToken string) (*tokenData, error) {
387387
client := &http.Client{}
388-
req, err := http.NewRequest("GET", "https://api.github.com/copilot_internal/v2/token", nil)
388+
req, err := http.NewRequestWithContext(
389+
ctx,
390+
"GET",
391+
"https://api.github.com/copilot_internal/v2/token",
392+
nil,
393+
)
389394
if err != nil {
390395
return nil, err
391396
}

cli/azd/tools/avmres/main.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
package main
55

66
import (
7+
"context"
78
"fmt"
89
"io"
910
"net/http"
@@ -190,7 +191,7 @@ func fetchGithub(
190191
repo string,
191192
path string,
192193
tag string) ([]byte, error) {
193-
req, err := http.NewRequest("GET",
194+
req, err := http.NewRequestWithContext(context.Background(), "GET",
194195
fmt.Sprintf("https://api.github.com/repos/%s/contents/%s?ref=%s", repo, path, tag), nil)
195196
if err != nil {
196197
return nil, err

0 commit comments

Comments
 (0)