diff options
author | Francis Lavoie <lavofr@gmail.com> | 2022-05-02 13:44:28 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-05-02 11:44:28 -0600 |
commit | 4a223f52038cb77bbf97ca3f3345550dea4e12d8 (patch) | |
tree | da1eb2b18a257fc0bfea86cf45e1ca14fc4f28a6 | |
parent | af7321511c960120d61cfd22e031f43071d5a9c2 (diff) |
reverseproxy: Fix Caddyfile support for `replace_status` (#4754)
-rw-r--r-- | caddytest/integration/caddyfile_adapt/reverse_proxy_handle_response.txt | 23 | ||||
-rw-r--r-- | modules/caddyhttp/reverseproxy/caddyfile.go | 33 |
2 files changed, 37 insertions, 19 deletions
diff --git a/caddytest/integration/caddyfile_adapt/reverse_proxy_handle_response.txt b/caddytest/integration/caddyfile_adapt/reverse_proxy_handle_response.txt index 1b6162d..f6a2609 100644 --- a/caddytest/integration/caddyfile_adapt/reverse_proxy_handle_response.txt +++ b/caddytest/integration/caddyfile_adapt/reverse_proxy_handle_response.txt @@ -1,8 +1,13 @@ :8884 reverse_proxy 127.0.0.1:65535 { - @changeStatus status 500 - replace_status @changeStatus 400 + @500 status 500 + replace_status @500 400 + + @all status 2xx 3xx 4xx 5xx + replace_status @all {http.error.status_code} + + replace_status {http.error.status_code} @accel header X-Accel-Redirect * handle_response @accel { @@ -80,6 +85,17 @@ reverse_proxy 127.0.0.1:65535 { }, { "match": { + "status_code": [ + 2, + 3, + 4, + 5 + ] + }, + "status_code": "{http.error.status_code}" + }, + { + "match": { "headers": { "X-Accel-Redirect": [ "*" @@ -229,6 +245,9 @@ reverse_proxy 127.0.0.1:65535 { ] }, { + "status_code": "{http.error.status_code}" + }, + { "routes": [ { "handle": [ diff --git a/modules/caddyhttp/reverseproxy/caddyfile.go b/modules/caddyhttp/reverseproxy/caddyfile.go index b3f9010..14de230 100644 --- a/modules/caddyhttp/reverseproxy/caddyfile.go +++ b/modules/caddyhttp/reverseproxy/caddyfile.go @@ -627,22 +627,24 @@ func (h *Handler) UnmarshalCaddyfile(d *caddyfile.Dispenser) error { case "replace_status": args := d.RemainingArgs() - if len(args) != 2 { - return d.Errf("must have two arguments: a response matcher and a status code") + if len(args) != 1 && len(args) != 2 { + return d.Errf("must have one or two arguments: an optional response matcher, and a status code") } - if !strings.HasPrefix(args[0], matcherPrefix) { - return d.Errf("must use a named response matcher, starting with '@'") - } - - foundMatcher, ok := h.responseMatchers[args[0]] - if !ok { - return d.Errf("no named response matcher defined with name '%s'", args[0][1:]) - } + responseHandler := caddyhttp.ResponseHandler{} - _, err := strconv.Atoi(args[1]) - if err != nil { - return d.Errf("bad integer value '%s': %v", args[1], err) + if len(args) == 2 { + if !strings.HasPrefix(args[0], matcherPrefix) { + return d.Errf("must use a named response matcher, starting with '@'") + } + foundMatcher, ok := h.responseMatchers[args[0]] + if !ok { + return d.Errf("no named response matcher defined with name '%s'", args[0][1:]) + } + responseHandler.Match = &foundMatcher + responseHandler.StatusCode = caddyhttp.WeakString(args[1]) + } else if len(args) == 1 { + responseHandler.StatusCode = caddyhttp.WeakString(args[0]) } // make sure there's no block, cause it doesn't make sense @@ -652,10 +654,7 @@ func (h *Handler) UnmarshalCaddyfile(d *caddyfile.Dispenser) error { h.HandleResponse = append( h.HandleResponse, - caddyhttp.ResponseHandler{ - Match: &foundMatcher, - StatusCode: caddyhttp.WeakString(args[1]), - }, + responseHandler, ) default: |