mirror of
https://github.com/nginx/nginx.git
synced 2025-06-08 02:02:38 +08:00
Entity tags: downgrade strong etags to weak ones as needed.
See http://mailman.nginx.org/pipermail/nginx-devel/2013-November/004523.html.
This commit is contained in:
parent
5d477a76fe
commit
def16742a1
@ -121,7 +121,7 @@ ngx_http_addition_header_filter(ngx_http_request_t *r)
|
|||||||
|
|
||||||
ngx_http_clear_content_length(r);
|
ngx_http_clear_content_length(r);
|
||||||
ngx_http_clear_accept_ranges(r);
|
ngx_http_clear_accept_ranges(r);
|
||||||
ngx_http_clear_etag(r);
|
ngx_http_weak_etag(r);
|
||||||
|
|
||||||
return ngx_http_next_header_filter(r);
|
return ngx_http_next_header_filter(r);
|
||||||
}
|
}
|
||||||
|
@ -165,7 +165,7 @@ ngx_http_gunzip_header_filter(ngx_http_request_t *r)
|
|||||||
|
|
||||||
ngx_http_clear_content_length(r);
|
ngx_http_clear_content_length(r);
|
||||||
ngx_http_clear_accept_ranges(r);
|
ngx_http_clear_accept_ranges(r);
|
||||||
ngx_http_clear_etag(r);
|
ngx_http_weak_etag(r);
|
||||||
|
|
||||||
return ngx_http_next_header_filter(r);
|
return ngx_http_next_header_filter(r);
|
||||||
}
|
}
|
||||||
|
@ -306,7 +306,7 @@ ngx_http_gzip_header_filter(ngx_http_request_t *r)
|
|||||||
|
|
||||||
ngx_http_clear_content_length(r);
|
ngx_http_clear_content_length(r);
|
||||||
ngx_http_clear_accept_ranges(r);
|
ngx_http_clear_accept_ranges(r);
|
||||||
ngx_http_clear_etag(r);
|
ngx_http_weak_etag(r);
|
||||||
|
|
||||||
return ngx_http_next_header_filter(r);
|
return ngx_http_next_header_filter(r);
|
||||||
}
|
}
|
||||||
|
@ -369,10 +369,13 @@ ngx_http_ssi_header_filter(ngx_http_request_t *r)
|
|||||||
if (r == r->main) {
|
if (r == r->main) {
|
||||||
ngx_http_clear_content_length(r);
|
ngx_http_clear_content_length(r);
|
||||||
ngx_http_clear_accept_ranges(r);
|
ngx_http_clear_accept_ranges(r);
|
||||||
ngx_http_clear_etag(r);
|
|
||||||
|
|
||||||
if (!slcf->last_modified) {
|
if (!slcf->last_modified) {
|
||||||
ngx_http_clear_last_modified(r);
|
ngx_http_clear_last_modified(r);
|
||||||
|
ngx_http_clear_etag(r);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
ngx_http_weak_etag(r);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -175,10 +175,13 @@ ngx_http_sub_header_filter(ngx_http_request_t *r)
|
|||||||
|
|
||||||
if (r == r->main) {
|
if (r == r->main) {
|
||||||
ngx_http_clear_content_length(r);
|
ngx_http_clear_content_length(r);
|
||||||
ngx_http_clear_etag(r);
|
|
||||||
|
|
||||||
if (!slcf->last_modified) {
|
if (!slcf->last_modified) {
|
||||||
ngx_http_clear_last_modified(r);
|
ngx_http_clear_last_modified(r);
|
||||||
|
ngx_http_clear_etag(r);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
ngx_http_weak_etag(r);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -337,12 +337,14 @@ ngx_http_xslt_send(ngx_http_request_t *r, ngx_http_xslt_filter_ctx_t *ctx,
|
|||||||
r->headers_out.content_length = NULL;
|
r->headers_out.content_length = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
ngx_http_clear_etag(r);
|
|
||||||
|
|
||||||
conf = ngx_http_get_module_loc_conf(r, ngx_http_xslt_filter_module);
|
conf = ngx_http_get_module_loc_conf(r, ngx_http_xslt_filter_module);
|
||||||
|
|
||||||
if (!conf->last_modified) {
|
if (!conf->last_modified) {
|
||||||
ngx_http_clear_last_modified(r);
|
ngx_http_clear_last_modified(r);
|
||||||
|
ngx_http_clear_etag(r);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
ngx_http_weak_etag(r);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1851,6 +1851,46 @@ ngx_http_set_etag(ngx_http_request_t *r)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
ngx_http_weak_etag(ngx_http_request_t *r)
|
||||||
|
{
|
||||||
|
size_t len;
|
||||||
|
u_char *p;
|
||||||
|
ngx_table_elt_t *etag;
|
||||||
|
|
||||||
|
etag = r->headers_out.etag;
|
||||||
|
|
||||||
|
if (etag == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (etag->value.len > 2
|
||||||
|
&& etag->value.data[0] == 'W'
|
||||||
|
&& etag->value.data[1] == '/')
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (etag->value.len < 1 || etag->value.data[0] != '"') {
|
||||||
|
r->headers_out.etag->hash = 0;
|
||||||
|
r->headers_out.etag = NULL;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
p = ngx_pnalloc(r->pool, etag->value.len + 2);
|
||||||
|
if (p == NULL) {
|
||||||
|
r->headers_out.etag->hash = 0;
|
||||||
|
r->headers_out.etag = NULL;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
len = ngx_sprintf(p, "W/%V", &etag->value) - p;
|
||||||
|
|
||||||
|
etag->value.data = p;
|
||||||
|
etag->value.len = len;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
ngx_int_t
|
ngx_int_t
|
||||||
ngx_http_send_response(ngx_http_request_t *r, ngx_uint_t status,
|
ngx_http_send_response(ngx_http_request_t *r, ngx_uint_t status,
|
||||||
ngx_str_t *ct, ngx_http_complex_value_t *cv)
|
ngx_str_t *ct, ngx_http_complex_value_t *cv)
|
||||||
|
@ -501,6 +501,7 @@ void *ngx_http_test_content_type(ngx_http_request_t *r, ngx_hash_t *types_hash);
|
|||||||
ngx_int_t ngx_http_set_content_type(ngx_http_request_t *r);
|
ngx_int_t ngx_http_set_content_type(ngx_http_request_t *r);
|
||||||
void ngx_http_set_exten(ngx_http_request_t *r);
|
void ngx_http_set_exten(ngx_http_request_t *r);
|
||||||
ngx_int_t ngx_http_set_etag(ngx_http_request_t *r);
|
ngx_int_t ngx_http_set_etag(ngx_http_request_t *r);
|
||||||
|
void ngx_http_weak_etag(ngx_http_request_t *r);
|
||||||
ngx_int_t ngx_http_send_response(ngx_http_request_t *r, ngx_uint_t status,
|
ngx_int_t ngx_http_send_response(ngx_http_request_t *r, ngx_uint_t status,
|
||||||
ngx_str_t *ct, ngx_http_complex_value_t *cv);
|
ngx_str_t *ct, ngx_http_complex_value_t *cv);
|
||||||
u_char *ngx_http_map_uri_to_path(ngx_http_request_t *r, ngx_str_t *name,
|
u_char *ngx_http_map_uri_to_path(ngx_http_request_t *r, ngx_str_t *name,
|
||||||
|
Loading…
Reference in New Issue
Block a user