Mercurial > hg > nginx
changeset 3814:e6e453203bae
"If-Unmodified-Since" support
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Mon, 06 Dec 2010 11:11:05 +0000 |
parents | c870fb78550c |
children | c6a5bae994f6 |
files | src/http/modules/ngx_http_not_modified_filter_module.c src/http/ngx_http_request.c src/http/ngx_http_request.h |
diffstat | 3 files changed, 45 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/src/http/modules/ngx_http_not_modified_filter_module.c Thu Dec 02 14:20:51 2010 +0000 +++ b/src/http/modules/ngx_http_not_modified_filter_module.c Mon Dec 06 11:11:05 2010 +0000 @@ -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,16 +51,50 @@ 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);
--- a/src/http/ngx_http_request.c Thu Dec 02 14:20:51 2010 +0000 +++ b/src/http/ngx_http_request.c Mon Dec 06 11:11:05 2010 +0000 @@ -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 },
--- a/src/http/ngx_http_request.h Thu Dec 02 14:20:51 2010 +0000 +++ b/src/http/ngx_http_request.h Mon Dec 06 11:11:05 2010 +0000 @@ -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;