mirror of
https://github.com/nginx/nginx.git
synced 2024-12-02 20:09:01 +08:00
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.
This commit is contained in:
parent
c6ca135923
commit
effbf466aa
@ -571,7 +571,7 @@ ngx_http_mp4_handler(ngx_http_request_t *r)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (start >= 0) {
|
if (start >= 0) {
|
||||||
r->allow_ranges = 0;
|
r->single_range = 1;
|
||||||
|
|
||||||
mp4 = ngx_pcalloc(r->pool, sizeof(ngx_http_mp4_file_t));
|
mp4 = ngx_pcalloc(r->pool, sizeof(ngx_http_mp4_file_t));
|
||||||
if (mp4 == NULL) {
|
if (mp4 == NULL) {
|
||||||
|
@ -148,6 +148,7 @@ ngx_http_range_header_filter(ngx_http_request_t *r)
|
|||||||
{
|
{
|
||||||
time_t if_range_time;
|
time_t if_range_time;
|
||||||
ngx_str_t *if_range, *etag;
|
ngx_str_t *if_range, *etag;
|
||||||
|
ngx_uint_t ranges;
|
||||||
ngx_http_core_loc_conf_t *clcf;
|
ngx_http_core_loc_conf_t *clcf;
|
||||||
ngx_http_range_filter_ctx_t *ctx;
|
ngx_http_range_filter_ctx_t *ctx;
|
||||||
|
|
||||||
@ -227,7 +228,9 @@ parse:
|
|||||||
return NGX_ERROR;
|
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:
|
case NGX_OK:
|
||||||
ngx_http_set_ctx(r, ctx, ngx_http_range_body_filter_module);
|
ngx_http_set_ctx(r, ctx, ngx_http_range_body_filter_module);
|
||||||
|
@ -528,6 +528,7 @@ struct ngx_http_request_s {
|
|||||||
unsigned filter_need_in_memory:1;
|
unsigned filter_need_in_memory:1;
|
||||||
unsigned filter_need_temporary:1;
|
unsigned filter_need_temporary:1;
|
||||||
unsigned allow_ranges:1;
|
unsigned allow_ranges:1;
|
||||||
|
unsigned single_range:1;
|
||||||
|
|
||||||
#if (NGX_STAT_STUB)
|
#if (NGX_STAT_STUB)
|
||||||
unsigned stat_reading:1;
|
unsigned stat_reading:1;
|
||||||
|
@ -4183,7 +4183,12 @@ ngx_http_upstream_copy_allow_ranges(ngx_http_request_t *r,
|
|||||||
if (r->cached) {
|
if (r->cached) {
|
||||||
r->allow_ranges = 1;
|
r->allow_ranges = 1;
|
||||||
return NGX_OK;
|
return NGX_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (r->upstream->cacheable) {
|
||||||
|
r->allow_ranges = 1;
|
||||||
|
r->single_range = 1;
|
||||||
|
return NGX_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user