mirror of https://github.com/caddyserver/caddy.git
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:
parent
c97292b255
commit
b2b29dcd49
|
@ -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()
|
||||||
|
|
|
@ -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),
|
||||||
|
|
Loading…
Reference in New Issue