summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorIgor Sysoev <igor@sysoev.ru>2008-01-08 16:55:05 +0000
committerIgor Sysoev <igor@sysoev.ru>2008-01-08 16:55:05 +0000
commit8c9cc2f0cec6d470dde87e3612c268d55e1a3529 (patch)
tree9b395ed2950dfc2e3157ab125af714d4a7fdeb52
parent964df3ded5b23fc3c7d30c5f5f682aa5a60c290c (diff)
downloadnginx-8c9cc2f0cec6d470dde87e3612c268d55e1a3529.tar.gz
nginx-8c9cc2f0cec6d470dde87e3612c268d55e1a3529.tar.bz2
r1631 merge:
If-Range support
-rw-r--r--src/http/modules/ngx_http_range_filter_module.c39
-rw-r--r--src/http/ngx_http_request.c4
-rw-r--r--src/http/ngx_http_request.h1
3 files changed, 34 insertions, 10 deletions
diff --git a/src/http/modules/ngx_http_range_filter_module.c b/src/http/modules/ngx_http_range_filter_module.c
index 11da43d92..cf42daf6f 100644
--- a/src/http/modules/ngx_http_range_filter_module.c
+++ b/src/http/modules/ngx_http_range_filter_module.c
@@ -134,6 +134,7 @@ ngx_http_range_header_filter(ngx_http_request_t *r)
u_char *p;
size_t len;
off_t start, end;
+ time_t if_range;
ngx_int_t rc;
ngx_uint_t suffix, i;
ngx_atomic_uint_t boundary;
@@ -156,18 +157,21 @@ ngx_http_range_header_filter(ngx_http_request_t *r)
(u_char *) "bytes=", 6)
!= 0)
{
- r->headers_out.accept_ranges = ngx_list_push(&r->headers_out.headers);
- if (r->headers_out.accept_ranges == NULL) {
- return NGX_ERROR;
- }
+ goto next_filter;
+ }
- r->headers_out.accept_ranges->hash = 1;
- r->headers_out.accept_ranges->key.len = sizeof("Accept-Ranges") - 1;
- r->headers_out.accept_ranges->key.data = (u_char *) "Accept-Ranges";
- r->headers_out.accept_ranges->value.len = sizeof("bytes") - 1;
- r->headers_out.accept_ranges->value.data = (u_char *) "bytes";
+ if (r->headers_in.if_range && r->headers_out.last_modified_time != -1) {
- return ngx_http_next_header_filter(r);
+ if_range = ngx_http_parse_time(r->headers_in.if_range->value.data,
+ r->headers_in.if_range->value.len);
+
+ ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
+ "http ir:%d lm:%d",
+ if_range, r->headers_out.last_modified_time);
+
+ if (if_range != r->headers_out.last_modified_time) {
+ goto next_filter;
+ }
}
ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_range_filter_ctx_t));
@@ -461,6 +465,21 @@ ngx_http_range_header_filter(ngx_http_request_t *r)
}
return ngx_http_next_header_filter(r);
+
+next_filter:
+
+ r->headers_out.accept_ranges = ngx_list_push(&r->headers_out.headers);
+ if (r->headers_out.accept_ranges == NULL) {
+ return NGX_ERROR;
+ }
+
+ r->headers_out.accept_ranges->hash = 1;
+ r->headers_out.accept_ranges->key.len = sizeof("Accept-Ranges") - 1;
+ r->headers_out.accept_ranges->key.data = (u_char *) "Accept-Ranges";
+ r->headers_out.accept_ranges->value.len = sizeof("bytes") - 1;
+ r->headers_out.accept_ranges->value.data = (u_char *) "bytes";
+
+ return ngx_http_next_header_filter(r);
}
diff --git a/src/http/ngx_http_request.c b/src/http/ngx_http_request.c
index e5ed14935..daef39252 100644
--- a/src/http/ngx_http_request.c
+++ b/src/http/ngx_http_request.c
@@ -97,6 +97,10 @@ ngx_http_header_t ngx_http_headers_in[] = {
{ ngx_string("Range"), offsetof(ngx_http_headers_in_t, range),
ngx_http_process_header_line },
+ { ngx_string("If-Range"),
+ offsetof(ngx_http_headers_in_t, if_range),
+ ngx_http_process_unique_header_line },
+
{ ngx_string("Transfer-Encoding"),
offsetof(ngx_http_headers_in_t, transfer_encoding),
ngx_http_process_header_line },
diff --git a/src/http/ngx_http_request.h b/src/http/ngx_http_request.h
index 9098a2ada..db001c5ea 100644
--- a/src/http/ngx_http_request.h
+++ b/src/http/ngx_http_request.h
@@ -168,6 +168,7 @@ typedef struct {
ngx_table_elt_t *content_type;
ngx_table_elt_t *range;
+ ngx_table_elt_t *if_range;
ngx_table_elt_t *transfer_encoding;