]> git.kaiwu.me - nginx.git/commitdiff
Upstream: fixed store/cache of unfinished responses.
authorMaxim Dounin <mdounin@mdounin.ru>
Thu, 25 Jul 2013 10:56:59 +0000 (14:56 +0400)
committerMaxim Dounin <mdounin@mdounin.ru>
Thu, 25 Jul 2013 10:56:59 +0000 (14:56 +0400)
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.

src/http/ngx_http_upstream.c

index 210f3bbc1aad9289d9b825e8d97e4dae9d4900aa..08c4e5781a6aa52754cd0c0a2fcca18525a4a00d 100644 (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);