From bc66d3198597c5731c25cab303d306850e79a346 Mon Sep 17 00:00:00 2001 From: Christopher Faulet Date: Thu, 28 Nov 2024 11:45:51 +0100 Subject: [PATCH] MINOR: proxy: Add support of 421-Misdirected-Request in retry-on status The "421" status can now be specified on retry-on directives. PR_RE_* flags were updated to remains sorted. This patch should fix the issue #2794. It is quite simple so it may safely be backported to 3.1 if necessary. --- doc/configuration.txt | 8 ++++---- include/haproxy/proxy-t.h | 21 +++++++++++---------- include/haproxy/proxy.h | 2 ++ src/proxy.c | 2 ++ 4 files changed, 19 insertions(+), 14 deletions(-) diff --git a/doc/configuration.txt b/doc/configuration.txt index 8a7e591df..1e39eea3f 100644 --- a/doc/configuration.txt +++ b/doc/configuration.txt @@ -11760,10 +11760,10 @@ retry-on [space-delimited list of keywords] any HTTP status code among "401" (Unauthorized), "403" (Forbidden), "404" (Not Found), "408" (Request Timeout), - "425" (Too Early), "429" (Too Many Requests), "500" - (Server Error), "501" (Not Implemented), "502" - (Bad Gateway), "503" (Service Unavailable), "504" - (Gateway Timeout). + "421" (Misdirected Request), "425" (Too Early), + "429" (Too Many Requests), "500" (Server Error), + "501" (Not Implemented), "502" (Bad Gateway), + "503" (Service Unavailable), "504" (Gateway Timeout). all-retryable-errors retry request for any error that are considered diff --git a/include/haproxy/proxy-t.h b/include/haproxy/proxy-t.h index e25e1838b..97215c64e 100644 --- a/include/haproxy/proxy-t.h +++ b/include/haproxy/proxy-t.h @@ -192,17 +192,18 @@ enum PR_SRV_STATE_FILE { #define PR_RE_403 0x00000010 /* Retry if we got a 403 */ #define PR_RE_404 0x00000020 /* Retry if we got a 404 */ #define PR_RE_408 0x00000040 /* Retry if we got a 408 */ -#define PR_RE_425 0x00000080 /* Retry if we got a 425 */ -#define PR_RE_429 0x00000100 /* Retry if we got a 429 */ -#define PR_RE_500 0x00000200 /* Retry if we got a 500 */ -#define PR_RE_501 0x00000400 /* Retry if we got a 501 */ -#define PR_RE_502 0x00000800 /* Retry if we got a 502 */ -#define PR_RE_503 0x00001000 /* Retry if we got a 503 */ -#define PR_RE_504 0x00002000 /* Retry if we got a 504 */ +#define PR_RE_421 0x00000080 /* Retry if we got a 421 */ +#define PR_RE_425 0x00000100 /* Retry if we got a 425 */ +#define PR_RE_429 0x00000200 /* Retry if we got a 429 */ +#define PR_RE_500 0x00000400 /* Retry if we got a 500 */ +#define PR_RE_501 0x00000800 /* Retry if we got a 501 */ +#define PR_RE_502 0x00001000 /* Retry if we got a 502 */ +#define PR_RE_503 0x00002000 /* Retry if we got a 503 */ +#define PR_RE_504 0x00004000 /* Retry if we got a 504 */ #define PR_RE_STATUS_MASK (PR_RE_401 | PR_RE_403 | PR_RE_404 | \ - PR_RE_408 | PR_RE_425 | PR_RE_429 | \ - PR_RE_500 | PR_RE_501 | PR_RE_502 | \ - PR_RE_503 | PR_RE_504) + PR_RE_408 | PR_RE_421 | PR_RE_425 | \ + PR_RE_429 | PR_RE_500 | PR_RE_501 | \ + PR_RE_502 | PR_RE_503 | PR_RE_504) /* 0x00000800, 0x00001000, 0x00002000, 0x00004000 and 0x00008000 unused, * reserved for eventual future status codes */ diff --git a/include/haproxy/proxy.h b/include/haproxy/proxy.h index 0f4636ea2..066ae6d8f 100644 --- a/include/haproxy/proxy.h +++ b/include/haproxy/proxy.h @@ -205,6 +205,8 @@ static inline int l7_status_match(struct proxy *p, int status) return (p->retry_type & PR_RE_404); case 408: return (p->retry_type & PR_RE_408); + case 421: + return (p->retry_type & PR_RE_421); case 425: return (p->retry_type & PR_RE_425); case 429: diff --git a/src/proxy.c b/src/proxy.c index d968e7579..a794771f8 100644 --- a/src/proxy.c +++ b/src/proxy.c @@ -877,6 +877,8 @@ proxy_parse_retry_on(char **args, int section, struct proxy *curpx, curpx->retry_type |= PR_RE_404; else if (strcmp(args[i], "408") == 0) curpx->retry_type |= PR_RE_408; + else if (strcmp(args[i], "421") == 0) + curpx->retry_type |= PR_RE_421; else if (strcmp(args[i], "425") == 0) curpx->retry_type |= PR_RE_425; else if (strcmp(args[i], "429") == 0)