[nginx] Entity tags: downgrade strong etags to weak ones as needed.
Albert Casademont Filella
albertcasademont at gmail.com
Wed Aug 6 09:46:22 UTC 2014
yup, just tested this today and works like a charm, thanks!
On Mon, Jul 21, 2014 at 6:48 PM, Aaron Peschel <aaron.peschel at gmail.com>
wrote:
> Thank you for your help through this whole process, Maxim!
>
> On Wed, Jun 25, 2014 at 3:40 PM, Maxim Dounin <mdounin at mdounin.ru> wrote:
> > details: http://hg.nginx.org/nginx/rev/e491b26fa5a1
> > branches:
> > changeset: 5733:e491b26fa5a1
> > user: Maxim Dounin <mdounin at mdounin.ru>
> > date: Thu Jun 26 02:21:01 2014 +0400
> > description:
> > Entity tags: downgrade strong etags to weak ones as needed.
> >
> > See
> http://mailman.nginx.org/pipermail/nginx-devel/2013-November/004523.html.
> >
> > diffstat:
> >
> > src/http/modules/ngx_http_addition_filter_module.c | 2 +-
> > src/http/modules/ngx_http_gunzip_filter_module.c | 2 +-
> > src/http/modules/ngx_http_gzip_filter_module.c | 2 +-
> > src/http/modules/ngx_http_ssi_filter_module.c | 5 ++-
> > src/http/modules/ngx_http_sub_filter_module.c | 5 ++-
> > src/http/modules/ngx_http_xslt_filter_module.c | 6 ++-
> > src/http/ngx_http_core_module.c | 40
> ++++++++++++++++++++++
> > src/http/ngx_http_core_module.h | 1 +
> > 8 files changed, 56 insertions(+), 7 deletions(-)
> >
> > diffs (153 lines):
> >
> > diff --git a/src/http/modules/ngx_http_addition_filter_module.c
> b/src/http/modules/ngx_http_addition_filter_module.c
> > --- a/src/http/modules/ngx_http_addition_filter_module.c
> > +++ b/src/http/modules/ngx_http_addition_filter_module.c
> > @@ -121,7 +121,7 @@ ngx_http_addition_header_filter(ngx_http
> >
> > ngx_http_clear_content_length(r);
> > ngx_http_clear_accept_ranges(r);
> > - ngx_http_clear_etag(r);
> > + ngx_http_weak_etag(r);
> >
> > return ngx_http_next_header_filter(r);
> > }
> > diff --git a/src/http/modules/ngx_http_gunzip_filter_module.c
> b/src/http/modules/ngx_http_gunzip_filter_module.c
> > --- a/src/http/modules/ngx_http_gunzip_filter_module.c
> > +++ b/src/http/modules/ngx_http_gunzip_filter_module.c
> > @@ -165,7 +165,7 @@ ngx_http_gunzip_header_filter(ngx_http_r
> >
> > ngx_http_clear_content_length(r);
> > ngx_http_clear_accept_ranges(r);
> > - ngx_http_clear_etag(r);
> > + ngx_http_weak_etag(r);
> >
> > return ngx_http_next_header_filter(r);
> > }
> > diff --git a/src/http/modules/ngx_http_gzip_filter_module.c
> b/src/http/modules/ngx_http_gzip_filter_module.c
> > --- a/src/http/modules/ngx_http_gzip_filter_module.c
> > +++ b/src/http/modules/ngx_http_gzip_filter_module.c
> > @@ -306,7 +306,7 @@ ngx_http_gzip_header_filter(ngx_http_req
> >
> > ngx_http_clear_content_length(r);
> > ngx_http_clear_accept_ranges(r);
> > - ngx_http_clear_etag(r);
> > + ngx_http_weak_etag(r);
> >
> > return ngx_http_next_header_filter(r);
> > }
> > diff --git a/src/http/modules/ngx_http_ssi_filter_module.c
> b/src/http/modules/ngx_http_ssi_filter_module.c
> > --- a/src/http/modules/ngx_http_ssi_filter_module.c
> > +++ b/src/http/modules/ngx_http_ssi_filter_module.c
> > @@ -369,10 +369,13 @@ ngx_http_ssi_header_filter(ngx_http_requ
> > if (r == r->main) {
> > ngx_http_clear_content_length(r);
> > ngx_http_clear_accept_ranges(r);
> > - ngx_http_clear_etag(r);
> >
> > if (!slcf->last_modified) {
> > ngx_http_clear_last_modified(r);
> > + ngx_http_clear_etag(r);
> > +
> > + } else {
> > + ngx_http_weak_etag(r);
> > }
> > }
> >
> > diff --git a/src/http/modules/ngx_http_sub_filter_module.c
> b/src/http/modules/ngx_http_sub_filter_module.c
> > --- a/src/http/modules/ngx_http_sub_filter_module.c
> > +++ b/src/http/modules/ngx_http_sub_filter_module.c
> > @@ -175,10 +175,13 @@ ngx_http_sub_header_filter(ngx_http_requ
> >
> > if (r == r->main) {
> > ngx_http_clear_content_length(r);
> > - ngx_http_clear_etag(r);
> >
> > if (!slcf->last_modified) {
> > ngx_http_clear_last_modified(r);
> > + ngx_http_clear_etag(r);
> > +
> > + } else {
> > + ngx_http_weak_etag(r);
> > }
> > }
> >
> > diff --git a/src/http/modules/ngx_http_xslt_filter_module.c
> b/src/http/modules/ngx_http_xslt_filter_module.c
> > --- a/src/http/modules/ngx_http_xslt_filter_module.c
> > +++ b/src/http/modules/ngx_http_xslt_filter_module.c
> > @@ -337,12 +337,14 @@ ngx_http_xslt_send(ngx_http_request_t *r
> > r->headers_out.content_length = NULL;
> > }
> >
> > - ngx_http_clear_etag(r);
> > -
> > conf = ngx_http_get_module_loc_conf(r,
> ngx_http_xslt_filter_module);
> >
> > if (!conf->last_modified) {
> > ngx_http_clear_last_modified(r);
> > + ngx_http_clear_etag(r);
> > +
> > + } else {
> > + ngx_http_weak_etag(r);
> > }
> > }
> >
> > diff --git a/src/http/ngx_http_core_module.c
> b/src/http/ngx_http_core_module.c
> > --- a/src/http/ngx_http_core_module.c
> > +++ b/src/http/ngx_http_core_module.c
> > @@ -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_http_send_response(ngx_http_request_t *r, ngx_uint_t status,
> > ngx_str_t *ct, ngx_http_complex_value_t *cv)
> > diff --git a/src/http/ngx_http_core_module.h
> b/src/http/ngx_http_core_module.h
> > --- a/src/http/ngx_http_core_module.h
> > +++ b/src/http/ngx_http_core_module.h
> > @@ -501,6 +501,7 @@ void *ngx_http_test_content_type(ngx_htt
> > ngx_int_t ngx_http_set_content_type(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);
> > +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_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,
> >
> > _______________________________________________
> > nginx-devel mailing list
> > nginx-devel at nginx.org
> > http://mailman.nginx.org/mailman/listinfo/nginx-devel
>
> _______________________________________________
> nginx-devel mailing list
> nginx-devel at nginx.org
> http://mailman.nginx.org/mailman/listinfo/nginx-devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.nginx.org/pipermail/nginx-devel/attachments/20140806/702b4fdf/attachment.html>
More information about the nginx-devel
mailing list