Mercurial > hg > nginx
diff src/http/modules/ngx_http_range_filter.c @ 231:92db0aa1e83f
nginx-0.0.1-2004-01-16-21:29:15 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Fri, 16 Jan 2004 18:29:15 +0000 |
parents | 8dee38ea9117 |
children | 87e73f067470 |
line wrap: on
line diff
--- a/src/http/modules/ngx_http_range_filter.c +++ b/src/http/modules/ngx_http_range_filter.c @@ -77,7 +77,7 @@ static ngx_http_output_body_filter_pt static int ngx_http_range_header_filter(ngx_http_request_t *r) { - int rc, boundary, len, i; + ngx_int_t rc, boundary, suffix, len, i; char *p; off_t start, end; ngx_http_range_t *range; @@ -121,44 +121,52 @@ static int ngx_http_range_header_filter( p = r->headers_in.range->value.data + 6; for ( ;; ) { - start = end = 0; - - while (*p == ' ') { p++; } - - if (*p < '0' || *p > '9') { - rc = NGX_HTTP_RANGE_NOT_SATISFIABLE; - break; - } - - while (*p >= '0' && *p <= '9') { - start = start * 10 + *p++ - '0'; - } + start = 0; + end = 0; + suffix = 0; while (*p == ' ') { p++; } - if (*p++ != '-') { - rc = NGX_HTTP_RANGE_NOT_SATISFIABLE; - break; - } + if (*p != '-') { + if (*p < '0' || *p > '9') { + rc = NGX_HTTP_RANGE_NOT_SATISFIABLE; + break; + } - if (start >= r->headers_out.content_length_n) { - rc = NGX_HTTP_RANGE_NOT_SATISFIABLE; - break; - } + while (*p >= '0' && *p <= '9') { + start = start * 10 + *p++ - '0'; + } + + while (*p == ' ') { p++; } + + if (*p++ != '-') { + rc = NGX_HTTP_RANGE_NOT_SATISFIABLE; + break; + } - while (*p == ' ') { p++; } + if (start >= r->headers_out.content_length_n) { + rc = NGX_HTTP_RANGE_NOT_SATISFIABLE; + break; + } + + while (*p == ' ') { p++; } - if (*p == ',' || *p == '\0') { - ngx_test_null(range, ngx_push_array(&r->headers_out.ranges), - NGX_ERROR); - range->start = start; - range->end = r->headers_out.content_length_n; + if (*p == ',' || *p == '\0') { + ngx_test_null(range, ngx_push_array(&r->headers_out.ranges), + NGX_ERROR); + range->start = start; + range->end = r->headers_out.content_length_n; - if (*p++ == ',') { + if (*p++ != ',') { + break; + } + continue; } - break; + } else { + suffix = 1; + p++; } if (*p < '0' || *p > '9') { @@ -177,20 +185,33 @@ static int ngx_http_range_header_filter( break; } - if (end >= r->headers_out.content_length_n || start >= end) { + if (suffix) { + start = r->headers_out.content_length_n - end; + end = r->headers_out.content_length_n - 1; + } + + if (start > end) { rc = NGX_HTTP_RANGE_NOT_SATISFIABLE; break; } ngx_test_null(range, ngx_push_array(&r->headers_out.ranges), NGX_ERROR); range->start = start; - range->end = end + 1; - if (*p++ == ',') { - continue; + if (end >= r->headers_out.content_length_n) { + /* + * Download Accelerator sends the last byte position + * that equals to the file length + */ + range->end = r->headers_out.content_length_n; + + } else { + range->end = end + 1; } - break; + if (*p++ != ',') { + break; + } } if (rc) {