summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--caddytest/integration/caddyfile_adapt/reverse_proxy_handle_response.txt23
-rw-r--r--modules/caddyhttp/reverseproxy/caddyfile.go33
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: