11
11
static ngx_int_t ngx_http_srcache_fetch_subrequest (ngx_http_request_t * r ,
12
12
ngx_http_srcache_loc_conf_t * conf , ngx_http_srcache_ctx_t * ctx );
13
13
14
+ static ngx_int_t ngx_http_srcache_fetch_header_filter (ngx_http_request_t * r );
15
+
16
+ static ngx_int_t ngx_http_srcache_test_not_modified (ngx_http_request_t * r );
17
+
18
+ static ngx_int_t ngx_http_srcache_test_precondition (ngx_http_request_t * r );
19
+
14
20
15
21
ngx_int_t
16
22
ngx_http_srcache_access_handler (ngx_http_request_t * r )
@@ -144,15 +150,20 @@ ngx_http_srcache_access_handler(ngx_http_request_t *r)
144
150
145
151
r -> headers_out .content_length_n = len ;
146
152
147
- rc = ngx_http_srcache_next_header_filter (r );
153
+ rc = ngx_http_srcache_fetch_header_filter (r );
148
154
149
- if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE ) {
155
+ if (rc == NGX_ERROR || rc > NGX_OK || r -> header_only ) {
150
156
return rc ;
151
157
}
152
158
153
159
rc = ngx_http_srcache_next_body_filter (r , ctx -> body_from_cache );
154
160
155
- if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE ) {
161
+ if (rc == NGX_ERROR ) {
162
+ r -> connection -> error = 1 ;
163
+ return NGX_ERROR ;
164
+ }
165
+
166
+ if (rc > NGX_OK ) {
156
167
return rc ;
157
168
}
158
169
@@ -161,9 +172,9 @@ ngx_http_srcache_access_handler(ngx_http_request_t *r)
161
172
} else {
162
173
r -> headers_out .content_length_n = 0 ;
163
174
164
- rc = ngx_http_srcache_next_header_filter (r );
175
+ rc = ngx_http_srcache_fetch_header_filter (r );
165
176
166
- if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE ) {
177
+ if (rc == NGX_ERROR || rc > NGX_OK || r -> header_only ) {
167
178
return rc ;
168
179
}
169
180
@@ -178,7 +189,12 @@ ngx_http_srcache_access_handler(ngx_http_request_t *r)
178
189
179
190
rc = ngx_http_srcache_next_body_filter (r , cl );
180
191
181
- if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE ) {
192
+ if (rc == NGX_ERROR ) {
193
+ r -> connection -> error = 1 ;
194
+ return NGX_ERROR ;
195
+ }
196
+
197
+ if (rc > NGX_OK ) {
182
198
return rc ;
183
199
}
184
200
@@ -393,5 +409,85 @@ ngx_http_srcache_fetch_subrequest(ngx_http_request_t *r,
393
409
}
394
410
395
411
412
+ static ngx_int_t
413
+ ngx_http_srcache_fetch_header_filter (ngx_http_request_t * r )
414
+ {
415
+ if (r -> headers_out .status != NGX_HTTP_OK
416
+ || r -> headers_out .last_modified_time == -1 )
417
+ {
418
+ return ngx_http_srcache_next_header_filter (r );
419
+ }
420
+
421
+ if (r -> headers_in .if_unmodified_since ) {
422
+ return ngx_http_srcache_test_precondition (r );
423
+ }
424
+
425
+ if (r -> headers_in .if_modified_since ) {
426
+ return ngx_http_srcache_test_not_modified (r );
427
+ }
428
+
429
+ return ngx_http_srcache_next_header_filter (r );
430
+ }
431
+
432
+
433
+ static ngx_int_t
434
+ ngx_http_srcache_test_not_modified (ngx_http_request_t * r )
435
+ {
436
+ time_t ims ;
437
+ ngx_http_core_loc_conf_t * clcf ;
438
+
439
+ clcf = ngx_http_get_module_loc_conf (r , ngx_http_core_module );
440
+
441
+ if (clcf -> if_modified_since == NGX_HTTP_IMS_OFF ) {
442
+ return ngx_http_srcache_next_header_filter (r );
443
+ }
444
+
445
+ ims = ngx_http_parse_time (r -> headers_in .if_modified_since -> value .data ,
446
+ r -> headers_in .if_modified_since -> value .len );
447
+
448
+ ngx_log_debug2 (NGX_LOG_DEBUG_HTTP , r -> connection -> log , 0 ,
449
+ "http ims:%d lm:%d" , ims , r -> headers_out .last_modified_time );
450
+
451
+ if (ims != r -> headers_out .last_modified_time ) {
452
+
453
+ if (clcf -> if_modified_since == NGX_HTTP_IMS_EXACT
454
+ || ims < r -> headers_out .last_modified_time )
455
+ {
456
+ return ngx_http_srcache_next_header_filter (r );
457
+ }
458
+ }
459
+
460
+ r -> headers_out .status = NGX_HTTP_NOT_MODIFIED ;
461
+ r -> headers_out .status_line .len = 0 ;
462
+ r -> headers_out .content_type .len = 0 ;
463
+ ngx_http_clear_content_length (r );
464
+ ngx_http_clear_accept_ranges (r );
465
+
466
+ if (r -> headers_out .content_encoding ) {
467
+ r -> headers_out .content_encoding -> hash = 0 ;
468
+ r -> headers_out .content_encoding = NULL ;
469
+ }
470
+
471
+ return ngx_http_srcache_next_header_filter (r );
472
+ }
473
+
474
+
475
+ static ngx_int_t
476
+ ngx_http_srcache_test_precondition (ngx_http_request_t * r )
477
+ {
478
+ time_t iums ;
396
479
480
+ iums = ngx_http_parse_time (r -> headers_in .if_unmodified_since -> value .data ,
481
+ r -> headers_in .if_unmodified_since -> value .len );
482
+
483
+ ngx_log_debug2 (NGX_LOG_DEBUG_HTTP , r -> connection -> log , 0 ,
484
+ "http iums:%d lm:%d" , iums , r -> headers_out .last_modified_time );
485
+
486
+ if (iums >= r -> headers_out .last_modified_time ) {
487
+ return ngx_http_srcache_next_header_filter (r );
488
+ }
489
+
490
+ return ngx_http_filter_finalize_request (r , NULL ,
491
+ NGX_HTTP_PRECONDITION_FAILED );
492
+ }
397
493
0 commit comments