diff options
| -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:  | 
