diff --git a/ingress/origin_proxy.go b/ingress/origin_proxy.go index 08f25a38..ffc3d9cb 100644 --- a/ingress/origin_proxy.go +++ b/ingress/origin_proxy.go @@ -40,6 +40,8 @@ func (o *httpService) RoundTrip(req *http.Request) (*http.Response, error) { if o.hostHeader != "" { // For incoming requests, the Host header is promoted to the Request.Host field and removed from the Header map. + // Pass the original Host header as X-Forwarded-Host. + req.Header.Set("X-Forwarded-Host", req.Host) req.Host = o.hostHeader } return o.transport.RoundTrip(req) diff --git a/ingress/origin_proxy_test.go b/ingress/origin_proxy_test.go index 9be788d0..b14408b8 100644 --- a/ingress/origin_proxy_test.go +++ b/ingress/origin_proxy_test.go @@ -3,6 +3,7 @@ package ingress import ( "context" "fmt" + "io/ioutil" "net" "net/http" "net/http/httptest" @@ -118,7 +119,9 @@ func TestHTTPServiceHostHeaderOverride(t *testing.T) { w.WriteHeader(http.StatusSwitchingProtocols) return } - w.Write([]byte("ok")) + // return the X-Forwarded-Host header for assertions + // as the httptest Server URL isn't available here yet + w.Write([]byte(r.Header.Get("X-Forwarded-Host"))) } origin := httptest.NewServer(http.HandlerFunc(handler)) defer origin.Close() @@ -141,6 +144,10 @@ func TestHTTPServiceHostHeaderOverride(t *testing.T) { require.NoError(t, err) require.Equal(t, http.StatusOK, resp.StatusCode) + respBody, err := ioutil.ReadAll(resp.Body) + require.NoError(t, err) + require.Equal(t, respBody, []byte(originURL.Host)) + } func tcpListenRoutine(listener net.Listener, closeChan chan struct{}) {