From: Willy Tarreau Date: Mon, 28 Sep 2015 11:53:23 +0000 (+0200) Subject: MEDIUM: config: set tune.maxrewrite to 1024 by default X-Git-Tag: v1.6-dev6~27 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=270978492c62550d0fa255698ee99a1bafbfc540;p=thirdparty%2Fhaproxy.git MEDIUM: config: set tune.maxrewrite to 1024 by default The tune.maxrewrite parameter used to be pre-initialized to half of the buffer size since the very early days when buffers were very small. It has grown to absurdly large values over the years to reach 8kB for a 16kB buffer. This prevents large requests from being accepted, which is the opposite of the initial goal. Many users fix it to 1024 which is already quite large for header addition. So let's change the default setting policy : - pre-initialize it to 1024 - let the user tweak it - in any case, limit it to tune.bufsize / 2 This results in 15kB usable to buffer HTTP messages instead of 8kB, and doesn't affect existing configurations which already force it. --- diff --git a/include/common/defaults.h b/include/common/defaults.h index 02962010e7..d1994e83f6 100644 --- a/include/common/defaults.h +++ b/include/common/defaults.h @@ -28,8 +28,8 @@ * when reading HTTP headers, the proxy needs some spare space to add or rewrite * headers if needed. The size of this spare is defined with MAXREWRITE. So it * is not possible to process headers longer than BUFSIZE-MAXREWRITE bytes. By - * default, BUFSIZE=16384 bytes and MAXREWRITE=BUFSIZE/2, so the maximum length - * of headers accepted is 8192 bytes, which is in line with Apache's limits. + * default, BUFSIZE=16384 bytes and MAXREWRITE=min(1024,BUFSIZE/2), so the + * maximum length of headers accepted is 15360 bytes. */ #ifndef BUFSIZE #define BUFSIZE 16384 @@ -51,7 +51,7 @@ // reserved buffer space for header rewriting #ifndef MAXREWRITE -#define MAXREWRITE (BUFSIZE / 2) +#define MAXREWRITE 1024 #endif #ifndef REQURI_LEN diff --git a/src/cfgparse.c b/src/cfgparse.c index f7944c3aa4..d732ac3286 100644 --- a/src/cfgparse.c +++ b/src/cfgparse.c @@ -833,8 +833,6 @@ int cfg_parse_global(const char *file, int linenum, char **args, int kwm) err_code |= ERR_ALERT | ERR_FATAL; goto out; } - if (global.tune.maxrewrite >= global.tune.bufsize / 2) - global.tune.maxrewrite = global.tune.bufsize / 2; chunk_init(&trash, realloc(trash.str, global.tune.bufsize), global.tune.bufsize); alloc_trash_buffers(global.tune.bufsize); } @@ -847,8 +845,11 @@ int cfg_parse_global(const char *file, int linenum, char **args, int kwm) goto out; } global.tune.maxrewrite = atol(args[1]); - if (global.tune.maxrewrite >= global.tune.bufsize / 2) - global.tune.maxrewrite = global.tune.bufsize / 2; + if (global.tune.maxrewrite < 0) { + Alert("parsing [%s:%d] : '%s' expects a positive integer argument.\n", file, linenum, args[0]); + err_code |= ERR_ALERT | ERR_FATAL; + goto out; + } } else if (!strcmp(args[0], "tune.idletimer")) { unsigned int idle; diff --git a/src/haproxy.c b/src/haproxy.c index a20f4977be..bdfa31824e 100644 --- a/src/haproxy.c +++ b/src/haproxy.c @@ -150,7 +150,7 @@ struct global global = { }, .tune = { .bufsize = BUFSIZE, - .maxrewrite = MAXREWRITE, + .maxrewrite = -1, .chksize = BUFSIZE, .reserved_bufs = RESERVED_BUFS, .pattern_cache = DEFAULT_PAT_LRU_SIZE, @@ -1018,6 +1018,9 @@ void init(int argc, char **argv) if (global.tune.recv_enough == 0) global.tune.recv_enough = MIN_RECV_AT_ONCE_ENOUGH; + if (global.tune.maxrewrite < 0) + global.tune.maxrewrite = MAXREWRITE; + if (global.tune.maxrewrite >= global.tune.bufsize / 2) global.tune.maxrewrite = global.tune.bufsize / 2;