[nginx] slice module issue

Roman Arutyunyan arut at nginx.com
Tue Jun 20 12:09:53 UTC 2017


Hi,

On Tue, Jun 20, 2017 at 02:25:14AM +0800, 洪志道 wrote:
> Hi!
> 
> Have a look at the following example first.
> 
> server {
>       listen  80;
> 
>       location / {
>           slice 10;
>           proxy_set_header  Range $slice_range;
>           proxy_pass http://127.0.0.1:81;
>       }
> }
> 
> 
> server {
>       listen  81;
>        root  html;
> }
> 
> Then we start a request with curl.
> > curl http://my.test.com/ -x 127.1:80 -H "range: bytes=1-50, 2-51"
> 
> We get a response of the whole file that differs from expectation (1-50,
> 2-51).
> 
> It seems that slice module doesn't support multi-range (separated by
> commas),

Yes, the slice module does not support multi-range.
The entire file is proxied and processed by the standard range module,
which has limited multi-range support too.  Particularly, multi-range is
supported only when returning an entire file from disk.

> but it's confused $slice_range variable is valid.
> 
> Please confirm this question and the following patch, thanks!
> 
> 
> diff -r 5e05118678af src/http/modules/ngx_http_slice_filter_module.c
> --- a/src/http/modules/ngx_http_slice_filter_module.c Mon May 29 23:33:38
> 2017 +0300
> +++ b/src/http/modules/ngx_http_slice_filter_module.c Mon Jun 19 09:35:24
> 2017 -0400
> @@ -389,6 +389,7 @@
>      ngx_http_variable_value_t *v, uintptr_t data)
>  {
>      u_char                     *p;
> +    off_t                      start;
>      ngx_http_slice_ctx_t       *ctx;
>      ngx_http_slice_loc_conf_t  *slcf;
> 
> @@ -407,6 +408,13 @@
>              return NGX_OK;
>          }
> 
> +        start = ngx_http_slice_get_start(r);
> +
> +        if (start == -1) {
> +            v->not_found = 1;
> +            return NGX_OK;
> +        }
> +
>          ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_slice_ctx_t));
>          if (ctx == NULL) {
>              return NGX_ERROR;
> @@ -419,7 +427,7 @@
>              return NGX_ERROR;
>          }
> 
> -        ctx->start = slcf->size * (ngx_http_slice_get_start(r) /
> slcf->size);
> +        ctx->start = slcf->size * (start / slcf->size);
> 
>          ctx->range.data = p;
>          ctx->range.len = ngx_sprintf(p, "bytes=%O-%O", ctx->start,
> @@ -460,7 +468,7 @@
>      p = h->value.data + 6;
> 
>      if (ngx_strchr(p, ',')) {
> -        return 0;
> +        return -1;
>      }
> 
>      while (*p == ' ') { p++; }
> 
> 
> And this is a better conf.
> 
> map $slice_range  $x_slice_range {
>         default  $http_range;
>         ~           $slice_range;
> }
> 
> server {
>       listen  80;
> 
>       location / {
>           slice 10;
>           proxy_set_header  Range $x_slice_range;
>           proxy_pass http://127.0.0.1:81;
>       }
> }

> _______________________________________________
> nginx-devel mailing list
> nginx-devel at nginx.org
> http://mailman.nginx.org/mailman/listinfo/nginx-devel


-- 
Roman Arutyunyan


More information about the nginx-devel mailing list