Welcome! Log In Create A New Profile

Advanced

[patch-2] Slice filter: support multiple ranges.

胡聪 (hucc)
October 27, 2017 06:52AM
# HG changeset patch
# User hucongcong <hucong.c@foxmail.com>
# Date 1509100127 -28800
# Fri Oct 27 18:28:47 2017 +0800
# Node ID 56fe1738d1b8bdfa59ecb3eb8934db6404061e47
# Parent 62c100a0d42614cd46f0719c0acb0ad914594217
Slice filter: support multiple ranges.

diff -r 62c100a0d426 -r 56fe1738d1b8 src/http/modules/ngx_http_slice_filter_module.c
--- a/src/http/modules/ngx_http_slice_filter_module.c Fri Oct 27 18:25:40 2017 +0800
+++ b/src/http/modules/ngx_http_slice_filter_module.c Fri Oct 27 18:28:47 2017 +0800
@@ -22,6 +22,8 @@ typedef struct {
ngx_str_t etag;
unsigned last:1;
unsigned active:1;
+ unsigned multipart:1;
+ ngx_uint_t index;
ngx_http_request_t *sr;
} ngx_http_slice_ctx_t;

@@ -103,7 +105,9 @@ ngx_http_slice_header_filter(ngx_http_re
{
off_t end;
ngx_int_t rc;
+ ngx_uint_t i;
ngx_table_elt_t *h;
+ ngx_http_range_t *range;
ngx_http_slice_ctx_t *ctx;
ngx_http_slice_loc_conf_t *slcf;
ngx_http_slice_content_range_t cr;
@@ -182,27 +186,48 @@ ngx_http_slice_header_filter(ngx_http_re

r->allow_ranges = 1;
r->subrequest_ranges = 1;
- r->single_range = 1;

rc = ngx_http_next_header_filter(r);

- if (r != r->main) {
- return rc;
+ if (r == r->main) {
+ r->preserve_body = 1;
+
+ if (r->headers_out.status == NGX_HTTP_PARTIAL_CONTENT) {
+ ctx->multipart = (r->headers_out.ranges->nelts != 1);
+ range = r->headers_out.ranges->elts;
+
+ if (ctx->start + (off_t) slcf->size <= range[0].start) {
+ ctx->start = slcf->size * (range[0].start / slcf->size);
+ }
+
+ ctx->end = range[r->headers_out.ranges->nelts - 1].end;
+
+ } else {
+ ctx->end = cr.complete_length;
+ }
}

- r->preserve_body = 1;
+ if (ctx->multipart) {
+ end = ctx->start + (off_t) slcf->size - 1;
+
+ range = r->headers_out.ranges->elts;
+ for (i = ctx->index; i < r->headers_out.ranges->nelts - 1; i++) {
+
+ if (end < range[i].end) {
+ break;
+ }

- if (r->headers_out.status == NGX_HTTP_PARTIAL_CONTENT) {
- if (ctx->start + (off_t) slcf->size <= r->headers_out.content_offset) {
- ctx->start = slcf->size
- * (r->headers_out.content_offset / slcf->size);
+ if (end < range[i + 1].start && ctx->start >= range[i].end) {
+ i++;
+ ctx->index = i;
+ ctx->start = slcf->size * (range[i].start / slcf->size);
+
+ ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
+ "range multipart so fast forward to %O-%O @%O",
+ range[i].start, range[i].end, ctx->start);
+ break;
+ }
}
-
- ctx->end = r->headers_out.content_offset
- + r->headers_out.content_length_n;
-
- } else {
- ctx->end = cr.complete_length;
}

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

[patch-2] Slice filter: support multiple ranges.

胡聪 (hucc) 707 October 27, 2017 06:52AM

Re:[patch-2] Slice filter: support multiple ranges.

胡聪 (hucc) 375 October 31, 2017 01:00PM



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

Online Users

Guests: 163
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