[nginx] Slice filter: allowed at most one subrequest at a time.

Roman Arutyunyan arut at nginx.com
Mon Apr 3 10:44:52 UTC 2017


details:   http://hg.nginx.org/nginx/rev/a97ad1663ef4
branches:  
changeset: 6962:a97ad1663ef4
user:      Roman Arutyunyan <arut at nginx.com>
date:      Tue Mar 28 14:03:57 2017 +0300
description:
Slice filter: allowed at most one subrequest at a time.

Previously, if slice main request write handler was called while a slice
subrequest was running, a new subrequest for the same slice was started.

diffstat:

 src/http/modules/ngx_http_slice_filter_module.c |  28 ++++++++++++++----------
 1 files changed, 16 insertions(+), 12 deletions(-)

diffs (73 lines):

diff -r 903fb1ddc07f -r a97ad1663ef4 src/http/modules/ngx_http_slice_filter_module.c
--- a/src/http/modules/ngx_http_slice_filter_module.c	Sun Apr 02 14:32:29 2017 +0300
+++ b/src/http/modules/ngx_http_slice_filter_module.c	Tue Mar 28 14:03:57 2017 +0300
@@ -11,23 +11,24 @@
 
 
 typedef struct {
-    size_t      size;
+    size_t               size;
 } ngx_http_slice_loc_conf_t;
 
 
 typedef struct {
-    off_t       start;
-    off_t       end;
-    ngx_str_t   range;
-    ngx_str_t   etag;
-    ngx_uint_t  last;  /* unsigned  last:1; */
+    off_t                start;
+    off_t                end;
+    ngx_str_t            range;
+    ngx_str_t            etag;
+    ngx_uint_t           last;  /* unsigned  last:1; */
+    ngx_http_request_t  *sr;
 } ngx_http_slice_ctx_t;
 
 
 typedef struct {
-    off_t       start;
-    off_t       end;
-    off_t       complete_length;
+    off_t                start;
+    off_t                end;
+    off_t                complete_length;
 } ngx_http_slice_content_range_t;
 
 
@@ -209,7 +210,6 @@ ngx_http_slice_body_filter(ngx_http_requ
 {
     ngx_int_t                   rc;
     ngx_chain_t                *cl;
-    ngx_http_request_t         *sr;
     ngx_http_slice_ctx_t       *ctx;
     ngx_http_slice_loc_conf_t  *slcf;
 
@@ -234,6 +234,10 @@ ngx_http_slice_body_filter(ngx_http_requ
         return rc;
     }
 
+    if (ctx->sr && !ctx->sr->done) {
+        return rc;
+    }
+
     if (ctx->start >= ctx->end) {
         ngx_http_set_ctx(r, NULL, ngx_http_slice_filter_module);
         ngx_http_send_special(r, NGX_HTTP_LAST);
@@ -244,14 +248,14 @@ ngx_http_slice_body_filter(ngx_http_requ
         return rc;
     }
 
-    if (ngx_http_subrequest(r, &r->uri, &r->args, &sr, NULL,
+    if (ngx_http_subrequest(r, &r->uri, &r->args, &ctx->sr, NULL,
                             NGX_HTTP_SUBREQUEST_CLONE)
         != NGX_OK)
     {
         return NGX_ERROR;
     }
 
-    ngx_http_set_ctx(sr, ctx, ngx_http_slice_filter_module);
+    ngx_http_set_ctx(ctx->sr, ctx, ngx_http_slice_filter_module);
 
     slcf = ngx_http_get_module_loc_conf(r, ngx_http_slice_filter_module);
 


More information about the nginx-devel mailing list