From: Willy Tarreau Date: Wed, 5 Aug 2015 12:12:31 +0000 (+0200) Subject: MINOR: config: add new setting "http-reuse" X-Git-Tag: v1.6-dev4~111 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d8fecee291b9d5c9884bd1a4639dd1d0cdd56f1c;p=thirdparty%2Fhaproxy.git MINOR: config: add new setting "http-reuse" For now it only supports "never", meaning that we never want to reuse a shared connection, and "always", meaning that we can use any connection that was not marked private. When "never" is set, this also implies that no idle connection may become a shared one. --- diff --git a/include/types/proxy.h b/include/types/proxy.h index 0ce3ea9f7a..37c2cb5a86 100644 --- a/include/types/proxy.h +++ b/include/types/proxy.h @@ -76,7 +76,15 @@ enum pr_mode { /* bits for proxy->options */ #define PR_O_REDISP 0x00000001 /* allow reconnection to dispatch in case of errors */ #define PR_O_TRANSP 0x00000002 /* transparent mode : use original DEST as dispatch */ -/* unused: 0x04, 0x08, 0x10 */ + +/* HTTP server-side reuse */ +#define PR_O_REUSE_NEVR 0x00000000 /* never reuse a shared connection */ +#define PR_O_REUSE_SAFE 0x00000004 /* only reuse a shared connection when it's safe to do so */ +#define PR_O_REUSE_AGGR 0x00000008 /* aggressively reuse a shared connection */ +#define PR_O_REUSE_ALWS 0x0000000C /* always reuse a shared connection */ +#define PR_O_REUSE_MASK 0x0000000C /* mask to retrieve shared connection preferences */ + +/* unused: 0x10 */ #define PR_O_PREF_LAST 0x00000020 /* prefer last server */ #define PR_O_DISPATCH 0x00000040 /* use dispatch mode */ #define PR_O_FORCED_ID 0x00000080 /* proxy's ID was forced in the configuration */ diff --git a/src/cfgparse.c b/src/cfgparse.c index fb9d45b059..9a2316fc0c 100644 --- a/src/cfgparse.c +++ b/src/cfgparse.c @@ -5024,6 +5024,30 @@ stats_error_parsing: if (alertif_too_many_args_idx(1, 0, file, linenum, args, &err_code)) goto out; } + else if (!strcmp(args[0], "http-reuse")) { + if (warnifnotcap(curproxy, PR_CAP_BE, file, linenum, args[0], NULL)) + err_code |= ERR_WARN; + + if (strcmp(args[1], "never") == 0) { + /* enable a graceful server shutdown on an HTTP 404 response */ + curproxy->options &= ~PR_O_REUSE_MASK; + curproxy->options |= PR_O_REUSE_NEVR; + if (alertif_too_many_args_idx(0, 1, file, linenum, args, &err_code)) + goto out; + } + else if (strcmp(args[1], "always") == 0) { + /* enable a graceful server shutdown on an HTTP 404 response */ + curproxy->options &= ~PR_O_REUSE_MASK; + curproxy->options |= PR_O_REUSE_ALWS; + if (alertif_too_many_args_idx(0, 1, file, linenum, args, &err_code)) + goto out; + } + else { + Alert("parsing [%s:%d] : '%s' only supports 'never', 'always'.\n", file, linenum, args[0]); + err_code |= ERR_ALERT | ERR_FATAL; + goto out; + } + } else if (!strcmp(args[0], "http-check")) { if (warnifnotcap(curproxy, PR_CAP_BE, file, linenum, args[0], NULL)) err_code |= ERR_WARN;