diff --git a/backend/httpclient/custom_headers_middleware.go b/backend/httpclient/custom_headers_middleware.go index 5c0685e50..e1713691c 100644 --- a/backend/httpclient/custom_headers_middleware.go +++ b/backend/httpclient/custom_headers_middleware.go @@ -18,6 +18,10 @@ func CustomHeadersMiddleware() Middleware { return RoundTripperFunc(func(req *http.Request) (*http.Response, error) { for key, values := range opts.Header { + // Skip empty keys as they are not allowed + if key == "" { + continue + } // According to https://pkg.go.dev/net/http#Request.Header, Host is a special case if http.CanonicalHeaderKey(key) == "Host" { req.Host = values[0] diff --git a/backend/httpclient/custom_headers_middleware_test.go b/backend/httpclient/custom_headers_middleware_test.go index 89d586cac..368247da0 100644 --- a/backend/httpclient/custom_headers_middleware_test.go +++ b/backend/httpclient/custom_headers_middleware_test.go @@ -112,4 +112,29 @@ func TestCustomHeadersMiddleware(t *testing.T) { require.Equal(t, []string{"ValueOne"}, req.Header.Values("X-Headerone")) }) + + t.Run("With empty key should skip adding the header", func(t *testing.T) { + ctx := &testContext{} + finalRoundTripper := ctx.createRoundTripper("final") + customHeaders := CustomHeadersMiddleware() + rt := customHeaders.CreateMiddleware(Options{Header: http.Header{ + "": {"ValueOne"}, + }}, finalRoundTripper) + require.NotNil(t, rt) + middlewareName, ok := customHeaders.(MiddlewareName) + require.True(t, ok) + require.Equal(t, CustomHeadersMiddlewareName, middlewareName.MiddlewareName()) + + req, err := http.NewRequest(http.MethodGet, "http://", nil) + require.NoError(t, err) + res, err := rt.RoundTrip(req) + require.NoError(t, err) + require.NotNil(t, res) + if res.Body != nil { + require.NoError(t, res.Body.Close()) + } + require.Len(t, ctx.callChain, 1) + require.ElementsMatch(t, []string{"final"}, ctx.callChain) + require.Equal(t, 0, len(req.Header)) + }) }