@@ -30,16 +30,17 @@ var _ = Describe("HTTP Upstream Suite", func() {
30 falsum := false
30 falsum := false
32 type httpUpstreamTableInput struct {
32 type httpUpstreamTableInput struct {
33− id string
33+ id string
34− serverAddr *string
34+ serverAddr *string
35− target string
35+ target string
36− method string
36+ method string
37− body []byte
37+ body []byte
38+ passUpstreamHostHeader bool
38− signatureData *options.SignatureData
39+ signatureData *options.SignatureData
39− existingHeaders map[string]string
40+ existingHeaders map[string]string
40− expectedResponse testHTTPResponse
41+ expectedResponse testHTTPResponse
41− expectedUpstream string
42+ expectedUpstream string
42− errorHandler ProxyErrorHandler
43+ errorHandler ProxyErrorHandler
45 DescribeTable("HTTP Upstream ServeHTTP",
46 DescribeTable("HTTP Upstream ServeHTTP",
@@ -52,6 +53,9 @@ var _ = Describe("HTTP Upstream Suite", func() {
52 for key, value := range in.existingHeaders {
53 for key, value := range in.existingHeaders {
53 req.Header.Add(key, value)
54 req.Header.Add(key, value)
56+ if host := req.Header.Get("Host"); host != "" {
56 req = middlewareapi.AddRequestScope(req, &middlewareapi.RequestScope{})
60 req = middlewareapi.AddRequestScope(req, &middlewareapi.RequestScope{})
57 rw := httptest.NewRecorder()
61 rw := httptest.NewRecorder()
@@ -60,7 +64,7 @@ var _ = Describe("HTTP Upstream Suite", func() {
61 upstream := options.Upstream{
65 upstream := options.Upstream{
62 ID: in.id,
66 ID: in.id,
63− PassHostHeader: &truth,
67+ PassHostHeader: &in.passUpstreamHostHeader,
64 ProxyWebSockets: &falsum,
68 ProxyWebSockets: &falsum,
65 InsecureSkipTLSVerify: false,
69 InsecureSkipTLSVerify: false,
66 FlushInterval: &flush,
70 FlushInterval: &flush,
@@ -140,6 +144,29 @@ var _ = Describe("HTTP Upstream Suite", func() {
141 expectedUpstream: "encodedSlashes",
145 expectedUpstream: "encodedSlashes",
147+ Entry("request a path with an empty query string", &httpUpstreamTableInput{
149+ serverAddr: &serverAddr,
150+ target: "http://example.localhost/foo?",
154+ expectedResponse: testHTTPResponse{
156+ header: map[string][]string{
157+ contentType: {applicationJSON},
159+ request: testHTTPRequest{
161+ URL: "http://example.localhost/foo?",
162+ Header: map[string][]string{},
164+ Host: "example.localhost",
165+ RequestURI: "http://example.localhost/foo?",
168+ expectedUpstream: "default",
143 Entry("when the request has a body", &httpUpstreamTableInput{
170 Entry("when the request has a body", &httpUpstreamTableInput{
144 id: "requestWithBody",
171 id: "requestWithBody",
145 serverAddr: &serverAddr,
172 serverAddr: &serverAddr,
@@ -257,6 +284,33 @@ var _ = Describe("HTTP Upstream Suite", func() {
258 expectedUpstream: "existingHeaders",
285 expectedUpstream: "existingHeaders",
287+ Entry("when passing the existing host header", &httpUpstreamTableInput{
288+ id: "passExistingHostHeader",
289+ serverAddr: &serverAddr,
290+ target: "/existingHostHeader",
294+ passUpstreamHostHeader: true,
295+ existingHeaders: map[string]string{
296+ "Host": "existing-host",
298+ expectedResponse: testHTTPResponse{
300+ header: map[string][]string{
301+ contentType: {applicationJSON},
303+ request: testHTTPRequest{
305+ URL: "/existingHostHeader",
306+ Header: map[string][]string{},
308+ Host: "existing-host",
309+ RequestURI: "/existingHostHeader",
312+ expectedUpstream: "passExistingHostHeader",
262 It("ServeHTTP, when not passing a host header", func() {
316 It("ServeHTTP, when not passing a host header", func() {