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:
Maxim Dounin 2014-06-26 02:21:01 +04:00
parent 5d477a76fe
commit def16742a1
8 changed files with 56 additions and 7 deletions

View File

@ -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);
} }

View File

@ -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);
} }

View File

@ -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);
} }

View File

@ -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);
} }
} }

View File

@ -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);
} }
} }

View File

@ -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);
} }
} }

View File

@ -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)

View File

@ -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,