If-Unmodified-Since
Igor Sysoev
igor at sysoev.ru
Thu Dec 2 17:43:28 MSK 2010
On Thu, Dec 02, 2010 at 03:28:27PM +0300, Igor Sysoev wrote:
> On Wed, Dec 01, 2010 at 07:56:56PM -0500, Jeff Mitchell wrote:
>
> > It appears from documentation and Googling that nginx supports the
> > If-Modified-Since header but not the If-Unmodified-Since header; are
> > there any plans to add support?
>
> nginx does not support If-Unmodified-Since.
> I believe it's easy to add it, but are clients which support the header ?
The attached patch adds If-Unmodified-Since support.
--
Igor Sysoev
http://sysoev.ru/en/
-------------- next part --------------
Index: src/http/ngx_http_request.c
===================================================================
--- src/http/ngx_http_request.c (revision 3133)
+++ src/http/ngx_http_request.c (working copy)
@@ -88,6 +88,10 @@
offsetof(ngx_http_headers_in_t, if_modified_since),
ngx_http_process_unique_header_line },
+ { ngx_string("If-Unmodified-Since"),
+ offsetof(ngx_http_headers_in_t, if_unmodified_since),
+ ngx_http_process_unique_header_line },
+
{ ngx_string("User-Agent"), offsetof(ngx_http_headers_in_t, user_agent),
ngx_http_process_user_agent },
Index: src/http/ngx_http_request.h
===================================================================
--- src/http/ngx_http_request.h (revision 3133)
+++ src/http/ngx_http_request.h (working copy)
@@ -167,6 +167,7 @@
ngx_table_elt_t *host;
ngx_table_elt_t *connection;
ngx_table_elt_t *if_modified_since;
+ ngx_table_elt_t *if_unmodified_since;
ngx_table_elt_t *user_agent;
ngx_table_elt_t *referer;
ngx_table_elt_t *content_length;
Index: src/http/modules/ngx_http_not_modified_filter_module.c
===================================================================
--- src/http/modules/ngx_http_not_modified_filter_module.c (revision 3133)
+++ src/http/modules/ngx_http_not_modified_filter_module.c (working copy)
@@ -9,7 +9,8 @@
#include <ngx_http.h>
-
+static ngx_int_t ngx_http_test_precondition(ngx_http_request_t *r);
+static ngx_int_t ngx_http_test_not_modified(ngx_http_request_t *r);
static ngx_int_t ngx_http_not_modified_filter_init(ngx_conf_t *cf);
@@ -50,17 +51,51 @@
static ngx_int_t
ngx_http_not_modified_header_filter(ngx_http_request_t *r)
{
- time_t ims;
- ngx_http_core_loc_conf_t *clcf;
-
if (r->headers_out.status != NGX_HTTP_OK
|| r != r->main
- || r->headers_in.if_modified_since == NULL
|| r->headers_out.last_modified_time == -1)
{
return ngx_http_next_header_filter(r);
}
+
+ if (r->headers_in.if_unmodified_since) {
+ return ngx_http_test_precondition(r);
+ }
+
+ if (r->headers_in.if_modified_since) {
+ return ngx_http_test_not_modified(r);
+ }
+ return ngx_http_next_header_filter(r);
+}
+
+
+static ngx_int_t
+ngx_http_test_precondition(ngx_http_request_t *r)
+{
+ time_t iums;
+
+ iums = ngx_http_parse_time(r->headers_in.if_unmodified_since->value.data,
+ r->headers_in.if_unmodified_since->value.len);
+
+ ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
+ "http iums:%d lm:%d", iums, r->headers_out.last_modified_time);
+
+ if (iums >= r->headers_out.last_modified_time) {
+ return ngx_http_next_header_filter(r);
+ }
+
+ return ngx_http_filter_finalize_request(r, NULL,
+ NGX_HTTP_PRECONDITION_FAILED);
+}
+
+
+static ngx_int_t
+ngx_http_test_not_modified(ngx_http_request_t *r)
+{
+ time_t ims;
+ ngx_http_core_loc_conf_t *clcf;
+
clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
if (clcf->if_modified_since == NGX_HTTP_IMS_OFF) {
More information about the nginx
mailing list