diff 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
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);
 }