reverseproxy: HTTP 504 for upstream timeouts (#4824)

Closes #4823
This commit is contained in:
Matt Holt 2022-06-03 14:13:47 -06:00 committed by GitHub
parent 0a14f97e49
commit 5e729c1e85
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -524,7 +524,7 @@ func (h *Handler) proxyLoopIteration(r *http.Request, origReq *http.Request, w h
// proxy the request to that upstream // proxy the request to that upstream
proxyErr = h.reverseProxy(w, r, origReq, repl, dialInfo, next) proxyErr = h.reverseProxy(w, r, origReq, repl, dialInfo, next)
if proxyErr == nil || proxyErr == context.Canceled { if proxyErr == nil || errors.Is(proxyErr, context.Canceled) {
// context.Canceled happens when the downstream client // context.Canceled happens when the downstream client
// cancels the request, which is not our failure // cancels the request, which is not our failure
return true, nil return true, nil
@ -1180,6 +1180,11 @@ func statusError(err error) error {
// errors proxying usually mean there is a problem with the upstream(s) // errors proxying usually mean there is a problem with the upstream(s)
statusCode := http.StatusBadGateway statusCode := http.StatusBadGateway
// timeout errors have a standard status code (see issue #4823)
if err, ok := err.(net.Error); ok && err.Timeout() {
statusCode = http.StatusGatewayTimeout
}
// if the client canceled the request (usually this means they closed // if the client canceled the request (usually this means they closed
// the connection, so they won't see any response), we can report it // the connection, so they won't see any response), we can report it
// as a client error (4xx) and not a server error (5xx); unfortunately // as a client error (4xx) and not a server error (5xx); unfortunately