[nginx] Entity tags: downgrade strong etags to weak ones as needed.

Aaron Peschel aaron.peschel at gmail.com
Mon Jul 21 16:48:02 UTC 2014


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



More information about the nginx-devel mailing list