Upstream: fixed store/cache of unfinished responses.

In case of upstream eof, only responses with u->pipe->length == -1
are now cached/stored.  This ensures that unfinished chunked responses
are not cached.

Note well - previously used checks for u->headers_in.content_length_n are
preserved.  This provides an additional level of protection if protol data
disagree with Content-Length header provided (e.g., a FastCGI response
is sent with wrong Content-Length, or an incomple SCGI or uwsgi response),
as well as protects from storing of responses to HEAD requests.  This should
be reconsidered if we'll consider caching of responses to HEAD requests.
This commit is contained in:
Maxim Dounin 2013-07-25 14:56:59 +04:00
parent eafe44ff79
commit 187f3948ed

View File

@ -2985,6 +2985,7 @@ ngx_http_upstream_process_request(ngx_http_request_t *r)
tf = p->temp_file;
if (u->headers_in.status_n == NGX_HTTP_OK
&& (p->upstream_done || p->length == -1)
&& (u->headers_in.content_length_n == -1
|| u->headers_in.content_length_n == tf->offset))
{
@ -3005,9 +3006,10 @@ ngx_http_upstream_process_request(ngx_http_request_t *r)
tf = p->temp_file;
if (u->headers_in.content_length_n == -1
|| u->headers_in.content_length_n
== tf->offset - (off_t) r->cache->body_start)
if (p->length == -1
&& (u->headers_in.content_length_n == -1
|| u->headers_in.content_length_n
== tf->offset - (off_t) r->cache->body_start))
{
ngx_http_file_cache_update(r, tf);