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:
parent
d9e52e119d
commit
56b422d2a9
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in New Issue