]> git.kaiwu.me - nginx.git/commitdiff
r1886 merge:
authorIgor Sysoev <igor@sysoev.ru>
Sun, 4 May 2008 10:04:21 +0000 (10:04 +0000)
committerIgor Sysoev <igor@sysoev.ru>
Sun, 4 May 2008 10:04:21 +0000 (10:04 +0000)
test response length in proxy/fastcgi_store

src/http/ngx_http_upstream.c
src/http/ngx_http_upstream.h

index f4daf401df33b7ca56208f99550e8a24c6c412fc..e430d1a0e6151d7c89a06f4a2b4497e051dd40a1 100644 (file)
@@ -1235,6 +1235,8 @@ ngx_http_upstream_process_header(ngx_event_t *rev)
     r->headers_out.status = u->headers_in.status_n;
     r->headers_out.status_line = u->headers_in.status_line;
 
+    u->headers_in.content_length_n = r->headers_out.content_length_n;
+
     if (r->headers_out.content_length_n != -1) {
         u->length = (size_t) r->headers_out.content_length_n;
 
@@ -1838,6 +1840,7 @@ ngx_http_upstream_process_downstream(ngx_http_request_t *r)
 static void
 ngx_http_upstream_process_body(ngx_event_t *ev)
 {
+    ngx_temp_file_t      *tf;
     ngx_event_pipe_t     *p;
     ngx_connection_t     *c, *downstream;
     ngx_http_log_ctx_t   *ctx;
@@ -1932,18 +1935,22 @@ ngx_http_upstream_process_body(ngx_event_t *ev)
 
         if (u->store) {
 
-            if (p->upstream_eof && u->headers_in.status_n == NGX_HTTP_OK) {
+            tf = u->pipe->temp_file;
 
+            if (p->upstream_eof
+                && u->headers_in.status_n == NGX_HTTP_OK
+                && (u->headers_in.content_length_n == -1
+                    || (u->headers_in.content_length_n == tf->offset)))
+            {
                 ngx_http_upstream_store(r, u);
 
             } else if ((p->upstream_error
                         || (p->upstream_eof
                             && u->headers_in.status_n != NGX_HTTP_OK))
-                       && u->pipe->temp_file->file.fd != NGX_INVALID_FILE)
+                       && tf->file.fd != NGX_INVALID_FILE)
             {
-                if (ngx_delete_file(u->pipe->temp_file->file.name.data)
-                    == NGX_FILE_ERROR)
-                {
+                if (ngx_delete_file(tf->file.name.data) == NGX_FILE_ERROR) {
+
                     ngx_log_error(NGX_LOG_CRIT, r->connection->log, ngx_errno,
                                   ngx_delete_file_n " \"%s\" failed",
                                   u->pipe->temp_file->file.name.data);
index 15987b1b15cb569715da01c395c6e79bf9ccf8d3..f6184b6ffa2774cda1c812a9f8c6bb2b912a8fd0 100644 (file)
@@ -194,6 +194,8 @@ typedef struct {
     ngx_table_elt_t                *content_encoding;
 #endif
 
+    off_t                           content_length_n;
+
     ngx_array_t                     cache_control;
 } ngx_http_upstream_headers_in_t;