From 1f7d8d8ab0485f011fe5e8fad6043644833d1121 Mon Sep 17 00:00:00 2001 From: Pieter Raubenheimer Date: Thu, 10 Mar 2016 14:45:23 +0000 Subject: [PATCH] Add test for UpstreamHost defaults --- middleware/proxy/upstream.go | 74 ++++++++++++++++++------------- middleware/proxy/upstream_test.go | 39 ++++++++++++++++ 2 files changed, 81 insertions(+), 32 deletions(-) diff --git a/middleware/proxy/upstream.go b/middleware/proxy/upstream.go index 35c95f1f..29b3d2d8 100644 --- a/middleware/proxy/upstream.go +++ b/middleware/proxy/upstream.go @@ -67,38 +67,8 @@ func NewStaticUpstreams(c parse.Dispenser) ([]Upstream, error) { upstream.Hosts = make([]*UpstreamHost, len(to)) for i, host := range to { - if !strings.HasPrefix(host, "http") && - !strings.HasPrefix(host, "unix:") { - host = "http://" + host - } - uh := &UpstreamHost{ - Name: host, - Conns: 0, - Fails: 0, - FailTimeout: upstream.FailTimeout, - Unhealthy: false, - ExtraHeaders: upstream.proxyHeaders, - CheckDown: func(upstream *staticUpstream) UpstreamHostDownFunc { - return func(uh *UpstreamHost) bool { - if uh.Unhealthy { - return true - } - if uh.Fails >= upstream.MaxFails && - upstream.MaxFails != 0 { - return true - } - return false - } - }(upstream), - WithoutPathPrefix: upstream.WithoutPathPrefix, - MaxConns: upstream.MaxConns, - } - if baseURL, err := url.Parse(uh.Name); err == nil { - uh.ReverseProxy = NewSingleHostReverseProxy(baseURL, uh.WithoutPathPrefix) - if upstream.insecureSkipVerify { - uh.ReverseProxy.Transport = InsecureTransport - } - } else { + uh, err := upstream.NewHost(host) + if err != nil { return upstreams, err } upstream.Hosts[i] = uh @@ -121,6 +91,46 @@ func (u *staticUpstream) From() string { return u.from } +func (u *staticUpstream) NewHost(host string) (*UpstreamHost, error) { + if !strings.HasPrefix(host, "http") && + !strings.HasPrefix(host, "unix:") { + host = "http://" + host + } + uh := &UpstreamHost{ + Name: host, + Conns: 0, + Fails: 0, + FailTimeout: u.FailTimeout, + Unhealthy: false, + ExtraHeaders: u.proxyHeaders, + CheckDown: func(u *staticUpstream) UpstreamHostDownFunc { + return func(uh *UpstreamHost) bool { + if uh.Unhealthy { + return true + } + if uh.Fails >= u.MaxFails && + u.MaxFails != 0 { + return true + } + return false + } + }(u), + WithoutPathPrefix: u.WithoutPathPrefix, + MaxConns: u.MaxConns, + } + + baseURL, err := url.Parse(uh.Name) + if err != nil { + return nil, err + } + + uh.ReverseProxy = NewSingleHostReverseProxy(baseURL, uh.WithoutPathPrefix) + if u.insecureSkipVerify { + uh.ReverseProxy.Transport = InsecureTransport + } + return uh, nil +} + func parseBlock(c *parse.Dispenser, u *staticUpstream) error { switch c.Val() { case "policy": diff --git a/middleware/proxy/upstream_test.go b/middleware/proxy/upstream_test.go index 32f6df9e..0370b6a4 100644 --- a/middleware/proxy/upstream_test.go +++ b/middleware/proxy/upstream_test.go @@ -5,6 +5,45 @@ import ( "time" ) +func TestNewHost(t *testing.T) { + upstream := &staticUpstream{ + FailTimeout: 10 * time.Second, + MaxConns: 1, + MaxFails: 1, + } + + uh, err := upstream.NewHost("example.com") + if err != nil { + t.Error("Expected no error") + } + if uh.Name != "http://example.com" { + t.Error("Expected default schema to be added to Name.") + } + if uh.FailTimeout != upstream.FailTimeout { + t.Error("Expected default FailTimeout to be set.") + } + if uh.MaxConns != upstream.MaxConns { + t.Error("Expected default MaxConns to be set.") + } + if uh.CheckDown == nil { + t.Error("Expected default CheckDown to be set.") + } + if uh.CheckDown(uh) { + t.Error("Expected new host not to be down.") + } + // mark Unhealthy + uh.Unhealthy = true + if !uh.CheckDown(uh) { + t.Error("Expected unhealthy host to be down.") + } + // mark with Fails + uh.Unhealthy = false + uh.Fails = 1 + if !uh.CheckDown(uh) { + t.Error("Expected failed host to be down.") + } +} + func TestHealthCheck(t *testing.T) { upstream := &staticUpstream{ from: "",