changeset 6963:3ff293cfdab8

Slice filter: prevented slice redirection (ticket #1219). When a slice subrequest was redirected to a new location, its context was lost. After its completion, a new slice subrequest for the same slice was created. This could lead to infinite loop. Now the slice module makes sure each slice subrequest starts output with the slice context available.
author Roman Arutyunyan <arut@nginx.com>
date Fri, 31 Mar 2017 21:47:56 +0300
parents a97ad1663ef4
children 5d3d9b52327d
files src/http/modules/ngx_http_slice_filter_module.c
diffstat 1 files changed, 11 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/http/modules/ngx_http_slice_filter_module.c
+++ b/src/http/modules/ngx_http_slice_filter_module.c
@@ -20,7 +20,8 @@ typedef struct {
     off_t                end;
     ngx_str_t            range;
     ngx_str_t            etag;
-    ngx_uint_t           last;  /* unsigned  last:1; */
+    unsigned             last:1;
+    unsigned             active:1;
     ngx_http_request_t  *sr;
 } ngx_http_slice_ctx_t;
 
@@ -170,6 +171,7 @@ ngx_http_slice_header_filter(ngx_http_re
     }
 
     ctx->start = end;
+    ctx->active = 1;
 
     r->headers_out.status = NGX_HTTP_OK;
     r->headers_out.status_line.len = 0;
@@ -238,6 +240,12 @@ ngx_http_slice_body_filter(ngx_http_requ
         return rc;
     }
 
+    if (!ctx->active) {
+        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
+                      "missing slice response");
+        return NGX_ERROR;
+    }
+
     if (ctx->start >= ctx->end) {
         ngx_http_set_ctx(r, NULL, ngx_http_slice_filter_module);
         ngx_http_send_special(r, NGX_HTTP_LAST);
@@ -263,6 +271,8 @@ ngx_http_slice_body_filter(ngx_http_requ
                                  ctx->start + (off_t) slcf->size - 1)
                      - ctx->range.data;
 
+    ctx->active = 0;
+
     ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
                    "http slice subrequest: \"%V\"", &ctx->range);