reverseproxy: Implement health_follow_redirects (#6302)

* added health_follow_redirect in active health checks

* chore: code format

* chore: refactore reversproxy healthcheck redirect variable name and description of the same

* chore: formatting

* changed reverse proxy health check status code range to be between 200-299

* chore: formatting

---------

Co-authored-by: aliasgar <joancena1268@mail.com>
This commit is contained in:
Ali Asgar 2024-05-07 20:10:15 +05:30 committed by GitHub
parent c97292b255
commit b2b29dcd49
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 23 additions and 1 deletions

View file

@ -75,6 +75,7 @@ func parseCaddyfile(h httpcaddyfile.Helper) (caddyhttp.MiddlewareHandler, error)
// health_timeout <duration> // health_timeout <duration>
// health_status <status> // health_status <status>
// health_body <regexp> // health_body <regexp>
// health_follow_redirects
// health_headers { // health_headers {
// <field> [<values...>] // <field> [<values...>]
// } // }
@ -450,6 +451,18 @@ func (h *Handler) UnmarshalCaddyfile(d *caddyfile.Dispenser) error {
} }
h.HealthChecks.Active.ExpectBody = d.Val() h.HealthChecks.Active.ExpectBody = d.Val()
case "health_follow_redirects":
if d.NextArg() {
return d.ArgErr()
}
if h.HealthChecks == nil {
h.HealthChecks = new(HealthChecks)
}
if h.HealthChecks.Active == nil {
h.HealthChecks.Active = new(ActiveHealthChecks)
}
h.HealthChecks.Active.FollowRedirects = true
case "health_passes": case "health_passes":
if !d.NextArg() { if !d.NextArg() {
return d.ArgErr() return d.ArgErr()

View file

@ -82,6 +82,9 @@ type ActiveHealthChecks struct {
// HTTP headers to set on health check requests. // HTTP headers to set on health check requests.
Headers http.Header `json:"headers,omitempty"` Headers http.Header `json:"headers,omitempty"`
// Whether to follow HTTP redirects in response to active health checks (default off).
FollowRedirects bool `json:"follow_redirects,omitempty"`
// How frequently to perform active health checks (default 30s). // How frequently to perform active health checks (default 30s).
Interval caddy.Duration `json:"interval,omitempty"` Interval caddy.Duration `json:"interval,omitempty"`
@ -153,6 +156,12 @@ func (a *ActiveHealthChecks) Provision(ctx caddy.Context, h *Handler) error {
a.httpClient = &http.Client{ a.httpClient = &http.Client{
Timeout: timeout, Timeout: timeout,
Transport: h.Transport, Transport: h.Transport,
CheckRedirect: func(req *http.Request, via []*http.Request) error {
if !a.FollowRedirects {
return http.ErrUseLastResponse
}
return nil
},
} }
for _, upstream := range h.Upstreams { for _, upstream := range h.Upstreams {
@ -453,7 +462,7 @@ func (h *Handler) doActiveHealthCheck(dialInfo DialInfo, hostAddr string, upstre
markUnhealthy() markUnhealthy()
return nil return nil
} }
} else if resp.StatusCode < 200 || resp.StatusCode >= 400 { } else if resp.StatusCode < 200 || resp.StatusCode >= 300 {
h.HealthChecks.Active.logger.Info("status code out of tolerances", h.HealthChecks.Active.logger.Info("status code out of tolerances",
zap.Int("status_code", resp.StatusCode), zap.Int("status_code", resp.StatusCode),
zap.String("host", hostAddr), zap.String("host", hostAddr),