comparison src/http/modules/ngx_http_range_filter_module.c @ 1630:9706372f8916

If-Range support
author Igor Sysoev <igor@sysoev.ru>
date Fri, 09 Nov 2007 15:41:35 +0000
parents 4ba6df5d5b53
children 2a92804f4109
comparison
equal deleted inserted replaced
1629:12a656452ad1 1630:9706372f8916
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)