[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