Maxim Dounin
March 21, 2014 11:40AM
details: http://hg.nginx.org/nginx/rev/345e4fd4bb64
branches:
changeset: 5621:345e4fd4bb64
user: Maxim Dounin <mdounin@mdounin.ru>
date: Fri Mar 21 19:33:21 2014 +0400
description:
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.

diffstat:

src/http/modules/ngx_http_mp4_module.c | 2 +-
src/http/modules/ngx_http_range_filter_module.c | 5 ++++-
src/http/ngx_http_request.h | 1 +
src/http/ngx_http_upstream.c | 7 ++++++-
4 files changed, 12 insertions(+), 3 deletions(-)

diffs (62 lines):

diff --git a/src/http/modules/ngx_http_mp4_module.c b/src/http/modules/ngx_http_mp4_module.c
--- a/src/http/modules/ngx_http_mp4_module.c
+++ b/src/http/modules/ngx_http_mp4_module.c
@@ -571,7 +571,7 @@ ngx_http_mp4_handler(ngx_http_request_t
}

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) {
diff --git a/src/http/modules/ngx_http_range_filter_module.c b/src/http/modules/ngx_http_range_filter_module.c
--- a/src/http/modules/ngx_http_range_filter_module.c
+++ b/src/http/modules/ngx_http_range_filter_module.c
@@ -148,6 +148,7 @@ ngx_http_range_header_filter(ngx_http_re
{
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 @@ parse:
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);
diff --git a/src/http/ngx_http_request.h b/src/http/ngx_http_request.h
--- a/src/http/ngx_http_request.h
+++ b/src/http/ngx_http_request.h
@@ -528,6 +528,7 @@ struct ngx_http_request_s {
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;
diff --git a/src/http/ngx_http_upstream.c b/src/http/ngx_http_upstream.c
--- a/src/http/ngx_http_upstream.c
+++ b/src/http/ngx_http_upstream.c
@@ -4183,7 +4183,12 @@ ngx_http_upstream_copy_allow_ranges(ngx_
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

_______________________________________________
nginx-devel mailing list
nginx-devel@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-devel
Subject Author Views Posted

[nginx] Range filter: single_range flag in request.

Maxim Dounin 1124 March 21, 2014 11:40AM



Sorry, you do not have permission to post/reply in this forum.

Online Users

Guests: 221
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready