"If-Unmodified-Since" support

This commit is contained in:
Igor Sysoev 2010-12-06 11:11:05 +00:00
parent 0c39c27412
commit ec4df838c8
3 changed files with 45 additions and 5 deletions

View File

@ -9,7 +9,8 @@
#include <ngx_http.h> #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); static ngx_int_t ngx_http_not_modified_filter_init(ngx_conf_t *cf);
@ -50,16 +51,50 @@ static ngx_http_output_header_filter_pt ngx_http_next_header_filter;
static ngx_int_t static ngx_int_t
ngx_http_not_modified_header_filter(ngx_http_request_t *r) 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 if (r->headers_out.status != NGX_HTTP_OK
|| r != r->main || r != r->main
|| r->headers_in.if_modified_since == NULL
|| r->headers_out.last_modified_time == -1) || r->headers_out.last_modified_time == -1)
{ {
return ngx_http_next_header_filter(r); 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); clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);

View File

@ -88,6 +88,10 @@ ngx_http_header_t ngx_http_headers_in[] = {
offsetof(ngx_http_headers_in_t, if_modified_since), offsetof(ngx_http_headers_in_t, if_modified_since),
ngx_http_process_unique_header_line }, 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_string("User-Agent"), offsetof(ngx_http_headers_in_t, user_agent),
ngx_http_process_user_agent }, ngx_http_process_user_agent },

View File

@ -167,6 +167,7 @@ typedef struct {
ngx_table_elt_t *host; ngx_table_elt_t *host;
ngx_table_elt_t *connection; ngx_table_elt_t *connection;
ngx_table_elt_t *if_modified_since; ngx_table_elt_t *if_modified_since;
ngx_table_elt_t *if_unmodified_since;
ngx_table_elt_t *user_agent; ngx_table_elt_t *user_agent;
ngx_table_elt_t *referer; ngx_table_elt_t *referer;
ngx_table_elt_t *content_length; ngx_table_elt_t *content_length;