range_filter_module get duplicated Accept-Ranges response headers

webber nginx-forum at forum.nginx.org
Mon Jul 6 10:49:15 UTC 2020


Hello, 

Recently,  we found if we use nginx slice module , and upstream server is
such as a static file server,  nginx will response duplicated
`Accept-Ranges` headers if client request is not included range header.

the minimal config example as follow:

```
server {
        listen                      80;
        server_name          _;
        default_type           text/html;
        
        location /get_file {
            slice 256k;
            proxy_set_header Range $slice_range;
            proxy_pass       http://127.0.0.1:8899;
        } 
}
```

use curl to get 1mb file:
```
curl -s http://localhost/get_file/1mb.test -D- -o /dev/null

HTTP/1.1 200 OK
Date: Mon, 06 Jul 2020 10:32:58 GMT
Content-Type: application/octet-stream
Content-Length: 1048576
Connection: keep-alive
Last-Modified: Mon, 06 Jul 2020 07:34:23 GMT
Cache-Control: public, max-age=43200
Expires: Mon, 06 Jul 2020 22:32:58 GMT
ETag: "1594020863.76-1048576-4019326287"
Accept-Ranges: bytes
Accept-Ranges: bytes
```

but if I add range header to curl request, will get expected response.

Then I review the ngx_http_range_filter_module,  in `goto next_filter`( line
253) ,  should we handle  NGX_HTTP_OK response? like: 

```
next_filter:

    if (r->headers_out.status == NGX_HTTP_OK) {
        r->headers_out.accept_ranges = NULL;
        return ngx_http_next_header_filter(r);
    }

    r->headers_out.accept_ranges = ngx_list_push(&r->headers_out.headers);
    if (r->headers_out.accept_ranges == NULL) {
        return NGX_ERROR;
    }

    r->headers_out.accept_ranges->hash = 1;
    ngx_str_set(&r->headers_out.accept_ranges->key, "Accept-Ranges");
    ngx_str_set(&r->headers_out.accept_ranges->value, "bytes");

    return ngx_http_next_header_filter(r);
```

I am confused if it is a bug?

Posted at Nginx Forum: https://forum.nginx.org/read.php?2,288569,288569#msg-288569



More information about the nginx mailing list