Skip to content

Commit 3e2ff58

Browse files
authored
httpclient: Don't forward HTTP headers by default (#679)
1 parent 691f934 commit 3e2ff58

File tree

3 files changed

+57
-19
lines changed

3 files changed

+57
-19
lines changed

backend/data_adapter.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ func withHeaderMiddleware(ctx context.Context, headers http.Header) context.Cont
2323
if len(headers) > 0 {
2424
ctx = httpclient.WithContextualMiddleware(ctx,
2525
httpclient.MiddlewareFunc(func(opts httpclient.Options, next http.RoundTripper) http.RoundTripper {
26+
if !opts.ForwardHTTPHeaders {
27+
return next
28+
}
29+
2630
return httpclient.RoundTripperFunc(func(qreq *http.Request) (*http.Response, error) {
2731
// Only set a header if it is not already set.
2832
for k, v := range headers {

backend/data_adapter_test.go

Lines changed: 46 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -64,26 +64,53 @@ func (f *fakeDataHandlerWithOAuth) QueryData(ctx context.Context, req *QueryData
6464
func TestQueryData(t *testing.T) {
6565
handler := newFakeDataHandlerWithOAuth()
6666
adapter := newDataSDKAdapter(handler)
67-
ctx := context.Background()
68-
_, err := adapter.QueryData(ctx, &pluginv2.QueryDataRequest{
69-
Headers: map[string]string{
70-
"Authorization": "Bearer 123",
71-
},
72-
PluginContext: &pluginv2.PluginContext{},
67+
68+
t.Run("When forward HTTP headers enabled should forward headers", func(t *testing.T) {
69+
ctx := context.Background()
70+
_, err := adapter.QueryData(ctx, &pluginv2.QueryDataRequest{
71+
Headers: map[string]string{
72+
"Authorization": "Bearer 123",
73+
},
74+
PluginContext: &pluginv2.PluginContext{},
75+
})
76+
require.NoError(t, err)
77+
78+
middlewares := httpclient.ContextualMiddlewareFromContext(handler.lastReq.Context())
79+
require.Len(t, middlewares, 1)
80+
81+
reqClone := handler.lastReq.Clone(handler.lastReq.Context())
82+
// clean up headers to be sure they are injected
83+
reqClone.Header = http.Header{}
84+
85+
res, err := middlewares[0].CreateMiddleware(httpclient.Options{ForwardHTTPHeaders: true}, finalRoundTripper).RoundTrip(reqClone)
86+
require.NoError(t, err)
87+
require.NoError(t, res.Body.Close())
88+
require.Len(t, reqClone.Header, 1)
89+
require.Equal(t, "Bearer 123", reqClone.Header.Get("Authorization"))
90+
})
91+
92+
t.Run("When forward HTTP headers disable should not forward headers", func(t *testing.T) {
93+
ctx := context.Background()
94+
_, err := adapter.QueryData(ctx, &pluginv2.QueryDataRequest{
95+
Headers: map[string]string{
96+
"Authorization": "Bearer 123",
97+
},
98+
PluginContext: &pluginv2.PluginContext{},
99+
})
100+
require.NoError(t, err)
101+
102+
middlewares := httpclient.ContextualMiddlewareFromContext(handler.lastReq.Context())
103+
require.Len(t, middlewares, 1)
104+
105+
reqClone := handler.lastReq.Clone(handler.lastReq.Context())
106+
// clean up headers to be sure they are injected
107+
reqClone.Header = http.Header{}
108+
109+
res, err := middlewares[0].CreateMiddleware(httpclient.Options{ForwardHTTPHeaders: false}, finalRoundTripper).RoundTrip(reqClone)
110+
require.NoError(t, err)
111+
require.NoError(t, res.Body.Close())
112+
require.Empty(t, reqClone.Header)
73113
})
74-
require.NoError(t, err)
75-
76-
middlewares := httpclient.ContextualMiddlewareFromContext(handler.lastReq.Context())
77-
require.Len(t, middlewares, 1)
78-
79-
reqClone := handler.lastReq.Clone(handler.lastReq.Context())
80-
// clean up headers to be sure they are injected
81-
reqClone.Header = http.Header{}
82-
res, err := middlewares[0].CreateMiddleware(httpclient.Options{}, finalRoundTripper).RoundTrip(reqClone)
83-
require.NoError(t, err)
84-
require.NoError(t, res.Body.Close())
85-
require.Len(t, reqClone.Header, 1)
86-
require.Equal(t, "Bearer 123", reqClone.Header.Get("Authorization"))
87114
}
88115

89116
var finalRoundTripper = httpclient.RoundTripperFunc(func(req *http.Request) (*http.Response, error) {

backend/httpclient/options.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,13 @@ type Options struct {
6262
// ConfigureTLSConfig optionally provide a ConfigureTLSConfigFunc
6363
// to modify the created http.Client.
6464
ConfigureTLSConfig ConfigureTLSConfigFunc
65+
66+
// ForwardHTTPHeaders enable forwarding of all HTTP headers
67+
// included in backend.QueryDataRequest, backend.CallResourceRequest,
68+
// backend.CheckHealthRequest, e.g. based on if Allowed cookies or
69+
// Forward OAuth Identity is configured for the datasource or any
70+
// other forwarded HTTP header from Grafana.
71+
ForwardHTTPHeaders bool
6572
}
6673

6774
// BasicAuthOptions basic authentication options.

0 commit comments

Comments
 (0)