Commit 9b9a77a1 authored by Matthew Holt's avatar Matthew Holt

proxy: Improved error reporting

We now report the actual error message rather than a generic one
parent 9077cce1
...@@ -13,8 +13,6 @@ import ( ...@@ -13,8 +13,6 @@ import (
"github.com/mholt/caddy/caddyhttp/httpserver" "github.com/mholt/caddy/caddyhttp/httpserver"
) )
var errUnreachable = errors.New("unreachable backend")
// Proxy represents a middleware instance that can proxy requests. // Proxy represents a middleware instance that can proxy requests.
type Proxy struct { type Proxy struct {
Next httpserver.Handler Next httpserver.Handler
...@@ -92,10 +90,14 @@ func (p Proxy) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error) { ...@@ -92,10 +90,14 @@ func (p Proxy) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error) {
// since Select() should give us "up" hosts, keep retrying // since Select() should give us "up" hosts, keep retrying
// hosts until timeout (or until we get a nil host). // hosts until timeout (or until we get a nil host).
start := time.Now() start := time.Now()
var backendErr error
for time.Now().Sub(start) < tryDuration { for time.Now().Sub(start) < tryDuration {
host := upstream.Select(r) host := upstream.Select(r)
if host == nil { if host == nil {
return http.StatusBadGateway, errUnreachable if backendErr == nil {
backendErr = errors.New("no hosts available upstream")
}
return http.StatusBadGateway, backendErr
} }
if rr, ok := w.(*httpserver.ResponseRecorder); ok && rr.Replacer != nil { if rr, ok := w.(*httpserver.ResponseRecorder); ok && rr.Replacer != nil {
rr.Replacer.Set("upstream", host.Name) rr.Replacer.Set("upstream", host.Name)
...@@ -141,7 +143,7 @@ func (p Proxy) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error) { ...@@ -141,7 +143,7 @@ func (p Proxy) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error) {
// tell the proxy to serve the request // tell the proxy to serve the request
atomic.AddInt64(&host.Conns, 1) atomic.AddInt64(&host.Conns, 1)
backendErr := proxy.ServeHTTP(w, outreq, downHeaderUpdateFn) backendErr = proxy.ServeHTTP(w, outreq, downHeaderUpdateFn)
atomic.AddInt64(&host.Conns, -1) atomic.AddInt64(&host.Conns, -1)
// if no errors, we're done here; otherwise failover // if no errors, we're done here; otherwise failover
...@@ -159,7 +161,7 @@ func (p Proxy) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error) { ...@@ -159,7 +161,7 @@ func (p Proxy) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error) {
}(host, timeout) }(host, timeout)
} }
return http.StatusBadGateway, errUnreachable return http.StatusBadGateway, backendErr
} }
// match finds the best match for a proxy config based // match finds the best match for a proxy config based
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment