From 05d0b213a9ab09e60b384691aacb5a0feac59e4a Mon Sep 17 00:00:00 2001 From: Makeev Ivan Date: Sat, 17 Nov 2018 00:52:34 +0400 Subject: [PATCH] proxy: HTTP status 499 for 'Context canceled' errors (#2297) * Adding {when_unix_ms} requests placeholder (unix timestamp with a milliseconds precision) * Add an 499 HTTP status code on user's cancel request as NGINX doing (instead of 502 Bad Gateway status with 'Context canceled' message) * 499 HTTP status code was added as constant CustomStatusContextCancelled = 499 --- caddyhttp/proxy/proxy.go | 6 ++++++ caddyhttp/proxy/proxy_test.go | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/caddyhttp/proxy/proxy.go b/caddyhttp/proxy/proxy.go index 5b386020e..aeff1b8f3 100644 --- a/caddyhttp/proxy/proxy.go +++ b/caddyhttp/proxy/proxy.go @@ -262,6 +262,10 @@ func (p Proxy) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error) { return http.StatusRequestEntityTooLarge, backendErr } + if backendErr == context.Canceled { + return CustomStatusContextCancelled, backendErr + } + // failover; remember this failure for some time if // request failure counting is enabled timeout := host.FailTimeout @@ -397,3 +401,5 @@ func mutateHeadersByRules(headers, rules http.Header, repl httpserver.Replacer) } } } + +const CustomStatusContextCancelled = 499 diff --git a/caddyhttp/proxy/proxy_test.go b/caddyhttp/proxy/proxy_test.go index caf2e6c99..1342b2bea 100644 --- a/caddyhttp/proxy/proxy_test.go +++ b/caddyhttp/proxy/proxy_test.go @@ -1369,7 +1369,7 @@ func TestCancelRequest(t *testing.T) { rec := httptest.NewRecorder() status, err := p.ServeHTTP(rec, req) - expectedStatus, expectErr := http.StatusBadGateway, context.Canceled + expectedStatus, expectErr := CustomStatusContextCancelled, context.Canceled if status != expectedStatus || err != expectErr { t.Errorf("expect proxy handle return status[%d] with error[%v], but got status[%d] with error[%v]", expectedStatus, expectErr, status, err)