<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>