[PATCH] Not Modified: prefer entity tags over date validators
Piotr Sikora
piotr at cloudflare.com
Wed Nov 19 01:15:46 UTC 2014
# HG changeset patch
# User Piotr Sikora <piotr at cloudflare.com>
# Date 1416359232 28800
# Tue Nov 18 17:07:12 2014 -0800
# Node ID 3efade6bb02f7962a5120e1a1f95a1dc8f0b6a4c
# Parent 2f7e557eab5b501ba71418febd3de9ef1c0ab4f1
Not Modified: prefer entity tags over date validators.
RFC7232 says:
A recipient MUST ignore If-Modified-Since if the request contains an
If-None-Match header field; the condition in If-None-Match is
considered to be a more accurate replacement for the condition in
If-Modified-Since, and the two are only combined for the sake of
interoperating with older intermediaries that might not implement
If-None-Match.
and:
A recipient MUST ignore If-Unmodified-Since if the request contains
an If-Match header field; the condition in If-Match is considered to
be a more accurate replacement for the condition in
If-Unmodified-Since, and the two are only combined for the sake of
interoperating with older intermediaries that might not implement
If-Match.
Signed-off-by: Piotr Sikora <piotr at cloudflare.com>
diff -r 2f7e557eab5b -r 3efade6bb02f src/http/modules/ngx_http_not_modified_filter_module.c
--- a/src/http/modules/ngx_http_not_modified_filter_module.c Tue Nov 18 20:41:12 2014 +0300
+++ b/src/http/modules/ngx_http_not_modified_filter_module.c Tue Nov 18 17:07:12 2014 -0800
@@ -61,48 +61,47 @@ ngx_http_not_modified_header_filter(ngx_
return ngx_http_next_header_filter(r);
}
- if (r->headers_in.if_unmodified_since
- && !ngx_http_test_if_unmodified(r))
- {
- return ngx_http_filter_finalize_request(r, NULL,
- NGX_HTTP_PRECONDITION_FAILED);
+ if (r->headers_in.if_match) {
+
+ if (!ngx_http_test_if_match(r, r->headers_in.if_match, 0)) {
+ return ngx_http_filter_finalize_request(r, NULL,
+ NGX_HTTP_PRECONDITION_FAILED);
+ }
+
+ } else if (r->headers_in.if_unmodified_since) {
+
+ if (!ngx_http_test_if_unmodified(r)) {
+ return ngx_http_filter_finalize_request(r, NULL,
+ NGX_HTTP_PRECONDITION_FAILED);
+ }
}
- if (r->headers_in.if_match
- && !ngx_http_test_if_match(r, r->headers_in.if_match, 0))
- {
- return ngx_http_filter_finalize_request(r, NULL,
- NGX_HTTP_PRECONDITION_FAILED);
+ if (r->headers_in.if_none_match) {
+
+ if (ngx_http_test_if_match(r, r->headers_in.if_none_match, 1)) {
+ goto not_modified;
+ }
+
+ } else if (r->headers_in.if_modified_since) {
+
+ if (!ngx_http_test_if_modified(r)) {
+ goto not_modified;
+ }
}
- if (r->headers_in.if_modified_since || r->headers_in.if_none_match) {
+ return ngx_http_next_header_filter(r);
- if (r->headers_in.if_modified_since
- && ngx_http_test_if_modified(r))
- {
- return ngx_http_next_header_filter(r);
- }
+not_modified:
- if (r->headers_in.if_none_match
- && !ngx_http_test_if_match(r, r->headers_in.if_none_match, 1))
- {
- return ngx_http_next_header_filter(r);
- }
+ r->headers_out.status = NGX_HTTP_NOT_MODIFIED;
+ r->headers_out.status_line.len = 0;
+ r->headers_out.content_type.len = 0;
+ ngx_http_clear_content_length(r);
+ ngx_http_clear_accept_ranges(r);
- /* not modified */
-
- r->headers_out.status = NGX_HTTP_NOT_MODIFIED;
- r->headers_out.status_line.len = 0;
- r->headers_out.content_type.len = 0;
- ngx_http_clear_content_length(r);
- ngx_http_clear_accept_ranges(r);
-
- if (r->headers_out.content_encoding) {
- r->headers_out.content_encoding->hash = 0;
- r->headers_out.content_encoding = NULL;
- }
-
- return ngx_http_next_header_filter(r);
+ if (r->headers_out.content_encoding) {
+ r->headers_out.content_encoding->hash = 0;
+ r->headers_out.content_encoding = NULL;
}
return ngx_http_next_header_filter(r);
More information about the nginx-devel
mailing list