mirror of
https://github.com/caddyserver/caddy.git
synced 2025-01-27 04:15:55 +03:00
reverseproxy: Set the headers in the replacer before handle_response
(#4165)
Turns out this was an oversight, we assumed we could use `{http.response.header.*}` but that doesn't work because those are grabbed from the response writer, and we haven't copied any headers into the response writer yet. So the fix is to set all the response headers into the replacer at a new namespace before running the handlers. This adds the `{http.reverse_proxy.header.*}` replacer. See https://caddy.community/t/empty-http-response-header-x-accel-redirect/12447
This commit is contained in:
parent
37718560c1
commit
aef8d4decc
1 changed files with 12 additions and 3 deletions
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue