Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nginx/nginx.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/http/modules/ngx_http_not_modified_filter_module.c')
-rw-r--r--src/http/modules/ngx_http_not_modified_filter_module.c45
1 files changed, 40 insertions, 5 deletions
diff --git a/src/http/modules/ngx_http_not_modified_filter_module.c b/src/http/modules/ngx_http_not_modified_filter_module.c
index 705815740..b03d67dee 100644
--- a/src/http/modules/ngx_http_not_modified_filter_module.c
+++ b/src/http/modules/ngx_http_not_modified_filter_module.c
@@ -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_http_output_header_filter_pt ngx_http_next_header_filter;
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);