<div dir="ltr"># HG changeset patch<br># User Vadim Fedorenko <<a href="mailto:vfedorenko@yandex-team.ru">vfedorenko@yandex-team.ru</a>><br># Date 1516103689 -10800<br>#      Tue Jan 16 14:54:49 2018 +0300<br># Node ID deaa364977488f3390d48306c34dc80961e54e14<br># Parent  fbf6a421212b291cbacfcfc503173c0168449165<br>Fix "header too long" error<br><br>This error occurs in rare cases when cached file with different "Vary"<br>header value have headers length more than main cache file and main<br>cache file can be used without revalidation (ngx_file_cache_exists<br>finds file node and rewrites c->body_start on first read). Fix saves<br>buffer size derived from proxy_buffer parameter.<br><br>diff -r fbf6a421212b -r deaa36497748 src/http/ngx_http_file_cache.c<br>--- a/src/http/ngx_http_file_cache.c    Fri Jan 12 02:27:18 2018 +0300<br>+++ b/src/http/ngx_http_file_cache.c    Tue Jan 16 14:54:49 2018 +0300<br>@@ -271,6 +271,7 @@<br>     ngx_open_file_info_t       of;<br>     ngx_http_file_cache_t     *cache;<br>     ngx_http_core_loc_conf_t  *clcf;<br>+    size_t                     buffer_size;<br> <br>     c = r->cache;<br> <br>@@ -294,6 +295,12 @@<br>         cln->data = c;<br>     }<br> <br>+    /* save buffer_size because ngx_http_file_cache_exists<br>+     * can overwrite c->body_start<br>+     */<br>+    <br>+    buffer_size = c->body_start;<br>+    <br>     rc = ngx_http_file_cache_exists(cache, c);<br> <br>     ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,<br>@@ -382,7 +389,7 @@<br>     c->length = of.size;<br>     c->fs_size = (of.fs_size + cache->bsize - 1) / cache->bsize;<br> <br>-    c->buf = ngx_create_temp_buf(r->pool, c->body_start);<br>+    c->buf = ngx_create_temp_buf(r->pool, buffer_size);<br>     if (c->buf == NULL) {<br>         return NGX_ERROR;<br>     }<br><br></div>