]> git.kaiwu.me - nginx.git/commitdiff
Upstream: keep request body file from removal if requested.
authorRoman Arutyunyan <arut@nginx.com>
Wed, 19 Jul 2017 17:38:17 +0000 (20:38 +0300)
committerRoman Arutyunyan <arut@nginx.com>
Wed, 19 Jul 2017 17:38:17 +0000 (20:38 +0300)
The new request flag "preserve_body" indicates that the request body file should
not be removed by the upstream module because it may be used later by a
subrequest.  The flag is set by the SSI (ticket #585), addition and slice
modules.  Additionally, it is also set by the upstream module when a background
cache update subrequest is started to prevent the request body file removal
after an internal redirect.  Only the main request is now allowed to remove the
file.

src/http/modules/ngx_http_addition_filter_module.c
src/http/modules/ngx_http_slice_filter_module.c
src/http/modules/ngx_http_ssi_filter_module.c
src/http/ngx_http_request.h
src/http/ngx_http_upstream.c

index 2fad0e59bf92a74583215aa8c11c4283633aa59a..e546f0d60b80471d24a48dff40dfe47104e4c8ea 100644 (file)
@@ -123,6 +123,8 @@ ngx_http_addition_header_filter(ngx_http_request_t *r)
     ngx_http_clear_accept_ranges(r);
     ngx_http_weak_etag(r);
 
+    r->preserve_body = 1;
+
     return ngx_http_next_header_filter(r);
 }
 
index 7b9de271398b4f7a253bc677e22c93d2671c92e1..c1edbca2b6bad560b2214511557e35f8ab39281f 100644 (file)
@@ -190,6 +190,8 @@ ngx_http_slice_header_filter(ngx_http_request_t *r)
         return rc;
     }
 
+    r->preserve_body = 1;
+
     if (r->headers_out.status == NGX_HTTP_PARTIAL_CONTENT) {
         if (ctx->start + (off_t) slcf->size <= r->headers_out.content_offset) {
             ctx->start = slcf->size
index b92ad4c02d13f3be8178c86129768b5a0aa1313e..b09ce20614c0a8404d5a045169b70957b660cd84 100644 (file)
@@ -370,6 +370,8 @@ ngx_http_ssi_header_filter(ngx_http_request_t *r)
         ngx_http_clear_content_length(r);
         ngx_http_clear_accept_ranges(r);
 
+        r->preserve_body = 1;
+
         if (!slcf->last_modified) {
             ngx_http_clear_last_modified(r);
             ngx_http_clear_etag(r);
index f7f3e97f41965fd10eae40448d37f3fe27e2735d..421004a0d7505cae7da98ede62ef0ae8f51edbb9 100644 (file)
@@ -537,6 +537,7 @@ struct ngx_http_request_s {
     unsigned                          main_filter_need_in_memory:1;
     unsigned                          filter_need_in_memory:1;
     unsigned                          filter_need_temporary:1;
+    unsigned                          preserve_body:1;
     unsigned                          allow_ranges:1;
     unsigned                          subrequest_ranges:1;
     unsigned                          single_range:1;
index cca417d969654ea26bb75d58b567e7424a2e602b..fb3209270de89ae96ec974e46f0e7f80eac01076 100644 (file)
@@ -1077,6 +1077,10 @@ ngx_http_upstream_cache_background_update(ngx_http_request_t *r,
         return NGX_OK;
     }
 
+    if (r == r->main) {
+        r->preserve_body = 1;
+    }
+
     if (ngx_http_subrequest(r, &r->uri, &r->args, &sr, NULL,
                             NGX_HTTP_SUBREQUEST_CLONE
                             |NGX_HTTP_SUBREQUEST_BACKGROUND)
@@ -2857,7 +2861,9 @@ ngx_http_upstream_send_response(ngx_http_request_t *r, ngx_http_upstream_t *u)
         u->pipe->downstream_error = 1;
     }
 
-    if (r->request_body && r->request_body->temp_file) {
+    if (r->request_body && r->request_body->temp_file
+        && r == r->main && !r->preserve_body)
+    {
         ngx_pool_run_cleanup_file(r->pool, r->request_body->temp_file->file.fd);
         r->request_body->temp_file->file.fd = NGX_INVALID_FILE;
     }