Skip to content

Commit 3058e5a

Browse files
authored
Allow skipping default headers for api clients (#56)
1 parent 0ff23cb commit 3058e5a

File tree

3 files changed

+42
-13
lines changed

3 files changed

+42
-13
lines changed

internal/api/http.go

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,12 @@ func NewHTTPClient(opts *api.ClientOptions) http.Client {
112112
transport = logger.RoundTripper(transport)
113113
}
114114

115+
if opts.Headers == nil {
116+
opts.Headers = map[string]string{}
117+
}
118+
if !opts.SkipDefaultHeaders {
119+
resolveHeaders(opts.Headers)
120+
}
115121
transport = newHeaderRoundTripper(opts.Host, opts.AuthToken, opts.Headers, transport)
116122

117123
return http.Client{Transport: transport, Timeout: opts.Timeout}
@@ -148,10 +154,7 @@ type headerRoundTripper struct {
148154
rt http.RoundTripper
149155
}
150156

151-
func newHeaderRoundTripper(host string, authToken string, headers map[string]string, rt http.RoundTripper) http.RoundTripper {
152-
if headers == nil {
153-
headers = map[string]string{}
154-
}
157+
func resolveHeaders(headers map[string]string) {
155158
if _, ok := headers[contentType]; !ok {
156159
headers[contentType] = jsonContentType
157160
}
@@ -167,11 +170,11 @@ func newHeaderRoundTripper(host string, authToken string, headers map[string]str
167170
}
168171
}
169172
}
170-
if _, ok := headers[authorization]; !ok && authToken != "" {
171-
headers[authorization] = fmt.Sprintf("token %s", authToken)
172-
}
173173
if _, ok := headers[timeZone]; !ok {
174-
headers[timeZone] = currentTimeZone()
174+
tz := currentTimeZone()
175+
if tz != "" {
176+
headers[timeZone] = tz
177+
}
175178
}
176179
if _, ok := headers[accept]; !ok {
177180
// Preview for PullRequest.mergeStateStatus.
@@ -180,6 +183,15 @@ func newHeaderRoundTripper(host string, authToken string, headers map[string]str
180183
a += ", application/vnd.github.nebula-preview"
181184
headers[accept] = a
182185
}
186+
}
187+
188+
func newHeaderRoundTripper(host string, authToken string, headers map[string]string, rt http.RoundTripper) http.RoundTripper {
189+
if _, ok := headers[authorization]; !ok && authToken != "" {
190+
headers[authorization] = fmt.Sprintf("token %s", authToken)
191+
}
192+
if len(headers) == 0 {
193+
return rt
194+
}
183195
return headerRoundTripper{host: host, headers: headers, rt: rt}
184196
}
185197

internal/api/http_test.go

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ func TestNewHTTPClient(t *testing.T) {
3030
log *bytes.Buffer
3131
host string
3232
headers map[string]string
33+
skipHeaders bool
3334
wantHeaders http.Header
3435
}{
3536
{
@@ -94,6 +95,18 @@ func TestNewHTTPClient(t *testing.T) {
9495
host: "TeSt.CoM",
9596
wantHeaders: defaultHeaders(),
9697
},
98+
{
99+
name: "skips default headers",
100+
skipHeaders: true,
101+
wantHeaders: func() http.Header {
102+
h := defaultHeaders()
103+
h.Del(accept)
104+
h.Del(contentType)
105+
h.Del(timeZone)
106+
h.Del(userAgent)
107+
return h
108+
}(),
109+
},
97110
}
98111

99112
for _, tt := range tests {
@@ -102,10 +115,11 @@ func TestNewHTTPClient(t *testing.T) {
102115
tt.host = "test.com"
103116
}
104117
opts := api.ClientOptions{
105-
Host: tt.host,
106-
AuthToken: "oauth_token",
107-
Headers: tt.headers,
108-
Transport: reflectHTTP,
118+
Host: tt.host,
119+
AuthToken: "oauth_token",
120+
Headers: tt.headers,
121+
SkipDefaultHeaders: tt.skipHeaders,
122+
Transport: reflectHTTP,
109123
}
110124
if tt.enableLog {
111125
opts.Log = tt.log

pkg/api/client.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ type ClientOptions struct {
2727
EnableCache bool
2828

2929
// Headers are the headers that will be sent with every API request.
30-
// Default headers set are Accept, Authorization, Content-Type, Time-Zone, and User-Agent.
30+
// Default headers set are Accept, Content-Type, Time-Zone, and User-Agent.
3131
// Default headers will be overridden by keys specified in Headers.
3232
Headers map[string]string
3333

@@ -38,6 +38,9 @@ type ClientOptions struct {
3838
// Default is no logging.
3939
Log io.Writer
4040

41+
// SkipDefaultHeaders disables setting of the default headers.
42+
SkipDefaultHeaders bool
43+
4144
// Timeout specifies a time limit for each API request.
4245
// Default is no timeout.
4346
Timeout time.Duration

0 commit comments

Comments
 (0)