Mercurial > hg > nginx-vendor-current
comparison src/http/modules/ngx_http_range_filter_module.c @ 346:05693816539c NGINX_0_6_17
nginx 0.6.17
*) Feature: the "If-Range" request header line support.
Thanks to Alexander V. Inyukhin.
*) Bugfix: URL double escaping in a redirect of the "msie_refresh"
directive; bug appeared in 0.6.4.
*) Bugfix: the "autoindex" directive did not work with the "alias /"
directive.
*) Bugfix: a segmentation fault might occur in worker process if
subrequests were used.
*) Bugfix: the big responses may be transferred truncated if SSL and
gzip were used.
*) Bugfix: the $status variable was equal to 0 if a proxied server
returned response in HTTP/0.9 version.
author | Igor Sysoev <http://sysoev.ru> |
---|---|
date | Thu, 15 Nov 2007 00:00:00 +0300 |
parents | cba14c1e2a4b |
children | 984bb0b1399b |
comparison
equal
deleted
inserted
replaced
345:4279bc4cdec6 | 346:05693816539c |
---|---|
132 ngx_http_range_header_filter(ngx_http_request_t *r) | 132 ngx_http_range_header_filter(ngx_http_request_t *r) |
133 { | 133 { |
134 u_char *p; | 134 u_char *p; |
135 size_t len; | 135 size_t len; |
136 off_t start, end; | 136 off_t start, end; |
137 time_t if_range; | |
137 ngx_int_t rc; | 138 ngx_int_t rc; |
138 ngx_uint_t suffix, i; | 139 ngx_uint_t suffix, i; |
139 ngx_atomic_uint_t boundary; | 140 ngx_atomic_uint_t boundary; |
140 ngx_table_elt_t *content_range; | 141 ngx_table_elt_t *content_range; |
141 ngx_http_range_t *range; | 142 ngx_http_range_t *range; |
154 || r->headers_in.range->value.len < 7 | 155 || r->headers_in.range->value.len < 7 |
155 || ngx_strncasecmp(r->headers_in.range->value.data, | 156 || ngx_strncasecmp(r->headers_in.range->value.data, |
156 (u_char *) "bytes=", 6) | 157 (u_char *) "bytes=", 6) |
157 != 0) | 158 != 0) |
158 { | 159 { |
159 r->headers_out.accept_ranges = ngx_list_push(&r->headers_out.headers); | 160 goto next_filter; |
160 if (r->headers_out.accept_ranges == NULL) { | 161 } |
161 return NGX_ERROR; | 162 |
162 } | 163 if (r->headers_in.if_range && r->headers_out.last_modified_time != -1) { |
163 | 164 |
164 r->headers_out.accept_ranges->hash = 1; | 165 if_range = ngx_http_parse_time(r->headers_in.if_range->value.data, |
165 r->headers_out.accept_ranges->key.len = sizeof("Accept-Ranges") - 1; | 166 r->headers_in.if_range->value.len); |
166 r->headers_out.accept_ranges->key.data = (u_char *) "Accept-Ranges"; | 167 |
167 r->headers_out.accept_ranges->value.len = sizeof("bytes") - 1; | 168 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
168 r->headers_out.accept_ranges->value.data = (u_char *) "bytes"; | 169 "http ir:%d lm:%d", |
169 | 170 if_range, r->headers_out.last_modified_time); |
170 return ngx_http_next_header_filter(r); | 171 |
172 if (if_range != r->headers_out.last_modified_time) { | |
173 goto next_filter; | |
174 } | |
171 } | 175 } |
172 | 176 |
173 ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_range_filter_ctx_t)); | 177 ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_range_filter_ctx_t)); |
174 if (ctx == NULL) { | 178 if (ctx == NULL) { |
175 return NGX_ERROR; | 179 return NGX_ERROR; |
459 r->headers_out.content_length->hash = 0; | 463 r->headers_out.content_length->hash = 0; |
460 r->headers_out.content_length = NULL; | 464 r->headers_out.content_length = NULL; |
461 } | 465 } |
462 | 466 |
463 return ngx_http_next_header_filter(r); | 467 return ngx_http_next_header_filter(r); |
468 | |
469 next_filter: | |
470 | |
471 r->headers_out.accept_ranges = ngx_list_push(&r->headers_out.headers); | |
472 if (r->headers_out.accept_ranges == NULL) { | |
473 return NGX_ERROR; | |
474 } | |
475 | |
476 r->headers_out.accept_ranges->hash = 1; | |
477 r->headers_out.accept_ranges->key.len = sizeof("Accept-Ranges") - 1; | |
478 r->headers_out.accept_ranges->key.data = (u_char *) "Accept-Ranges"; | |
479 r->headers_out.accept_ranges->value.len = sizeof("bytes") - 1; | |
480 r->headers_out.accept_ranges->value.data = (u_char *) "bytes"; | |
481 | |
482 return ngx_http_next_header_filter(r); | |
464 } | 483 } |
465 | 484 |
466 | 485 |
467 static ngx_int_t | 486 static ngx_int_t |
468 ngx_http_range_body_filter(ngx_http_request_t *r, ngx_chain_t *in) | 487 ngx_http_range_body_filter(ngx_http_request_t *r, ngx_chain_t *in) |