range_filter_module get duplicated Accept-Ranges response headers

Roman Arutyunyan arut at nginx.com
Wed Jul 8 08:41:50 UTC 2020


Hi,

> On 8 Jul 2020, at 07:14, webber <nginx-forum at forum.nginx.org> wrote:
> 
> Hi,
> 
> Thanks for your reply. I have tried the patch that removes the original
> Accept-Ranges in slice filter module, but it is not work as my expected. 
> Because I think response header `Accept-Ranges` should be added if client
> send a range request.
> 
> Actually, in my production environment, my upstream server is Apache
> TrafficServer, and according to RFC 7233, section 2.3:
> Accept-Ranges(https://tools.ietf.org/html/rfc7233#section-2.3) , I think
> original Accept-Ranges header should not be removed in all case. I changed
> your patch as follow,  original Accept-Ranges header will be removed just
> for no-range request , that will work for me, could you please review that?

RFC 7233 does not require a server to send Accept-Ranges at all, and certainly
does not require it to send the header with a 206 response. Indeed Apache does
send Accept-Ranges both with 200 and 206, but nginx only sends it with 200.
This is how nginx works and I don’t think changing this only for the slice module
is a good idea. By the way, the example of a 206 response in RFC 7233 does
not have the Accept-Ranges too: https://tools.ietf.org/html/rfc7233#section-4.1 <https://tools.ietf.org/html/rfc7233#section-4.1>.

The rule nginx follows is this. Accept-Ranges should be sent by a party that does
ranges and is a way to signal the support for ranges. If ranges are done by the nginx
range filter, it should add the header. The Accept-Ranges that came from the
upstream server is unrelated to what the range filter is doing even if it’s exactly the
same header. That’s why the existing Accept-Ranges header should be removed
anyway.

Another question is whether the range filter should add a new header for both
200 and 206 or only for 200. The way it currently works for any response (not only
a slice response) is to add Accept-Ranges only for 200. Whether this should be
changed nginx-wise is a totally different question and I personally don’t think it makes
sense.

> diff --git a/src/http/modules/ngx_http_slice_filter_module.c
> b/src/http/modules/ngx_http_slice_filter_module.c
> index c1edbca2..570deaa5 100644
> --- a/src/http/modules/ngx_http_slice_filter_module.c
> +++ b/src/http/modules/ngx_http_slice_filter_module.c
> @@ -180,6 +180,11 @@ ngx_http_slice_header_filter(ngx_http_request_t *r)
>     r->headers_out.content_range->hash = 0;
>     r->headers_out.content_range = NULL;
> 
> +    if (!r->headers_in.range) {
> +        r->headers_out.accept_ranges->hash = 0;
> +        r->headers_out.accept_ranges = NULL;
> +    }
> +
>     r->allow_ranges = 1;
>     r->subrequest_ranges = 1;
>     r->single_range = 1;
> 
> Posted at Nginx Forum: https://forum.nginx.org/read.php?2,288569,288627#msg-288627
> 
> _______________________________________________
> nginx mailing list
> nginx at nginx.org
> http://mailman.nginx.org/mailman/listinfo/nginx

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.nginx.org/pipermail/nginx/attachments/20200708/bff04f39/attachment.htm>


More information about the nginx mailing list