This is an automated email from the ASF dual-hosted git repository.

cmcfarlen pushed a commit to branch 10.0.x
in repository https://gitbox.apache.org/repos/asf/trafficserver.git

commit ef58f4674409232e0b98e92ecf96922187c3dca9
Author: Masakazu Kitajo <[email protected]>
AuthorDate: Tue Jul 23 11:19:45 2024 -0600

    Normalized ae cache lookup before cache lookup  (#11594)
    
    * Normalize Accept-Encoding header value before cache lookup
    
    Co-authored-by: Min Chen <[email protected]>
    
    * Fix typos and use f-strings for formatting
    
    * fix errors in the previous commit
    
    * Remove select_ports
    
    ---------
    
    Co-authored-by: Min Chen <[email protected]>
    (cherry picked from commit 4122abd9272d49cb4ed87d479e1febb0f1c7c1da)
---
 include/proxy/http/HttpTransact.h                  |   2 +
 src/proxy/http/HttpSM.cc                           |   6 +-
 .../headers/normalized_ae_match_vary_cache.test.py |  67 ++
 .../normalized_ae_varied_transactions.replay.yaml  | 813 +++++++++++++++++++++
 4 files changed, 886 insertions(+), 2 deletions(-)

diff --git a/include/proxy/http/HttpTransact.h 
b/include/proxy/http/HttpTransact.h
index 00df25eefe..e673005a8c 100644
--- a/include/proxy/http/HttpTransact.h
+++ b/include/proxy/http/HttpTransact.h
@@ -664,6 +664,7 @@ public:
     HTTPHdr         server_request;
     HTTPHdr         server_response;
     HTTPHdr         transform_response;
+    HTTPHdr         cache_request;
     HTTPHdr         cache_response;
     int64_t         request_content_length     = HTTP_UNDEFINED_CL;
     int64_t         response_content_length    = HTTP_UNDEFINED_CL;
@@ -902,6 +903,7 @@ public:
       hdr_info.server_request.destroy();
       hdr_info.server_response.destroy();
       hdr_info.transform_response.destroy();
+      hdr_info.cache_request.destroy();
       hdr_info.cache_response.destroy();
       cache_info.lookup_url_storage.destroy();
       cache_info.parent_selection_url_storage.destroy();
diff --git a/src/proxy/http/HttpSM.cc b/src/proxy/http/HttpSM.cc
index 13b3b3c6f1..5c911f84a4 100644
--- a/src/proxy/http/HttpSM.cc
+++ b/src/proxy/http/HttpSM.cc
@@ -4948,8 +4948,10 @@ HttpSM::do_cache_lookup_and_read()
   HttpCacheKey key;
   Cache::generate_key(&key, c_url, t_state.txn_conf->cache_ignore_query, 
t_state.txn_conf->cache_generation_number);
 
+  t_state.hdr_info.cache_request.copy(&t_state.hdr_info.client_request);
+  HttpTransactHeaders::normalize_accept_encoding(t_state.txn_conf, 
&t_state.hdr_info.cache_request);
   pending_action = cache_sm.open_read(
-    &key, c_url, &t_state.hdr_info.client_request, t_state.txn_conf,
+    &key, c_url, &t_state.hdr_info.cache_request, t_state.txn_conf,
     static_cast<time_t>((t_state.cache_control.pin_in_cache_for < 0) ? 0 : 
t_state.cache_control.pin_in_cache_for));
   //
   // pin_in_cache value is an open_write parameter.
@@ -5053,7 +5055,7 @@ HttpSM::do_cache_prepare_action(HttpCacheSM *c_sm, 
CacheHTTPInfo *object_read_in
   Cache::generate_key(&key, s_url, t_state.txn_conf->cache_ignore_query, 
t_state.txn_conf->cache_generation_number);
 
   pending_action =
-    c_sm->open_write(&key, s_url, &t_state.hdr_info.client_request, 
object_read_info,
+    c_sm->open_write(&key, s_url, &t_state.hdr_info.cache_request, 
object_read_info,
                      
static_cast<time_t>((t_state.cache_control.pin_in_cache_for < 0) ? 0 : 
t_state.cache_control.pin_in_cache_for),
                      retry, allow_multiple);
 }
diff --git a/tests/gold_tests/headers/normalized_ae_match_vary_cache.test.py 
b/tests/gold_tests/headers/normalized_ae_match_vary_cache.test.py
new file mode 100644
index 0000000000..991d2fda32
--- /dev/null
+++ b/tests/gold_tests/headers/normalized_ae_match_vary_cache.test.py
@@ -0,0 +1,67 @@
+'''
+Test cache matching with the normalized Accept-Encoding header field
+and the Vary header field in response
+'''
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+#  Unless required by applicable law or agreed to in writing, software
+#  distributed under the License is distributed on an "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#  See the License for the specific language governing permissions and
+#  limitations under the License.
+
+import os
+
+Test.Summary = '''
+Test cache matching with the normalized Accept-Encoding and the Vary header 
field in response
+'''
+
+Test.ContinueOnFail = True
+
+testName = "NORMALIZE_AE_MATCH_VARY"
+
+replay_file = "replays/normalized_ae_varied_transactions.replay.yaml"
+server = Test.MakeVerifierServerProcess("server", replay_file)
+
+ts = Test.MakeATSProcess("ts", enable_cache=True)
+ts.Disk.remap_config.AddLine(
+    f"map http://www.ae-0.com http://127.0.0.1:{server.Variables.http_port}"; +
+    ' @plugin=conf_remap.so @pparam=proxy.config.http.normalize_ae=0')
+ts.Disk.remap_config.AddLine(
+    f"map http://www.ae-1.com http://127.0.0.1:{server.Variables.http_port}"; +
+    ' @plugin=conf_remap.so @pparam=proxy.config.http.normalize_ae=1')
+ts.Disk.remap_config.AddLine(
+    f"map http://www.ae-2.com http://127.0.0.1:{server.Variables.http_port}"; +
+    ' @plugin=conf_remap.so @pparam=proxy.config.http.normalize_ae=2')
+# disable normalize_ae=3 on 9.1
+ts.Disk.remap_config.AddLine(
+    f"map http://www.ae-3.com http://127.0.0.1:{server.Variables.http_port}"; +
+    ' @plugin=conf_remap.so @pparam=proxy.config.http.normalize_ae=3')
+ts.Disk.plugin_config.AddLine('xdebug.so --enable=x-cache')
+ts.Disk.records_config.update(
+    {
+        'proxy.config.diags.debug.enabled': 1,
+        'proxy.config.diags.debug.tags': 'http',
+        'proxy.config.http.response_via_str': 3,
+        # the following variables could affect the results of alternate cache 
matching,
+        # define them with their default values explicitly
+        'proxy.config.cache.limits.http.max_alts': 5,
+        'proxy.config.http.cache.ignore_accept_mismatch': 2,
+        'proxy.config.http.cache.ignore_accept_language_mismatch': 2,
+        'proxy.config.http.cache.ignore_accept_encoding_mismatch': 2,
+        'proxy.config.http.cache.ignore_accept_charset_mismatch': 2,
+    })
+
+tr = Test.AddTestRun()
+tr.Processes.Default.StartBefore(server)
+tr.Processes.Default.StartBefore(ts)
+tr.AddVerifierClientProcess("client", replay_file, 
http_ports=[ts.Variables.port])
+tr.StillRunningAfter = ts
diff --git 
a/tests/gold_tests/headers/replays/normalized_ae_varied_transactions.replay.yaml
 
b/tests/gold_tests/headers/replays/normalized_ae_varied_transactions.replay.yaml
new file mode 100644
index 0000000000..57842341a5
--- /dev/null
+++ 
b/tests/gold_tests/headers/replays/normalized_ae_varied_transactions.replay.yaml
@@ -0,0 +1,813 @@
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+#  Unless required by applicable law or agreed to in writing, software
+#  distributed under the License is distributed on an "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#  See the License for the specific language governing permissions and
+#  limitations under the License.
+
+meta:
+  version: "1.0"
+
+  blocks:
+
+  - 404_response: &404_response
+        status: 404
+        reason: "Not Found"
+        headers:
+          fields:
+          - [ Content-Length, 0 ]
+
+sessions:
+- transactions:
+
+  # Case 1 proxy.config.http.normalize_ae:0
+  # load an alternate of no Accept-Encoding header
+  - client-request:
+      method: "GET"
+      version: "1.1"
+      url: /case1
+      headers:
+        fields:
+        - [ Host, www.ae-0.com ]
+        - [ X-Debug, x-cache]
+        - [ uuid, 01 ]
+
+    server-response:
+      status: 200
+      reason: OK
+      headers:
+        fields:
+        - [ Transfer-Encoding, chunked ]
+        - [ Cache-Control, max-age=300 ]
+        - [ Vary, Accept-Encoding ]
+        - [ Connection, close ]
+        - [ X-Response-Identifier, No-Accept-Encoding ]
+      content:
+        encoding: plain
+        data: "no Accept-Encoding"
+
+    proxy-response:
+      status: 200
+      headers:
+        fields:
+        - [ X-Response-Identifier, { value: No-Accept-Encoding, as: equal } ]
+        - [ X-Cache, { value: miss, as: equal } ]
+
+  # load an alternate of empty Accept-Encoding header
+  - client-request:
+      method: "GET"
+      version: "1.1"
+      url: /case1
+      headers:
+        fields:
+        - [ Host, www.ae-0.com ]
+        - [ X-Debug, x-cache]
+        - [ Accept-Encoding, "" ]
+        - [ uuid, 02 ]
+      delay: 100ms
+
+    server-response:
+      status: 200
+      reason: OK
+      headers:
+        fields:
+        - [ Transfer-Encoding, chunked ]
+        - [ Cache-Control, max-age=300 ]
+        - [ Vary, Accept-Encoding ]
+        - [ Connection, close ]
+        - [ X-Response-Identifier, Empty-Accept-Encoding ]
+      content:
+        encoding: plain
+        data: "Empty Accept-Encoding"
+
+    proxy-response:
+      status: 200
+      headers:
+        fields:
+        - [ X-Response-Identifier, { value: Empty-Accept-Encoding, as: equal } 
]
+        - [ X-Cache, { value: miss, as: equal } ]
+
+  # Accept-Encoding header deflate would match the alternate of empty 
Accept-Encoding header
+  - client-request:
+      method: "GET"
+      version: "1.1"
+      url: /case1
+      headers:
+        fields:
+        - [ Host, www.ae-0.com ]
+        - [ X-Debug, x-cache]
+        - [ uuid, 03 ]
+        - [ Accept-Encoding, deflate ]
+      delay: 100ms
+
+    server-response:
+      <<: *404_response
+
+    proxy-response:
+      status: 200
+      headers:
+        fields:
+        - [ X-Response-Identifier, { value: Empty-Accept-Encoding, as: equal } 
]
+        - [ X-Cache, { value: hit-fresh, as: equal } ]
+
+  # Accept-Encoding header br, compress would match the alternate of empty 
Accept-Encoding header
+  - client-request:
+      method: "GET"
+      version: "1.1"
+      url: /case1
+      headers:
+        fields:
+        - [ Host, www.ae-0.com ]
+        - [ X-Debug, x-cache]
+        - [ uuid, 04 ]
+        - [ Accept-Encoding, "br, compress" ]
+      delay: 100ms
+
+    server-response:
+      <<: *404_response
+
+    proxy-response:
+      status: 200
+      headers:
+        fields:
+        - [ X-Response-Identifier, { value: Empty-Accept-Encoding, as: equal } 
]
+        - [ X-Cache, { value: hit-fresh, as: equal } ]
+
+  # load an alternate of gzip Accept-Encoding header
+  - client-request:
+      method: "GET"
+      version: "1.1"
+      url: /case1
+      headers:
+        fields:
+        - [ Host, www.ae-0.com ]
+        - [ X-Debug, x-cache]
+        - [ Accept-Encoding, gzip;q=0.8 ]
+        - [ uuid, 05 ]
+      delay: 100ms
+
+    server-response:
+      status: 200
+      reason: OK
+      headers:
+        fields:
+        - [ Transfer-Encoding, chunked ]
+        - [ Cache-Control, max-age=300 ]
+        - [ Vary, Accept-Encoding ]
+        - [ Connection, close ]
+        - [ X-Response-Identifier, Gzip-Accept-Encoding ]
+      content:
+        encoding: plain
+        data: "Gzip Accept-Encoding"
+
+    proxy-response:
+      status: 200
+      headers:
+        fields:
+        - [ X-Response-Identifier, { value: Gzip-Accept-Encoding, as: equal } ]
+        - [ X-Cache, { value: miss, as: equal } ]
+
+  # Accept-Encoding header br, compress, gzip would match the alternate of 
gzip Accept-Encoding header
+  - client-request:
+      method: "GET"
+      version: "1.1"
+      url: /case1
+      headers:
+        fields:
+        - [ Host, www.ae-0.com ]
+        - [ X-Debug, x-cache]
+        - [ uuid, 06 ]
+        - [ Accept-Encoding, "br, compress, gzip" ]
+      delay: 100ms
+
+    server-response:
+      <<: *404_response
+
+    proxy-response:
+      status: 200
+      headers:
+        fields:
+        - [ X-Response-Identifier, { value: Gzip-Accept-Encoding, as: equal } ]
+        - [ X-Cache, { value: hit-fresh, as: equal } ]
+
+
+  # Case 2 proxy.config.http.normalize_ae:1
+  # load an alternate of no Accept-Encoding header
+  - client-request:
+      method: "GET"
+      version: "1.1"
+      url: /case2
+      headers:
+        fields:
+        - [ Host, www.ae-1.com ]
+        - [ X-Debug, x-cache]
+        - [ uuid, 11 ]
+
+    server-response:
+      status: 200
+      reason: OK
+      headers:
+        fields:
+        - [ Transfer-Encoding, chunked ]
+        - [ Cache-Control, max-age=300 ]
+        - [ Vary, Accept-Encoding ]
+        - [ Connection, close ]
+        - [ X-Response-Identifier, No-Accept-Encoding ]
+      content:
+        encoding: plain
+        data: "no Accept-Encoding"
+
+    proxy-response:
+      status: 200
+      headers:
+        fields:
+        - [ X-Response-Identifier, { value: No-Accept-Encoding, as: equal } ]
+        - [ X-Cache, { value: miss, as: equal } ]
+
+  # empty Accept-Encoding header would match the alternate of no 
Accept-Encoding header
+  - client-request:
+      method: "GET"
+      version: "1.1"
+      url: /case2
+      headers:
+        fields:
+        - [ Host, www.ae-1.com ]
+        - [ X-Debug, x-cache]
+        - [ Accept-Encoding, "" ]
+        - [ uuid, 12 ]
+      delay: 100ms
+
+    server-response:
+      <<: *404_response
+
+    proxy-response:
+      status: 200
+      headers:
+        fields:
+        - [ X-Response-Identifier, { value: No-Accept-Encoding, as: equal } ]
+        - [ X-Cache, { value: hit-fresh, as: equal } ]
+
+  # Accept-Encoding header deflate would match the alternate of no 
Accept-Encoding header
+  - client-request:
+      method: "GET"
+      version: "1.1"
+      url: /case2
+      headers:
+        fields:
+        - [ Host, www.ae-1.com ]
+        - [ X-Debug, x-cache]
+        - [ uuid, 13 ]
+        - [ Accept-Encoding, deflate ]
+      delay: 100ms
+
+    server-response:
+      <<: *404_response
+
+    proxy-response:
+      status: 200
+      headers:
+        fields:
+        - [ X-Response-Identifier, { value: No-Accept-Encoding, as: equal } ]
+        - [ X-Cache, { value: hit-fresh, as: equal } ]
+
+  # Accept-Encoding header br, compress would match the alternate of no 
Accept-Encoding header
+  - client-request:
+      method: "GET"
+      version: "1.1"
+      url: /case2
+      headers:
+        fields:
+        - [ Host, www.ae-1.com ]
+        - [ X-Debug, x-cache]
+        - [ uuid, 14 ]
+        - [ Accept-Encoding, "br, compress" ]
+      delay: 100ms
+
+    server-response:
+      <<: *404_response
+
+    proxy-response:
+      status: 200
+      headers:
+        fields:
+        - [ X-Response-Identifier, { value: No-Accept-Encoding, as: equal } ]
+        - [ X-Cache, { value: hit-fresh, as: equal } ]
+
+  # load an alternate of gzip Accept-Encoding header
+  - client-request:
+      method: "GET"
+      version: "1.1"
+      url: /case2
+      headers:
+        fields:
+        - [ Host, www.ae-1.com ]
+        - [ X-Debug, x-cache]
+        - [ Accept-Encoding, gzip;q=0.8 ]
+        - [ uuid, 15 ]
+      delay: 100ms
+
+    server-response:
+      status: 200
+      reason: OK
+      headers:
+        fields:
+        - [ Transfer-Encoding, chunked ]
+        - [ Cache-Control, max-age=300 ]
+        - [ Vary, Accept-Encoding ]
+        - [ Connection, close ]
+        - [ X-Response-Identifier, Gzip-Accept-Encoding ]
+      content:
+        encoding: plain
+        data: "Gzip Accept-Encoding"
+
+    proxy-response:
+      status: 200
+      headers:
+        fields:
+        - [ X-Response-Identifier, { value: Gzip-Accept-Encoding, as: equal } ]
+        - [ X-Cache, { value: miss, as: equal } ]
+
+  # Accept-Encoding header br, compress, gzip would match the alternate of 
gzip Accept-Encoding header
+  - client-request:
+      method: "GET"
+      version: "1.1"
+      url: /case2
+      headers:
+        fields:
+        - [ Host, www.ae-1.com ]
+        - [ X-Debug, x-cache]
+        - [ uuid, 16 ]
+        - [ Accept-Encoding, "br, compress, gzip" ]
+      delay: 100ms
+
+    server-response:
+      <<: *404_response
+
+    proxy-response:
+      status: 200
+      headers:
+        fields:
+        - [ X-Response-Identifier, { value: Gzip-Accept-Encoding, as: equal } ]
+        - [ X-Cache, { value: hit-fresh, as: equal } ]
+
+  # Case 3 proxy.config.http.normalize_ae:2
+  # load an alternate of no Accept-Encoding header
+  - client-request:
+      method: "GET"
+      version: "1.1"
+      url: /case3
+      headers:
+        fields:
+        - [ Host, www.ae-2.com ]
+        - [ X-Debug, x-cache]
+        - [ uuid, 21 ]
+
+    server-response:
+      status: 200
+      reason: OK
+      headers:
+        fields:
+        - [ Transfer-Encoding, chunked ]
+        - [ Cache-Control, max-age=300 ]
+        - [ Vary, Accept-Encoding ]
+        - [ Connection, close ]
+        - [ X-Response-Identifier, No-Accept-Encoding ]
+      content:
+        encoding: plain
+        data: "no Accept-Encoding"
+
+    proxy-response:
+      status: 200
+      headers:
+        fields:
+        - [ X-Response-Identifier, { value: No-Accept-Encoding, as: equal } ]
+        - [ X-Cache, { value: miss, as: equal } ]
+
+  # empty Accept-Encoding header would match the alternate of no 
Accept-Encoding header
+  - client-request:
+      method: "GET"
+      version: "1.1"
+      url: /case3
+      headers:
+        fields:
+        - [ Host, www.ae-2.com ]
+        - [ X-Debug, x-cache]
+        - [ Accept-Encoding, "" ]
+        - [ uuid, 22 ]
+      delay: 100ms
+
+    server-response:
+      <<: *404_response
+
+    proxy-response:
+      status: 200
+      headers:
+        fields:
+        - [ X-Response-Identifier, { value: No-Accept-Encoding, as: equal } ]
+        - [ X-Cache, { value: hit-fresh, as: equal } ]
+
+  # Accept-Encoding header deflate would match the alternate of no 
Accept-Encoding header
+  - client-request:
+      method: "GET"
+      version: "1.1"
+      url: /case3
+      headers:
+        fields:
+        - [ Host, www.ae-2.com ]
+        - [ X-Debug, x-cache]
+        - [ uuid, 23 ]
+        - [ Accept-Encoding, deflate ]
+      delay: 100ms
+
+    server-response:
+      <<: *404_response
+
+    proxy-response:
+      status: 200
+      headers:
+        fields:
+        - [ X-Response-Identifier, { value: No-Accept-Encoding, as: equal } ]
+        - [ X-Cache, { value: hit-fresh, as: equal } ]
+
+  # load an alternate of br Accept-Encoding header
+  - client-request:
+      method: "GET"
+      version: "1.1"
+      url: /case3
+      headers:
+        fields:
+        - [ Host, www.ae-2.com ]
+        - [ X-Debug, x-cache]
+        - [ uuid, 24 ]
+        - [ Accept-Encoding, "br, compress" ]
+      delay: 100ms
+
+    server-response:
+      status: 200
+      reason: OK
+      headers:
+        fields:
+        - [ Transfer-Encoding, chunked ]
+        - [ Cache-Control, max-age=300 ]
+        - [ Vary, Accept-Encoding ]
+        - [ Connection, close ]
+        - [ X-Response-Identifier, Br-Accept-Encoding ]
+      content:
+        encoding: plain
+        data: "br Accept-Encoding"
+
+    proxy-response:
+      status: 200
+      headers:
+        fields:
+        - [ X-Response-Identifier, { value: Br-Accept-Encoding, as: equal } ]
+        - [ X-Cache, { value: miss, as: equal } ]
+
+  # load an alternate of gzip Accept-Encoding header
+  - client-request:
+      method: "GET"
+      version: "1.1"
+      url: /case3
+      headers:
+        fields:
+        - [ Host, www.ae-2.com ]
+        - [ X-Debug, x-cache]
+        - [ Accept-Encoding, gzip;q=0.8 ]
+        - [ uuid, 25 ]
+      delay: 100ms
+
+    server-response:
+      status: 200
+      reason: OK
+      headers:
+        fields:
+        - [ Transfer-Encoding, chunked ]
+        - [ Cache-Control, max-age=300 ]
+        - [ Vary, Accept-Encoding ]
+        - [ Connection, close ]
+        - [ X-Response-Identifier, Gzip-Accept-Encoding ]
+      content:
+        encoding: plain
+        data: "Gzip Accept-Encoding"
+
+    proxy-response:
+      status: 200
+      headers:
+        fields:
+        - [ X-Response-Identifier, { value: Gzip-Accept-Encoding, as: equal } ]
+        - [ X-Cache, { value: miss, as: equal } ]
+
+  # Accept-Encoding header br, compress, gzip would match the alternate of br 
Accept-Encoding header
+  - client-request:
+      method: "GET"
+      version: "1.1"
+      url: /case3
+      headers:
+        fields:
+        - [ Host, www.ae-2.com ]
+        - [ X-Debug, x-cache]
+        - [ uuid, 26 ]
+        - [ Accept-Encoding, "br, compress, gzip" ]
+      delay: 100ms
+
+    server-response:
+      <<: *404_response
+
+    proxy-response:
+      status: 200
+      headers:
+        fields:
+        - [ X-Response-Identifier, { value: Br-Accept-Encoding, as: equal } ]
+        - [ X-Cache, { value: hit-fresh, as: equal } ]
+
+  # Accept-Encoding header compress, gzip would match the alternate of gzip 
Accept-Encoding header
+  - client-request:
+      method: "GET"
+      version: "1.1"
+      url: /case3
+      headers:
+        fields:
+        - [ Host, www.ae-2.com ]
+        - [ X-Debug, x-cache]
+        - [ uuid, 27 ]
+        - [ Accept-Encoding, "compress, gzip" ]
+      delay: 100ms
+
+    server-response:
+      <<: *404_response
+
+    proxy-response:
+      status: 200
+      headers:
+        fields:
+        - [ X-Response-Identifier, { value: Gzip-Accept-Encoding, as: equal } ]
+        - [ X-Cache, { value: hit-fresh, as: equal } ]
+
+  # Case 4 proxy.config.http.normalize_ae:3
+  # load an alternate of no Accept-Encoding header
+  - client-request:
+      method: "GET"
+      version: "1.1"
+      url: /case4
+      headers:
+        fields:
+        - [ Host, www.ae-3.com ]
+        - [ X-Debug, x-cache]
+        - [ uuid, 31 ]
+
+    server-response:
+      status: 200
+      reason: OK
+      headers:
+        fields:
+        - [ Transfer-Encoding, chunked ]
+        - [ Cache-Control, max-age=300 ]
+        - [ Vary, Accept-Encoding ]
+        - [ Connection, close ]
+        - [ X-Response-Identifier, No-Accept-Encoding ]
+      content:
+        encoding: plain
+        data: "no Accept-Encoding"
+
+    proxy-response:
+      status: 200
+      headers:
+        fields:
+        - [ X-Response-Identifier, { value: No-Accept-Encoding, as: equal } ]
+        - [ X-Cache, { value: miss, as: equal } ]
+
+  # empty Accept-Encoding header would match the alternate of no 
Accept-Encoding header
+  - client-request:
+      method: "GET"
+      version: "1.1"
+      url: /case4
+      headers:
+        fields:
+        - [ Host, www.ae-3.com ]
+        - [ X-Debug, x-cache]
+        - [ Accept-Encoding, "" ]
+        - [ uuid, 32 ]
+      delay: 100ms
+
+    server-response:
+      <<: *404_response
+
+    proxy-response:
+      status: 200
+      headers:
+        fields:
+        - [ X-Response-Identifier, { value: No-Accept-Encoding, as: equal } ]
+        - [ X-Cache, { value: hit-fresh, as: equal } ]
+
+  # Accept-Encoding header deflate would match the alternate of no 
Accept-Encoding header
+  - client-request:
+      method: "GET"
+      version: "1.1"
+      url: /case4
+      headers:
+        fields:
+        - [ Host, www.ae-3.com ]
+        - [ X-Debug, x-cache]
+        - [ uuid, 33 ]
+        - [ Accept-Encoding, deflate ]
+      delay: 100ms
+
+    server-response:
+      <<: *404_response
+
+    proxy-response:
+      status: 200
+      headers:
+        fields:
+        - [ X-Response-Identifier, { value: No-Accept-Encoding, as: equal } ]
+        - [ X-Cache, { value: hit-fresh, as: equal } ]
+
+  # load an alternate of br Accept-Encoding header
+  - client-request:
+      method: "GET"
+      version: "1.1"
+      url: /case4
+      headers:
+        fields:
+        - [ Host, www.ae-3.com ]
+        - [ X-Debug, x-cache]
+        - [ uuid, 34 ]
+        - [ Accept-Encoding, "br, compress" ]
+      delay: 100ms
+
+    server-response:
+      status: 200
+      reason: OK
+      headers:
+        fields:
+        - [ Transfer-Encoding, chunked ]
+        - [ Cache-Control, max-age=300 ]
+        - [ Vary, Accept-Encoding ]
+        - [ Connection, close ]
+        - [ X-Response-Identifier, Br-Accept-Encoding ]
+      content:
+        encoding: plain
+        data: "br Accept-Encoding"
+
+    proxy-response:
+      status: 200
+      headers:
+        fields:
+        - [ X-Response-Identifier, { value: Br-Accept-Encoding, as: equal } ]
+        - [ X-Cache, { value: miss, as: equal } ]
+
+  # load an alternate of gzip Accept-Encoding header
+  - client-request:
+      method: "GET"
+      version: "1.1"
+      url: /case4
+      headers:
+        fields:
+        - [ Host, www.ae-3.com ]
+        - [ X-Debug, x-cache]
+        - [ Accept-Encoding, gzip;q=0.8 ]
+        - [ uuid, 35 ]
+      delay: 100ms
+
+    server-response:
+      status: 200
+      reason: OK
+      headers:
+        fields:
+        - [ Transfer-Encoding, chunked ]
+        - [ Cache-Control, max-age=300 ]
+        - [ Vary, Accept-Encoding ]
+        - [ Connection, close ]
+        - [ X-Response-Identifier, Gzip-Accept-Encoding ]
+      content:
+        encoding: plain
+        data: "Gzip Accept-Encoding"
+
+    proxy-response:
+      status: 200
+      headers:
+        fields:
+        - [ X-Response-Identifier, { value: Gzip-Accept-Encoding, as: equal } ]
+        - [ X-Cache, { value: miss, as: equal } ]
+
+  # NOTICE: This case should load an alternate of br, gzip Accept-Encoding 
header.
+  #         However, due to the implementation of calculate_quality_of_match(),
+  #         ATS matches the alternate of gzip Accept-Encoding header.
+  #         The result is DIFFERENT from the description of 
proxy.config.http.normalize_ae: 3
+  - client-request:
+      method: "GET"
+      version: "1.1"
+      url: /case4
+      headers:
+        fields:
+        - [ Host, www.ae-3.com ]
+        - [ X-Debug, x-cache]
+        - [ uuid, 36 ]
+        - [ Accept-Encoding, "br, compress, gzip" ]
+      delay: 100ms
+
+    server-response:
+      status: 200
+      reason: OK
+      headers:
+        fields:
+        - [ Transfer-Encoding, chunked ]
+        - [ Cache-Control, max-age=300 ]
+        - [ Vary, Accept-Encoding ]
+        - [ Connection, close ]
+        - [ X-Response-Identifier, Br-Gzip-Accept-Encoding ]
+      content:
+        encoding: plain
+        data: "Br, Gzip Accept-Encoding"
+
+    proxy-response:
+      status: 200
+      headers:
+        fields:
+        # - [ X-Response-Identifier, { value: Br-Gzip-Accept-Encoding, as: 
equal } ]
+        # - [ X-Cache, { value: miss, as: equal } ]
+        - [ X-Response-Identifier, { value: Gzip-Accept-Encoding, as: equal } ]
+        - [ X-Cache, { value: hit-fresh, as: equal } ]
+
+  # Accept-Encoding header compress, gzip would match the alternate of gzip 
Accept-Encoding header
+  - client-request:
+      method: "GET"
+      version: "1.1"
+      url: /case4
+      headers:
+        fields:
+        - [ Host, www.ae-3.com ]
+        - [ X-Debug, x-cache]
+        - [ uuid, 37 ]
+        - [ Accept-Encoding, "compress, gzip" ]
+      delay: 100ms
+
+    server-response:
+      <<: *404_response
+
+    proxy-response:
+      status: 200
+      headers:
+        fields:
+        - [ X-Response-Identifier, { value: Gzip-Accept-Encoding, as: equal } ]
+        - [ X-Cache, { value: hit-fresh, as: equal } ]
+
+  # Accept-Encoding header br;q=1.1 would match the alternate of br 
Accept-Encoding header
+  - client-request:
+      method: "GET"
+      version: "1.1"
+      url: /case4
+      headers:
+        fields:
+        - [ Host, www.ae-3.com ]
+        - [ X-Debug, x-cache]
+        - [ uuid, 38 ]
+        - [ Accept-Encoding, "br;q=1.1" ]
+      delay: 100ms
+
+    server-response:
+      <<: *404_response
+
+    proxy-response:
+      status: 200
+      headers:
+        fields:
+        - [ X-Response-Identifier, { value: Br-Accept-Encoding, as: equal } ]
+        - [ X-Cache, { value: hit-fresh, as: equal } ]
+
+  # NOTICE: This case should make Accept-Encoding header br, gzip;q=0.8 match
+  #         the alternate of br, gzip Accept-Encoding header.
+  #         However, due to the implementation of calculate_quality_of_match(),
+  #         ATS matches the alternate of gzip Accept-Encoding header.
+  #         The result is DIFFERENT from the description of 
proxy.config.http.normalize_ae: 3
+  - client-request:
+      method: "GET"
+      version: "1.1"
+      url: /case4
+      headers:
+        fields:
+        - [ Host, www.ae-3.com ]
+        - [ X-Debug, x-cache]
+        - [ uuid, 39 ]
+        - [ Accept-Encoding, "br, gzip;q=0.8" ]
+      delay: 100ms
+
+    server-response:
+      <<: *404_response
+
+    proxy-response:
+      status: 200
+      headers:
+        fields:
+        # - [ X-Response-Identifier, { value: Br-Gzip-Accept-Encoding, as: 
equal } ]
+        - [ X-Response-Identifier, { value: Gzip-Accept-Encoding, as: equal } ]
+        - [ X-Cache, { value: hit-fresh, as: equal } ]

Reply via email to