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
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)