diff --git a/src/ngx_pagespeed.cc b/src/ngx_pagespeed.cc index 965f9ed4a..1a3f538fd 100644 --- a/src/ngx_pagespeed.cc +++ b/src/ngx_pagespeed.cc @@ -572,6 +572,10 @@ ngx_int_t copy_response_headers_to_ngx( continue; } else if (STR_EQ_LITERAL(name, "Transfer-Encoding")) { continue; + } else if (STR_EQ_LITERAL(name, "Vary") && value.len + && STR_EQ_LITERAL(value, "Accept-Encoding")) { + ps_request_ctx_t* ctx = ps_get_request_context(r); + ctx->psol_vary_accept_only = true; } u_char* name_s = ngx_pstrdup(r->pool, &name); @@ -1282,6 +1286,7 @@ ngx_int_t ps_decline_request(ngx_http_request_t* r) { ctx->driver->Cleanup(); ctx->driver = NULL; ctx->location_field_set = false; + ctx->psol_vary_accept_only = false; // re init ctx ctx->html_rewrite = true; @@ -1852,6 +1857,7 @@ ngx_int_t ps_resource_handler(ngx_http_request_t* r, ctx->recorder = NULL; ctx->url_string = url_string; ctx->location_field_set = false; + ctx->psol_vary_accept_only = false; // Set up a cleanup handler on the request. ngx_http_cleanup_t* cleanup = ngx_http_cleanup_add(r, 0); @@ -2169,6 +2175,13 @@ ngx_int_t ps_etag_header_filter(ngx_http_request_t* r) { break; } } + + ps_request_ctx_t* ctx = ps_get_request_context(r); +#if (NGX_HTTP_GZIP) + if (ctx && ctx->psol_vary_accept_only) { + r->gzip_vary = 0; + } +#endif return ngx_http_ef_next_header_filter(r); } diff --git a/src/ngx_pagespeed.h b/src/ngx_pagespeed.h index cae895a8a..a531bc3ed 100644 --- a/src/ngx_pagespeed.h +++ b/src/ngx_pagespeed.h @@ -108,6 +108,7 @@ typedef struct { // we should mirror that when we write it back. nginx may absolutify // Location: headers that start with '/' without regarding X-Forwarded-Proto. bool location_field_set; + bool psol_vary_accept_only; } ps_request_ctx_t; ps_request_ctx_t* ps_get_request_context(ngx_http_request_t* r); diff --git a/test/nginx_system_test.sh b/test/nginx_system_test.sh index e882b0640..70a3e74c0 100644 --- a/test/nginx_system_test.sh +++ b/test/nginx_system_test.sh @@ -1248,6 +1248,22 @@ OUT=$(http_proxy=$SECONDARY_HOSTNAME $WGET_DUMP -O /dev/null -S $URL 2>&1) || tr # We ignored the exit code, check if we got a 404 response. check_from "$OUT" fgrep -qi '404' +start_test Single Vary: Accept-Encoding header in IPRO flow +URL=http://psol-vary.example.com/mod_pagespeed_example/styles/index_style.css +OUT=$(http_proxy=$SECONDARY_HOSTNAME $WGET_DUMP -O /dev/null -S $URL 2>&1) +# First hit will be recorded and passed on untouched +MATCHES=$(echo "$OUT" | grep -c "Vary: Accept-Encoding") || true +check [ $MATCHES -eq 1 ] + +# Fetch until we get a fully optimized response +http_proxy=$SECONDARY_HOSTNAME \ + fetch_until $URL "fgrep -c W/\"PSA" 1 --save-headers + +# Test the optimized response. +OUT=$(http_proxy=$SECONDARY_HOSTNAME $WGET_DUMP -O /dev/null -S $URL 2>&1) +MATCHES=$(echo "$OUT" | grep -c "Vary: Accept-Encoding") || true +check [ $MATCHES -eq 1 ] + start_test Shutting down. # Fire up some heavy load if ab is available to test a stressed shutdown diff --git a/test/pagespeed_test.conf.template b/test/pagespeed_test.conf.template index 6bdbf0a71..4cc42375d 100644 --- a/test/pagespeed_test.conf.template +++ b/test/pagespeed_test.conf.template @@ -1471,6 +1471,14 @@ http { pagespeed GlobalAdminDomains Allow everything-explicitly-allowed.example.com; } + server { + listen @@SECONDARY_PORT@@; + listen [::]:@@SECONDARY_PORT@@; + server_name psol-vary.example.com; + pagespeed on; + pagespeed InPlaceResourceOptimization on; + pagespeed FileCachePath "@@FILE_CACHE@@"; + } server { listen @@PRIMARY_PORT@@;