changeset 1630:9706372f8916

If-Range support
author Igor Sysoev <igor@sysoev.ru>
date Fri, 09 Nov 2007 15:41:35 +0000
parents 12a656452ad1
children b67b75bb09b7
files src/http/modules/ngx_http_range_filter_module.c src/http/ngx_http_request.c src/http/ngx_http_request.h
diffstat 3 files changed, 34 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- 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_re
     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_re
                            (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;
+    }
+
+    if (r->headers_in.if_range && r->headers_out.last_modified_time != -1) {
+
+        if_range = ngx_http_parse_time(r->headers_in.if_range->value.data,
+                                       r->headers_in.if_range->value.len);
 
-        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";
+        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
+                       "http ir:%d lm:%d",
+                       if_range, r->headers_out.last_modified_time);
 
-        return ngx_http_next_header_filter(r);
+        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_re
     }
 
     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);
 }
 
 
--- a/src/http/ngx_http_request.c
+++ b/src/http/ngx_http_request.c
@@ -96,6 +96,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 },
--- 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;