Mercurial > hg > nginx
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);