From 3d44fa813af5d3e259f20205ec3e54a50172fad0 Mon Sep 17 00:00:00 2001 From: Stefan Prodan <stefan.prodan@gmail.com> Date: Sat, 8 Sep 2018 18:39:26 +0300 Subject: [PATCH] Set upstream X-Forwarded Host and For headers if not present - remove http client host override fix #847 - X-Forwarded-For and X-Forwarded-Host are usually handled by the ingress controller, if those headers are not set then the gateway will create them Signed-off-by: Stefan Prodan <stefan.prodan@gmail.com> --- gateway/handlers/forwarding_proxy.go | 13 +++++++++---- gateway/handlers/forwarding_proxy_test.go | 12 ++++++------ 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/gateway/handlers/forwarding_proxy.go b/gateway/handlers/forwarding_proxy.go index 52e0066b..1bc13634 100644 --- a/gateway/handlers/forwarding_proxy.go +++ b/gateway/handlers/forwarding_proxy.go @@ -76,12 +76,15 @@ func buildUpstreamRequest(r *http.Request, baseURL string, requestURL string) *h } upstreamReq, _ := http.NewRequest(r.Method, url, nil) - if len(r.Host) > 0 { - upstreamReq.Host = r.Host - } + copyHeaders(upstreamReq.Header, &r.Header) - upstreamReq.Header["X-Forwarded-For"] = []string{r.RemoteAddr} + if len(r.Host) > 0 && upstreamReq.Header.Get("X-Forwarded-Host") == "" { + upstreamReq.Header["X-Forwarded-Host"] = []string{r.Host} + } + if upstreamReq.Header.Get("X-Forwarded-For") == "" { + upstreamReq.Header["X-Forwarded-For"] = []string{r.RemoteAddr} + } if r.Body != nil { upstreamReq.Body = r.Body @@ -100,6 +103,8 @@ func forwardRequest(w http.ResponseWriter, r *http.Request, proxyClient *http.Cl ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() + log.Printf("Upstream request to: %s, %+v\n", upstreamReq.URL.Path, upstreamReq) + res, resErr := proxyClient.Do(upstreamReq.WithContext(ctx)) if resErr != nil { badStatus := http.StatusBadGateway diff --git a/gateway/handlers/forwarding_proxy_test.go b/gateway/handlers/forwarding_proxy_test.go index a5f2eabd..b87bcbc7 100644 --- a/gateway/handlers/forwarding_proxy_test.go +++ b/gateway/handlers/forwarding_proxy_test.go @@ -72,7 +72,7 @@ func Test_buildUpstreamRequest_NoBody_GetMethod_NoQuery(t *testing.T) { } -func Test_buildUpstreamRequest_HasHostHeaderWhenSet(t *testing.T) { +func Test_buildUpstreamRequest_HasXForwardedHostHeaderWhenSet(t *testing.T) { srcBytes := []byte("hello world") reader := bytes.NewReader(srcBytes) @@ -84,12 +84,12 @@ func Test_buildUpstreamRequest_HasHostHeaderWhenSet(t *testing.T) { upstream := buildUpstreamRequest(request, "/", "/") - if request.Host != upstream.Host { - t.Errorf("Host - want: %s, got: %s", request.Host, upstream.Host) + if request.Host != upstream.Header.Get("X-Forwarded-Host") { + t.Errorf("Host - want: %s, got: %s", request.Host, upstream.Header.Get("X-Forwarded-Host")) } } -func Test_buildUpstreamRequest_HostHeader_Empty_WhenNotSet(t *testing.T) { +func Test_buildUpstreamRequest_XForwardedHostHeader_Empty_WhenNotSet(t *testing.T) { srcBytes := []byte("hello world") reader := bytes.NewReader(srcBytes) @@ -101,8 +101,8 @@ func Test_buildUpstreamRequest_HostHeader_Empty_WhenNotSet(t *testing.T) { upstream := buildUpstreamRequest(request, "/", "/") - if request.Host != upstream.Host { - t.Errorf("Host - want: %s, got: %s", request.Host, upstream.Host) + if request.Host != upstream.Header.Get("X-Forwarded-Host") { + t.Errorf("Host - want: %s, got: %s", request.Host, upstream.Header.Get("X-Forwarded-Host")) } } -- GitLab