reverse_proxy: Upstream.String() method returns either LookupSRV or Dial

Either Dial or LookupSRV will be set, but if we rely on Dial always
being set, we could run into bugs.

Note: Health checks don't support SRV upstreams.
This commit is contained in:
Matthew Holt 2020-03-27 14:29:01 -06:00
parent 397e04ebd9
commit e207240f9a
No known key found for this signature in database
GPG Key ID: 2A349DD577D586A5
2 changed files with 10 additions and 2 deletions

View File

@ -96,6 +96,13 @@ type Upstream struct {
cb CircuitBreaker
}
func (u Upstream) String() string {
if u.LookupSRV != "" {
return u.LookupSRV
}
return u.Dial
}
// Available returns true if the remote host
// is available to receive requests. This is
// the method that should be used by selection

View File

@ -172,7 +172,7 @@ func (h *Handler) Provision(ctx caddy.Context) error {
for _, upstream := range h.Upstreams {
// create or get the host representation for this upstream
var host Host = new(upstreamHost)
existingHost, loaded := hosts.LoadOrStore(upstream.Dial, host)
existingHost, loaded := hosts.LoadOrStore(upstream.String(), host)
if loaded {
host = existingHost.(Host)
}
@ -252,7 +252,7 @@ func (h *Handler) Cleanup() error {
// remove hosts from our config from the pool
for _, upstream := range h.Upstreams {
hosts.Delete(upstream.Dial)
hosts.Delete(upstream.String())
}
return nil
@ -446,6 +446,7 @@ func (h *Handler) reverseProxy(rw http.ResponseWriter, req *http.Request, di Dia
}
h.logger.Debug("upstream roundtrip",
zap.String("upstream", di.Upstream.String()),
zap.Object("request", caddyhttp.LoggableHTTPRequest{Request: req}),
zap.Object("headers", caddyhttp.LoggableHTTPHeader(res.Header)),
zap.Duration("duration", duration),