<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Jul 24, 2017, at 11:42 AM, Valentin V. Bartenev <<a href="mailto:vbart@nginx.com" class="">vbart@nginx.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">On Thursday 22 June 2017 18:23:46 Vlad Krasnov via nginx-devel wrote:</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><blockquote type="cite" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;" class=""># HG changeset patch<br class=""># User Vlad Krasnov <<a href="mailto:vlad@cloudflare.com" class="">vlad@cloudflare.com</a>><br class=""># Date 1498167669 25200<br class="">#      Thu Jun 22 14:41:09 2017 -0700<br class=""># Node ID 895cea03ac21fb18d2c2ba32389cd67dc74ddbd0<br class=""># Parent  a39bc74873faf9e5bea616561b43f6ecc55229f9<br class="">HTTP/2: add support for HPACK encoding<br class=""><br class="">Add support for full HPACK encoding as per RFC7541.<br class="">This modification improves header compression ratio by 5-10% for the first<br class="">response, and by 40-95% for consequential responses on the connection.<br class="">The implementation is similar to the one used by Cloudflare.<br class=""><br class=""></blockquote><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">First of all, there's no way for a patch to be committed with so</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">many style issues.</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">Please, examine how existing nginx sources are formatted and mimic</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">this style.</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""></div></blockquote><div><br class=""></div>OK.</div><div><br class=""><blockquote type="cite" class=""><div class=""><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><blockquote type="cite" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;" class="">diff -r a39bc74873fa -r 895cea03ac21 auto/modules<br class="">--- a/auto/modules<span class="Apple-tab-span" style="white-space: pre;">     </span>Mon Jun 19 14:25:42 2017 +0300<br class="">+++ b/auto/modules<span class="Apple-tab-span" style="white-space: pre;">     </span>Thu Jun 22 14:41:09 2017 -0700<br class="">@@ -436,6 +436,10 @@<br class="">        . auto/module<br class="">    fi<br class=""><br class="">+    if [ $HTTP_V2_HPACK_ENC = YES ]; then<br class="">+        have=NGX_HTTP_V2_HPACK_ENC . auto/have<br class="">+    fi<br class="">+<br class="">    if :; then<br class="">        ngx_module_name=ngx_http_static_module<br class="">        ngx_module_incs=<br class="">diff -r a39bc74873fa -r 895cea03ac21 auto/options<br class="">--- a/auto/options<span class="Apple-tab-span" style="white-space: pre;">   </span>Mon Jun 19 14:25:42 2017 +0300<br class="">+++ b/auto/options<span class="Apple-tab-span" style="white-space: pre;">     </span>Thu Jun 22 14:41:09 2017 -0700<br class="">@@ -59,6 +59,7 @@<br class="">HTTP_GZIP=YES<br class="">HTTP_SSL=NO<br class="">HTTP_V2=NO<br class="">+HTTP_V2_HPACK_ENC=NO<br class="">HTTP_SSI=YES<br class="">HTTP_POSTPONE=NO<br class="">HTTP_REALIP=NO<br class="">@@ -221,6 +222,7 @@<br class=""><br class="">        --with-http_ssl_module)          HTTP_SSL=YES               ;;<br class="">        --with-http_v2_module)           HTTP_V2=YES                ;;<br class="">+        --with-http_v2_hpack_enc)        HTTP_V2_HPACK_ENC=YES      ;;<br class=""></blockquote><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">What's the reason for conditional compilation?</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""></div></blockquote><div><br class=""></div><div>Internal reasons, but I decided to keep it in the patch, because maybe not everyone wants that overhead.</div><br class=""><blockquote type="cite" class=""><div class=""><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><blockquote type="cite" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;" class="">        --with-http_realip_module)       HTTP_REALIP=YES            ;;<br class="">        --with-http_addition_module)     HTTP_ADDITION=YES          ;;<br class="">        --with-http_xslt_module)         HTTP_XSLT=YES              ;;<br class="">@@ -430,6 +432,7 @@<br class=""><br class="">  --with-http_ssl_module             enable ngx_http_ssl_module<br class="">  --with-http_v2_module              enable ngx_http_v2_module<br class="">+  --with-http_v2_hpack_enc           enable ngx_http_v2_hpack_enc<br class="">  --with-http_realip_module          enable ngx_http_realip_module<br class="">  --with-http_addition_module        enable ngx_http_addition_module<br class="">  --with-http_xslt_module            enable ngx_http_xslt_module<br class="">diff -r a39bc74873fa -r 895cea03ac21 src/core/ngx_murmurhash.c<br class="">--- a/src/core/ngx_murmurhash.c<span class="Apple-tab-span" style="white-space: pre;">  </span>Mon Jun 19 14:25:42 2017 +0300<br class="">+++ b/src/core/ngx_murmurhash.c<span class="Apple-tab-span" style="white-space: pre;">        </span>Thu Jun 22 14:41:09 2017 -0700<br class="">@@ -50,3 +50,63 @@<br class=""><br class="">    return h;<br class="">}<br class="">+<br class="">+<br class="">+uint64_t<br class="">+ngx_murmur_hash2_64(u_char *data, size_t len, uint64_t seed)<br class="">+{<br class="">+    uint64_t  h, k;<br class="">+<br class="">+    h = seed ^ len;<br class="">+<br class="">+    while (len >= 8) {<br class="">+        k  = data[0];<br class="">+        k |= data[1] << 8;<br class="">+        k |= data[2] << 16;<br class="">+        k |= data[3] << 24;<br class="">+        k |= (uint64_t)data[4] << 32;<br class="">+        k |= (uint64_t)data[5] << 40;<br class="">+        k |= (uint64_t)data[6] << 48;<br class="">+        k |= (uint64_t)data[7] << 56;<br class="">+<br class="">+        k *= 0xc6a4a7935bd1e995ull;<br class="">+        k ^= k >> 47;<br class="">+        k *= 0xc6a4a7935bd1e995ull;<br class="">+<br class="">+        h ^= k;<br class="">+        h *= 0xc6a4a7935bd1e995ull;<br class="">+<br class="">+        data += 8;<br class="">+        len -= 8;<br class="">+    }<br class="">+<br class="">+    switch (len) {<br class="">+    case 7:<br class="">+        h ^= (uint64_t)data[6] << 48;<br class="">+        /* fall through */<br class="">+    case 6:<br class="">+        h ^= (uint64_t)data[5] << 40;<br class="">+        /* fall through */<br class="">+    case 5:<br class="">+        h ^= (uint64_t)data[4] << 32;<br class="">+        /* fall through */<br class="">+    case 4:<br class="">+        h ^= data[3] << 24;<br class="">+        /* fall through */<br class="">+    case 3:<br class="">+        h ^= data[2] << 16;<br class="">+        /* fall through */<br class="">+    case 2:<br class="">+        h ^= data[1] << 8;<br class="">+        /* fall through */<br class="">+    case 1:<br class="">+        h ^= data[0];<br class="">+        h *= 0xc6a4a7935bd1e995ull;<br class="">+    }<br class="">+<br class="">+    h ^= h >> 47;<br class="">+    h *= 0xc6a4a7935bd1e995ull;<br class="">+    h ^= h >> 47;<br class="">+<br class="">+    return h;<br class="">+}<br class="">diff -r a39bc74873fa -r 895cea03ac21 src/core/ngx_murmurhash.h<br class="">--- a/src/core/ngx_murmurhash.h<span class="Apple-tab-span" style="white-space: pre;">     </span>Mon Jun 19 14:25:42 2017 +0300<br class="">+++ b/src/core/ngx_murmurhash.h<span class="Apple-tab-span" style="white-space: pre;">        </span>Thu Jun 22 14:41:09 2017 -0700<br class="">@@ -15,5 +15,7 @@<br class=""><br class="">uint32_t ngx_murmur_hash2(u_char *data, size_t len);<br class=""><br class="">+uint64_t ngx_murmur_hash2_64(u_char *data, size_t len, uint64_t seed);<br class="">+<br class=""><br class="">#endif /* _NGX_MURMURHASH_H_INCLUDED_ */<br class="">diff -r a39bc74873fa -r 895cea03ac21 src/http/v2/ngx_http_v2.c<br class="">--- a/src/http/v2/ngx_http_v2.c<span class="Apple-tab-span" style="white-space: pre;">        </span>Mon Jun 19 14:25:42 2017 +0300<br class="">+++ b/src/http/v2/ngx_http_v2.c<span class="Apple-tab-span" style="white-space: pre;">        </span>Thu Jun 22 14:41:09 2017 -0700<br class="">@@ -245,6 +245,8 @@<br class=""><br class="">    h2c->frame_size = NGX_HTTP_V2_DEFAULT_FRAME_SIZE;<br class=""><br class="">+    h2c->max_hpack_table_size = NGX_HTTP_V2_DEFAULT_HPACK_TABLE_SIZE;<br class="">+<br class="">    h2scf = ngx_http_get_module_srv_conf(hc->conf_ctx, ngx_http_v2_module);<br class=""><br class="">    h2c->pool = ngx_create_pool(h2scf->pool_size, h2c->connection->log);<br class="">@@ -2018,6 +2020,17 @@<br class="">            h2c->frame_size = value;<br class="">            break;<br class=""><br class="">+        case NGX_HTTP_V2_HEADER_TABLE_SIZE_SETTING:<br class="">+<br class="">+            if (value > NGX_HTTP_V2_MAX_HPACK_TABLE_SIZE) {<br class="">+                h2c->max_hpack_table_size = NGX_HTTP_V2_MAX_HPACK_TABLE_SIZE;<br class="">+            } else {<br class="">+                h2c->max_hpack_table_size = value;<br class="">+            }<br class="">+<br class="">+            h2c->indicate_resize = 1;<br class="">+            break;<br class="">+<br class="">        default:<br class="">            break;<br class="">        }<br class="">diff -r a39bc74873fa -r 895cea03ac21 src/http/v2/ngx_http_v2.h<br class="">--- a/src/http/v2/ngx_http_v2.h<span class="Apple-tab-span" style="white-space: pre;">      </span>Mon Jun 19 14:25:42 2017 +0300<br class="">+++ b/src/http/v2/ngx_http_v2.h<span class="Apple-tab-span" style="white-space: pre;">        </span>Thu Jun 22 14:41:09 2017 -0700<br class="">@@ -49,6 +49,13 @@<br class="">#define NGX_HTTP_V2_MAX_WINDOW           ((1U << 31) - 1)<br class="">#define NGX_HTTP_V2_DEFAULT_WINDOW       65535<br class=""><br class="">+#define HPACK_ENC_HTABLE_SZ              128 /* better to keep a PoT < 64k */<br class="">+#define HPACK_ENC_HTABLE_ENTRIES         ((HPACK_ENC_HTABLE_SZ * 100) / 128)<br class="">+#define HPACK_ENC_DYNAMIC_KEY_TBL_SZ     10  /* 10 is sufficient for most */<br class="">+#define HPACK_ENC_MAX_ENTRY              512 /* longest header size to match */<br class="">+<br class="">+#define NGX_HTTP_V2_DEFAULT_HPACK_TABLE_SIZE     4096<br class="">+#define NGX_HTTP_V2_MAX_HPACK_TABLE_SIZE         16384 /* < 64k */<br class=""><br class="">typedef struct ngx_http_v2_connection_s   ngx_http_v2_connection_t;<br class="">typedef struct ngx_http_v2_node_s         ngx_http_v2_node_t;<br class="">@@ -110,6 +117,46 @@<br class="">} ngx_http_v2_hpack_t;<br class=""><br class=""><br class="">+#if (NGX_HTTP_V2_HPACK_ENC)<br class="">+typedef struct {<br class="">+    uint64_t                         hash_val;<br class="">+    uint32_t                         index;<br class="">+    uint16_t                         pos;<br class="">+    uint16_t                         klen, vlen;<br class="">+    uint16_t                         size;<br class="">+    uint16_t                         next;<br class="">+} ngx_http_v2_hpack_enc_entry_t;<br class="">+<br class="">+<br class="">+typedef struct {<br class="">+    uint64_t                         hash_val;<br class="">+    uint32_t                         index;<br class="">+    uint16_t                         pos;<br class="">+    uint16_t                         klen;<br class="">+} ngx_http_v2_hpack_name_entry_t;<br class="">+<br class="">+<br class="">+typedef struct {<br class="">+    size_t                           size;    /* size as defined in RFC 7541 */<br class="">+    uint32_t                         top;     /* the last entry */<br class="">+    uint32_t                         pos;<br class="">+    uint16_t                         n_elems; /* number of elements */<br class="">+    uint16_t                         base;    /* index of the oldest entry */<br class="">+    uint16_t                         last;    /* index of the newest entry */<br class="">+<br class="">+    /* hash table for dynamic entries, instead using a generic hash table,<br class="">+       which would be too slow to process a significant amount of headers,<br class="">+       this table is not determenistic, and might ocasionally fail to insert<br class="">+       a value, at the cost of slightly worse compression, but significantly<br class="">+       faster performance */<br class=""></blockquote><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">Have you considered rbtree as an option?</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""></div></blockquote><div><br class=""></div><div>Yeah, I don’t think it would be faster.</div><br class=""><blockquote type="cite" class=""><div class=""><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><blockquote type="cite" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;" class="">+    ngx_http_v2_hpack_enc_entry_t    htable[HPACK_ENC_HTABLE_SZ];<br class="">+    ngx_http_v2_hpack_name_entry_t   heads[HPACK_ENC_DYNAMIC_KEY_TBL_SZ];<br class="">+    u_char                           storage[NGX_HTTP_V2_MAX_HPACK_TABLE_SIZE +<br class="">+                                             HPACK_ENC_MAX_ENTRY];<br class="">+} ngx_http_v2_hpack_enc_t;<br class="">+#endif<br class="">+<br class="">+<br class=""></blockquote><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">Well, it means that even idle connection will consume 18+ KB more</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">memory than before.</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">That doesn't look like a generic solution suitable for most of our users.</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">It should be at least configurable.</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""></div></blockquote><div><br class=""></div><div>I can make it configurable fairly easily, but then it will require an extra allocation.</div><div><br class=""></div><div>Cheers,</div><div>Vlad</div><br class=""><blockquote type="cite" class=""><div class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class=""> wbr, Valentin V. Bartenev</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">_______________________________________________</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">nginx-devel mailing list</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><a href="mailto:nginx-devel@nginx.org" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;" class="">nginx-devel@nginx.org</a><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><a href="http://mailman.nginx.org/mailman/listinfo/nginx-devel" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;" class="">http://mailman.nginx.org/mailman/listinfo/nginx-devel</a></div></blockquote></div><br class=""></body></html>