Mercurial > hg > nginx
changeset 5621:345e4fd4bb64
Range filter: single_range flag in request.
If set, it means that response body is going to be in more than one buffer,
hence only range requests with a single range should be honored.
The flag is now used by mp4 and cacheable upstream responses, thus allowing
range requests of mp4 files with start/end, as well as range processing
on a first request to a not-yet-cached files with proxy_cache.
Notably this makes it possible to play mp4 files (with proxy_cache, or with
mp4 module) on iOS devices, as byte-range support is required by Apple.
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Fri, 21 Mar 2014 19:33:21 +0400 |
parents | 0a567878254b |
children | a23c35496c2f |
files | src/http/modules/ngx_http_mp4_module.c src/http/modules/ngx_http_range_filter_module.c src/http/ngx_http_request.h src/http/ngx_http_upstream.c |
diffstat | 4 files changed, 12 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/src/http/modules/ngx_http_mp4_module.c Thu Mar 20 16:05:19 2014 +0400 +++ b/src/http/modules/ngx_http_mp4_module.c Fri Mar 21 19:33:21 2014 +0400 @@ -571,7 +571,7 @@ } if (start >= 0) { - r->allow_ranges = 0; + r->single_range = 1; mp4 = ngx_pcalloc(r->pool, sizeof(ngx_http_mp4_file_t)); if (mp4 == NULL) {
--- a/src/http/modules/ngx_http_range_filter_module.c Thu Mar 20 16:05:19 2014 +0400 +++ b/src/http/modules/ngx_http_range_filter_module.c Fri Mar 21 19:33:21 2014 +0400 @@ -148,6 +148,7 @@ { time_t if_range_time; ngx_str_t *if_range, *etag; + ngx_uint_t ranges; ngx_http_core_loc_conf_t *clcf; ngx_http_range_filter_ctx_t *ctx; @@ -227,7 +228,9 @@ return NGX_ERROR; } - switch (ngx_http_range_parse(r, ctx, clcf->max_ranges)) { + ranges = r->single_range ? 1 : clcf->max_ranges; + + switch (ngx_http_range_parse(r, ctx, ranges)) { case NGX_OK: ngx_http_set_ctx(r, ctx, ngx_http_range_body_filter_module);
--- a/src/http/ngx_http_request.h Thu Mar 20 16:05:19 2014 +0400 +++ b/src/http/ngx_http_request.h Fri Mar 21 19:33:21 2014 +0400 @@ -528,6 +528,7 @@ unsigned filter_need_in_memory:1; unsigned filter_need_temporary:1; unsigned allow_ranges:1; + unsigned single_range:1; #if (NGX_STAT_STUB) unsigned stat_reading:1;
--- a/src/http/ngx_http_upstream.c Thu Mar 20 16:05:19 2014 +0400 +++ b/src/http/ngx_http_upstream.c Fri Mar 21 19:33:21 2014 +0400 @@ -4183,7 +4183,12 @@ if (r->cached) { r->allow_ranges = 1; return NGX_OK; - + } + + if (r->upstream->cacheable) { + r->allow_ranges = 1; + r->single_range = 1; + return NGX_OK; } #endif