0
Fork 0
mirror of https://github.com/caddyserver/caddy.git synced 2024-12-23 22:27:38 -05:00

proxy: Improved error reporting

We now report the actual error message rather than a generic one
This commit is contained in:
Matthew Holt 2016-09-24 14:22:13 -06:00
parent 9077cce126
commit 9b9a77a160
No known key found for this signature in database
GPG key ID: 0D97CC73664F4D03

View file

@ -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) {
// 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) {
// 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) {
}(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