summaryrefslogtreecommitdiff
path: root/modules/caddyhttp/reverseproxy
diff options
context:
space:
mode:
authorMatthew Holt <mholt@users.noreply.github.com>2021-05-19 10:47:06 -0600
committerMatthew Holt <mholt@users.noreply.github.com>2021-05-19 10:47:06 -0600
commitc052162203654d9fcb6f3a40b1c9b376b8e618d1 (patch)
treeed168c63505b98d378d2513b2a235742701d1db9 /modules/caddyhttp/reverseproxy
parent7f26a6b3e507cef98c2d4a74384bacf53bc58f57 (diff)
parentb82db994f39c6991d673a7ae9836f5454b1f9668 (diff)
Merge branch '2.4'
Diffstat (limited to 'modules/caddyhttp/reverseproxy')
-rw-r--r--modules/caddyhttp/reverseproxy/reverseproxy.go15
1 files changed, 12 insertions, 3 deletions
diff --git a/modules/caddyhttp/reverseproxy/reverseproxy.go b/modules/caddyhttp/reverseproxy/reverseproxy.go
index ddb3ca9..671f42a 100644
--- a/modules/caddyhttp/reverseproxy/reverseproxy.go
+++ b/modules/caddyhttp/reverseproxy/reverseproxy.go
@@ -120,9 +120,10 @@ type Handler struct {
// handler chain will not affect the health status of the
// backend.
//
- // Two new placeholders are available in this handler chain:
- // - `{http.reverse_proxy.status_code}` The status code
- // - `{http.reverse_proxy.status_text}` The status text
+ // Three new placeholders are available in this handler chain:
+ // - `{http.reverse_proxy.status_code}` The status code from the response
+ // - `{http.reverse_proxy.status_text}` The status text from the response
+ // - `{http.reverse_proxy.header.*}` The headers from the response
HandleResponse []caddyhttp.ResponseHandler `json:"handle_response,omitempty"`
Transport http.RoundTripper `json:"-"`
@@ -631,9 +632,17 @@ func (h *Handler) reverseProxy(rw http.ResponseWriter, req *http.Request, repl *
if len(rh.Routes) == 0 {
continue
}
+
res.Body.Close()
+
+ // set up the replacer so that parts of the original response can be
+ // used for routing decisions
+ for field, value := range res.Header {
+ repl.Set("http.reverse_proxy.header."+field, strings.Join(value, ","))
+ }
repl.Set("http.reverse_proxy.status_code", res.StatusCode)
repl.Set("http.reverse_proxy.status_text", res.Status)
+
h.logger.Debug("handling response", zap.Int("handler", i))
if routeErr := rh.Routes.Compile(next).ServeHTTP(rw, req); routeErr != nil {
// wrap error in roundtripSucceeded so caller knows that