From fd0abe46dd7d057e9553d51a939227c6bafeefa1 Mon Sep 17 00:00:00 2001 From: Dmitri Rubinstein Date: Tue, 14 Aug 2018 13:39:48 +0200 Subject: [PATCH] Propagate Host header from gateway request to the function. Host HTTP header was not propagated to the function because it is not a part of http.Request.Header map. Signed-off-by: Dmitri Rubinstein --- gateway/handlers/forwarding_proxy.go | 3 ++ gateway/handlers/forwarding_proxy_test.go | 34 +++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/gateway/handlers/forwarding_proxy.go b/gateway/handlers/forwarding_proxy.go index 757b2ce4..3ec96b90 100644 --- a/gateway/handlers/forwarding_proxy.go +++ b/gateway/handlers/forwarding_proxy.go @@ -53,6 +53,9 @@ func buildUpstreamRequest(r *http.Request, url string) *http.Request { } 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} diff --git a/gateway/handlers/forwarding_proxy_test.go b/gateway/handlers/forwarding_proxy_test.go index aaef9b96..4c314cfd 100644 --- a/gateway/handlers/forwarding_proxy_test.go +++ b/gateway/handlers/forwarding_proxy_test.go @@ -68,6 +68,40 @@ func Test_buildUpstreamRequest_NoBody_GetMethod_NoQuery(t *testing.T) { } +func Test_buildUpstreamRequest_HasHostHeaderWhenSet(t *testing.T) { + srcBytes := []byte("hello world") + + reader := bytes.NewReader(srcBytes) + request, err := http.NewRequest(http.MethodPost, "http://gateway/function?code=1", reader) + + if err != nil { + t.Fatal(err) + } + + upstream := buildUpstreamRequest(request, "/") + + if request.Host != upstream.Host { + t.Errorf("Host - want: %s, got: %s", request.Host, upstream.Host) + } +} + +func Test_buildUpstreamRequest_HostHeader_Empty_WhenNotSet(t *testing.T) { + srcBytes := []byte("hello world") + + reader := bytes.NewReader(srcBytes) + request, err := http.NewRequest(http.MethodPost, "/function", reader) + + if err != nil { + t.Fatal(err) + } + + upstream := buildUpstreamRequest(request, "/") + + if request.Host != upstream.Host { + t.Errorf("Host - want: %s, got: %s", request.Host, upstream.Host) + } +} + func Test_getServiceName(t *testing.T) { scenarios := []struct { name string