From b58872925ad9cd5570ec0c59fab42c3f296834c8 Mon Sep 17 00:00:00 2001 From: Pedro Nasser Date: Thu, 14 Jul 2016 15:43:06 -0300 Subject: [PATCH] fixed transparent host and added test case --- caddyhttp/proxy/upstream.go | 34 +++++++++++++++++++------------- caddyhttp/proxy/upstream_test.go | 4 ++++ 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/caddyhttp/proxy/upstream.go b/caddyhttp/proxy/upstream.go index 228e5d84a..a2f75fa88 100644 --- a/caddyhttp/proxy/upstream.go +++ b/caddyhttp/proxy/upstream.go @@ -26,6 +26,7 @@ type staticUpstream struct { Hosts HostPool Policy Policy insecureSkipVerify bool + transparent bool FailTimeout time.Duration MaxFails int32 @@ -54,6 +55,7 @@ func NewStaticUpstreams(c caddyfile.Dispenser) ([]Upstream, error) { FailTimeout: 10 * time.Second, MaxFails: 1, MaxConns: 0, + transparent: false, } if !c.Args(&upstream.from) { @@ -69,19 +71,6 @@ func NewStaticUpstreams(c caddyfile.Dispenser) ([]Upstream, error) { to = append(to, parsed...) } - if len(to) == 0 { - return upstreams, c.ArgErr() - } - - upstream.Hosts = make([]*UpstreamHost, len(to)) - for i, host := range to { - uh, err := upstream.NewHost(host) - if err != nil { - return upstreams, err - } - upstream.Hosts[i] = uh - } - for c.NextBlock() { switch c.Val() { case "upstream": @@ -100,6 +89,23 @@ func NewStaticUpstreams(c caddyfile.Dispenser) ([]Upstream, error) { } } + if len(to) == 0 { + return upstreams, c.ArgErr() + } + + upstream.Hosts = make([]*UpstreamHost, len(to)) + for i, host := range to { + uh, err := upstream.NewHost(host) + if err != nil { + return upstreams, err + } + upstream.Hosts[i] = uh + } + + if upstream.transparent { + upstream.upstreamHeaders.Add("Host", upstream.Hosts[0].Name) + } + if upstream.HealthCheck.Path != "" { upstream.HealthCheck.Client = http.Client{ Timeout: upstream.HealthCheck.Timeout, @@ -287,7 +293,7 @@ func parseBlock(c *caddyfile.Dispenser, u *staticUpstream) error { } u.downstreamHeaders.Add(header, value) case "transparent": - u.upstreamHeaders.Add("Host", u.Hosts[0].Name) + u.transparent = true u.upstreamHeaders.Add("X-Real-IP", "{remote}") u.upstreamHeaders.Add("X-Forwarded-For", "{remote}") u.upstreamHeaders.Add("X-Forwarded-Proto", "{scheme}") diff --git a/caddyhttp/proxy/upstream_test.go b/caddyhttp/proxy/upstream_test.go index 4fb990f6d..02e2c605e 100644 --- a/caddyhttp/proxy/upstream_test.go +++ b/caddyhttp/proxy/upstream_test.go @@ -213,6 +213,10 @@ func TestParseBlock(t *testing.T) { t.Errorf("Test %d: Could not find the Host header", i+1) } + if v, _ := headers["Host"]; v[0] != upstream.Select().Name { + t.Errorf("Test %d: Host not match first hostname in upstream", i+1) + } + if _, ok := headers["X-Real-Ip"]; !ok { t.Errorf("Test %d: Could not find the X-Real-Ip header", i+1) }