Compare commits

...

9 Commits

Author SHA1 Message Date
ab14-tech
e265d2ee44
Merge cb23087f6dda4f2a0adfbd8ae5fd5b8c4f465ef3 into ca37c0b05f1817e60331d67d77414cbcf50320c9 2025-03-04 02:03:49 +08:00
ab14-tech
cb23087f6d unexported transport works 2025-01-24 12:59:24 -05:00
ab14-tech
d6d9e9e8c8 exported, but not serialized 2025-01-24 12:34:46 -05:00
ab14-tech
01831049a3 fix namespace 2025-01-24 12:26:29 -05:00
ab14-tech
f4bb176184 exclude 2025-01-24 12:24:15 -05:00
ab14-tech
7a805e8d6b transport not exported for active health check 2025-01-24 12:21:28 -05:00
ab14-tech
be406bc4c9 add namespace 2025-01-24 12:19:21 -05:00
ab14-tech
d2762c8405 load module & initialize RoundTripper - barebones 2025-01-24 12:12:14 -05:00
ab14-tech
c92e374cd9 add Transport override option for active health checks 2025-01-23 16:05:17 -05:00

View File

@ -90,6 +90,11 @@ type ActiveHealthChecks struct {
// this value is ignored.
Port int `json:"port,omitempty"`
// Configures the method of transport for the active health checker.
// The default transport is the handler's transport
TransportRaw json.RawMessage `json:"transport,omitempty" caddy:"namespace=http.reverse_proxy.transport inline_key=protocol"`
// HTTP headers to set on health check requests.
Headers http.Header `json:"headers,omitempty"`
@ -128,6 +133,7 @@ type ActiveHealthChecks struct {
// body of a healthy backend.
ExpectBody string `json:"expect_body,omitempty"`
transport http.RoundTripper `json:"-"``
uri *url.URL
httpClient *http.Client
bodyRegexp *regexp.Regexp
@ -175,9 +181,20 @@ func (a *ActiveHealthChecks) Provision(ctx caddy.Context, h *Handler) error {
a.uri = parsedURI
}
// Use handler's transport if no active one set
if a.TransportRaw != nil {
mod, err := ctx.LoadModule(a, "TransportRaw")
if err != nil {
return fmt.Errorf("loading transport: %v", err)
}
a.transport = mod.(http.RoundTripper)
} else {
a.transport = h.Transport
}
a.httpClient = &http.Client{
Timeout: timeout,
Transport: h.Transport,
Transport: a.transport,
CheckRedirect: func(req *http.Request, via []*http.Request) error {
if !a.FollowRedirects {
return http.ErrUseLastResponse
@ -393,12 +410,17 @@ func (h *Handler) doActiveHealthCheck(dialInfo DialInfo, hostAddr string, networ
u.Host = net.JoinHostPort(host, port)
}
// this is kind of a hacky way to know if we should use HTTPS, but whatever
if tt, ok := h.Transport.(TLSTransport); ok && tt.TLSEnabled() {
// this is kind of a hacky way to know if we should use HTTPS
transport := h.HealthChecks.Active.transport
if transport == nil {
transport = h.Transport
}
if tt, ok := transport.(TLSTransport); ok && tt.TLSEnabled() {
u.Scheme = "https"
// if the port is in the except list, flip back to HTTP
if ht, ok := h.Transport.(*HTTPTransport); ok && slices.Contains(ht.TLS.ExceptPorts, port) {
if ht, ok := transport.(*HTTPTransport); ok && slices.Contains(ht.TLS.ExceptPorts, port) {
u.Scheme = "http"
}
}