From 3c9256a1bea79a542500c8d07a9fd06fa806a79e Mon Sep 17 00:00:00 2001 From: yaxin Date: Tue, 5 Jan 2021 02:26:18 +0800 Subject: [PATCH] reverseproxy: Caddyfile health check headers, host header support (#3948) * reverse_proxy: 1.health check headers can be set through Caddyfile using health_headers directive; 2.health check header host can be set properly * reverse_proxy: replace example with syntax definition inline health_headers directive parse function * bugfix: change caddyfile_adapt testcase file from space to tab * reverseproxy: modify health_header value document as optional and add more test cases --- .../reverse_proxy_health_headers.txt | 57 +++++++++++++++++++ modules/caddyhttp/reverseproxy/caddyfile.go | 23 ++++++++ .../caddyhttp/reverseproxy/healthchecks.go | 7 ++- 3 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 caddytest/integration/caddyfile_adapt/reverse_proxy_health_headers.txt diff --git a/caddytest/integration/caddyfile_adapt/reverse_proxy_health_headers.txt b/caddytest/integration/caddyfile_adapt/reverse_proxy_health_headers.txt new file mode 100644 index 00000000..a3d842ab --- /dev/null +++ b/caddytest/integration/caddyfile_adapt/reverse_proxy_health_headers.txt @@ -0,0 +1,57 @@ +:8884 + +reverse_proxy 127.0.0.1:65535 { + health_headers { + Host example.com + X-Header-Key 95ca39e3cbe7 + X-Header-Keys VbG4NZwWnipo 335Q9/MhqcNU3s2TO + X-Empty-Value + } +} +---------- +{ + "apps": { + "http": { + "servers": { + "srv0": { + "listen": [ + ":8884" + ], + "routes": [ + { + "handle": [ + { + "handler": "reverse_proxy", + "health_checks": { + "active": { + "headers": { + "Host": [ + "example.com" + ], + "X-Empty-Value": [ + "" + ], + "X-Header-Key": [ + "95ca39e3cbe7" + ], + "X-Header-Keys": [ + "VbG4NZwWnipo", + "335Q9/MhqcNU3s2TO" + ] + } + } + }, + "upstreams": [ + { + "dial": "127.0.0.1:65535" + } + ] + } + ] + } + ] + } + } + } + } +} diff --git a/modules/caddyhttp/reverseproxy/caddyfile.go b/modules/caddyhttp/reverseproxy/caddyfile.go index 4a692874..57f425a4 100644 --- a/modules/caddyhttp/reverseproxy/caddyfile.go +++ b/modules/caddyhttp/reverseproxy/caddyfile.go @@ -63,6 +63,9 @@ func parseCaddyfile(h httpcaddyfile.Helper) (caddyhttp.MiddlewareHandler, error) // health_timeout // health_status // health_body +// health_headers { +// [] +// } // // # passive health checking // max_fails @@ -313,6 +316,26 @@ func (h *Handler) UnmarshalCaddyfile(d *caddyfile.Dispenser) error { } h.HealthChecks.Active.Port = portNum + case "health_headers": + healthHeaders := make(http.Header) + for d.Next() { + for d.NextBlock(0) { + key := d.Val() + values := d.RemainingArgs() + if len(values) == 0 { + values = append(values, "") + } + healthHeaders[key] = values + } + } + if h.HealthChecks == nil { + h.HealthChecks = new(HealthChecks) + } + if h.HealthChecks.Active == nil { + h.HealthChecks.Active = new(ActiveHealthChecks) + } + h.HealthChecks.Active.Headers = healthHeaders + case "health_interval": if !d.NextArg() { return d.ArgErr() diff --git a/modules/caddyhttp/reverseproxy/healthchecks.go b/modules/caddyhttp/reverseproxy/healthchecks.go index 285834b9..42003b64 100644 --- a/modules/caddyhttp/reverseproxy/healthchecks.go +++ b/modules/caddyhttp/reverseproxy/healthchecks.go @@ -26,6 +26,7 @@ import ( "regexp" "runtime/debug" "strconv" + "strings" "time" "github.com/caddyserver/caddy/v2" @@ -241,7 +242,11 @@ func (h *Handler) doActiveHealthCheck(dialInfo DialInfo, hostAddr string, host H return fmt.Errorf("making request: %v", err) } for key, hdrs := range h.HealthChecks.Active.Headers { - req.Header[key] = hdrs + if strings.ToLower(key) == "host" { + req.Host = h.HealthChecks.Active.Headers.Get(key) + } else { + req.Header[key] = hdrs + } } // do the request, being careful to tame the response body