Skip to content

Commit 07ae6ae

Browse files
Add X-Goog-Request-Reason header if environment variable CLOUDSDK_CORE_REQUEST_REASON is set (#4356) (#8220)
* add header transport layer * some changes * set transport to be headertransport * export file for tpgc * update * revert ordering change to parameter initialization... default scopes need to be retained for token initialization on vcr tests Signed-off-by: Modular Magician <[email protected]>
1 parent 0a20c2c commit 07ae6ae

File tree

3 files changed

+44
-4
lines changed

3 files changed

+44
-4
lines changed

.changelog/4356.txt

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:none
2+
3+
```

google/config.go

+6-4
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,7 @@ func (c *Config) LoadAndValidate(ctx context.Context) error {
240240
if err != nil {
241241
return err
242242
}
243+
243244
c.tokenSource = tokenSource
244245

245246
cleanCtx := context.WithValue(ctx, oauth2.HTTPClient, cleanhttp.DefaultClient())
@@ -256,20 +257,21 @@ func (c *Config) LoadAndValidate(ctx context.Context) error {
256257
// See ClientWithAdditionalRetries
257258
retryTransport := NewTransportWithDefaultRetries(loggingTransport)
258259

260+
// 4. Header Transport - outer wrapper to inject additional headers we want to apply
261+
// before making requests
262+
headerTransport := newTransportWithHeaders(retryTransport)
263+
259264
// Set final transport value.
260-
client.Transport = retryTransport
265+
client.Transport = headerTransport
261266

262267
// This timeout is a timeout per HTTP request, not per logical operation.
263268
client.Timeout = c.synchronousTimeout()
264269

265270
c.client = client
266271
c.context = ctx
267-
268272
c.Region = GetRegionFromRegionSelfLink(c.Region)
269-
270273
c.requestBatcherServiceUsage = NewRequestBatcher("Service Usage", ctx, c.BatchingConfig)
271274
c.requestBatcherIam = NewRequestBatcher("IAM", ctx, c.BatchingConfig)
272-
273275
c.PollInterval = 10 * time.Second
274276

275277
return nil

google/header_transport.go

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package google
2+
3+
import (
4+
"net/http"
5+
"os"
6+
)
7+
8+
// adapted from https://stackoverflow.com/questions/51325704/adding-a-default-http-header-in-go
9+
type headerTransportLayer struct {
10+
http.Header
11+
baseTransit http.RoundTripper
12+
}
13+
14+
func newTransportWithHeaders(baseTransit http.RoundTripper) headerTransportLayer {
15+
if baseTransit == nil {
16+
baseTransit = http.DefaultTransport
17+
}
18+
19+
headers := make(http.Header)
20+
if requestReason := os.Getenv("CLOUDSDK_CORE_REQUEST_REASON"); requestReason != "" {
21+
headers.Set("X-Goog-Request-Reason", requestReason)
22+
}
23+
24+
return headerTransportLayer{Header: headers, baseTransit: baseTransit}
25+
}
26+
27+
func (h headerTransportLayer) RoundTrip(req *http.Request) (*http.Response, error) {
28+
for key, value := range h.Header {
29+
// only set headers that are not previously defined
30+
if _, ok := req.Header[key]; !ok {
31+
req.Header[key] = value
32+
}
33+
}
34+
return h.baseTransit.RoundTrip(req)
35+
}

0 commit comments

Comments
 (0)