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

maskit pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficserver.git


The following commit(s) were added to refs/heads/master by this push:
     new 8671ddb311 Content-type lost when sent after duplicate headers (#11821)
8671ddb311 is described below

commit 8671ddb311793d7586c42c6dd90e71a632213066
Author: Jasmine Emanouel <[email protected]>
AuthorDate: Thu Oct 31 10:15:42 2024 +1100

    Content-type lost when sent after duplicate headers (#11821)
    
    * Fix for #11784
    
    * Just specify content-type not be altered
    
    * Update HttpTransact.cc
---
 src/proxy/http/HttpTransact.cc                     |  11 +
 .../headers/cachedDuplicateHeaders.test.py         |  60 +++++
 .../headers/replays/cache-test.replay.yaml         | 257 +++++++++++++++++++++
 3 files changed, 328 insertions(+)

diff --git a/src/proxy/http/HttpTransact.cc b/src/proxy/http/HttpTransact.cc
index 33925b33b9..1feade28ee 100644
--- a/src/proxy/http/HttpTransact.cc
+++ b/src/proxy/http/HttpTransact.cc
@@ -5040,6 +5040,17 @@ 
HttpTransact::merge_response_header_with_cached_header(HTTPHdr *cached_header, H
           MIMEField &field2{*spot2};
           name2 = field2.name_get(&name_len2);
 
+          // It is specified above that content type should not
+          // be altered here however when a duplicate header
+          // is present, all headers following are delete and
+          // re-added back. This includes content type if it follows
+          // any duplicate header. This leads to the loss of
+          // content type in the client response.
+          // This ensures that it is not altered when duplicate
+          // headers are present.
+          if (name2 == MIME_FIELD_CONTENT_TYPE) {
+            continue;
+          }
           cached_header->field_delete(name2, name_len2);
         }
         dups_seen = true;
diff --git a/tests/gold_tests/headers/cachedDuplicateHeaders.test.py 
b/tests/gold_tests/headers/cachedDuplicateHeaders.test.py
new file mode 100644
index 0000000000..c3c6be98d7
--- /dev/null
+++ b/tests/gold_tests/headers/cachedDuplicateHeaders.test.py
@@ -0,0 +1,60 @@
+'''
+Test cached responses and requests with bodies
+'''
+#  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.
+
+Test.Summary = '''
+Test revalidating cached objects
+'''
+testName = "RevalidateCacheObject"
+Test.ContinueOnFail = True
+
+
+class CachedHeaderValidationTest:
+    replay_file = "replays/cache-test.replay.yaml"
+
+    def __init__(self):
+        self.setupOriginServer()
+        self.setupTS()
+
+    def setupOriginServer(self):
+        self.server = 
Test.MakeVerifierServerProcess("cached-header-verifier-server", 
self.replay_file)
+
+    def setupTS(self):
+        self.ts = Test.MakeATSProcess("ts", enable_tls=True)
+        self.ts.Disk.plugin_config.AddLine('xdebug.so 
--enable=x-cache,x-cache-key,via')
+        self.ts.Disk.records_config.update(
+            {
+                'proxy.config.diags.debug.enabled': 1,
+                'proxy.config.diags.debug.tags': 'http',
+                'proxy.config.http.response_via_str': 3,
+            })
+        self.ts.Disk.remap_config.AddLine('map / 
http://127.0.0.1:{0}'.format(self.server.Variables.http_port))
+
+    def runTraffic(self):
+        tr = Test.AddTestRun()
+        tr.AddVerifierClientProcess("cached-header-verifier-client", 
self.replay_file, http_ports=[self.ts.Variables.port])
+        tr.Processes.Default.StartBefore(self.server)
+        tr.Processes.Default.StartBefore(self.ts)
+        tr.StillRunningAfter = self.ts
+        tr.StillRunningAfter = self.server
+
+    def run(self):
+        self.runTraffic()
+
+
+CachedHeaderValidationTest().run()
diff --git a/tests/gold_tests/headers/replays/cache-test.replay.yaml 
b/tests/gold_tests/headers/replays/cache-test.replay.yaml
new file mode 100644
index 0000000000..df88226200
--- /dev/null
+++ b/tests/gold_tests/headers/replays/cache-test.replay.yaml
@@ -0,0 +1,257 @@
+#  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"
+
+# Note 1:
+# When testing duplicate headers here, replay files cannot
+# handle two seperate values. So make sure that duplicate headers
+# have the same value in testing.
+
+sessions:
+  - transactions:
+      # Test 0: Cache fill with content-type after duplicate headers
+      - client-request:
+          method: "GET"
+          version: "1.1"
+          url: /1
+          headers:
+            fields:
+              - [Host, example.com]
+              - [uuid, fill_1]
+              - [x-debug, "x-cache,x-cache-key,via"]
+
+        server-response:
+          status: 200
+          reason: OK
+          headers:
+            fields:
+              - [Date, "Mon, 23 Sep 2024 14:22:14 GMT"]
+              - [X-Reveal-Duplicate, same]
+              - [Cache-Control, "max-age=1, stale-if-error=1, 
stale-while-revalidate=1, public"]
+              - [Content-Length, 3]
+              - [Content-Type, application/javascript]
+              - [Expires, "Mon, 23 Sep 2024 14:22:44 GMT"]
+              - [Last-Modified, "Mon, 23 Sep 2024 14:22:14 GMT"]
+              - [X-Reveal-Duplicate, same]
+
+        proxy-response:
+          status: 200
+          reason: OK
+          headers:
+            fields:
+              - [Date, { value: "Mon, 23 Sep 2024 14:22:14 GMT", as: equal }]
+              - [X-Reveal-Duplicate, { value: same, as: equal }]
+              - [Cache-Control, { value: "max-age=1, stale-if-error=1, 
stale-while-revalidate=1, public", as: equal }]
+              - [Content-Length, { value: 3, as: equal }]
+              - [Content-Type, { value: application/javascript, as: equal }]
+              - [Expires, { value: "Mon, 23 Sep 2024 14:22:44 GMT", as: equal 
}]
+              - [Last-Modified, { value: "Mon, 23 Sep 2024 14:22:14 GMT", as: 
equal }]
+              - [X-Cache, { value: miss, as: equal }]
+              - [X-Reveal-Duplicate, { value: same, as: equal }]
+
+      # Test 1: Cache hit stale with content-type after duplicate headers
+      - client-request:
+          method: "GET"
+          version: "1.1"
+          url: /1
+          headers:
+            fields:
+              - [Host, example.com]
+              - [uuid, stale_1]
+              - [x-debug, "x-cache,x-cache-key,via"]
+
+        server-response:
+          status: 304
+          reason: Not Modified
+          headers:
+            fields:
+              - [Date, "Mon, 23 Sep 2024 14:22:14 GMT"]
+              - [X-Reveal-Duplicate, same]
+              - [Cache-Control, "max-age=1, stale-if-error=1, 
stale-while-revalidate=1, public"]
+              - [Content-Length, 3]
+              - [Content-Type, application/javascript]
+              - [Expires, "Mon, 23 Sep 2024 14:22:44 GMT"]
+              - [Last-Modified, "Mon, 23 Sep 2024 14:22:14 GMT"]
+              - [X-Reveal-Duplicate, same]
+
+        proxy-response:
+          status: 200
+          reason: OK
+          headers:
+            fields:
+              - [Date, { value: "Mon, 23 Sep 2024 14:22:14 GMT", as: equal }]
+              - [X-Reveal-Duplicate, { value: same, as: equal }]
+              - [Cache-Control, { value: "max-age=1, stale-if-error=1, 
stale-while-revalidate=1, public", as: equal }]
+              - [Content-Length, { value: 3, as: equal }]
+              - [Content-Type, { value: application/javascript, as: equal }]
+              - [Expires, { value: "Mon, 23 Sep 2024 14:22:44 GMT", as: equal 
}]
+              - [Last-Modified, { value: "Mon, 23 Sep 2024 14:22:14 GMT", as: 
equal }]
+              - [X-Cache, { value: hit-stale, as: equal }]
+              - [X-Reveal-Duplicate, { value: same, as: equal }]
+
+      # Test 2: Cache fill with content-type before duplicate headers
+      - client-request:
+          method: "GET"
+          version: "1.1"
+          url: /2
+          headers:
+            fields:
+              - [Host, example.com]
+              - [uuid, fill_2]
+              - [x-debug, "x-cache,x-cache-key,via"]
+
+        server-response:
+          status: 200
+          reason: OK
+          headers:
+            fields:
+              - [Date, "Mon, 23 Sep 2024 14:22:14 GMT"]
+              - [Content-Type, application/javascript]
+              - [X-Reveal-Duplicate, same]
+              - [Cache-Control, "max-age=1, stale-if-error=1, 
stale-while-revalidate=1, public"]
+              - [Content-Length, 3]
+              - [Expires, "Mon, 23 Sep 2024 14:22:44 GMT"]
+              - [Last-Modified, "Mon, 23 Sep 2024 14:22:14 GMT"]
+              - [X-Reveal-Duplicate, same]
+
+        proxy-response:
+          status: 200
+          reason: OK
+          headers:
+            fields:
+              - [Date, { value: "Mon, 23 Sep 2024 14:22:14 GMT", as: equal }]
+              - [X-Reveal-Duplicate, { value: same, as: equal }]
+              - [Cache-Control, { value: "max-age=1, stale-if-error=1, 
stale-while-revalidate=1, public", as: equal }]
+              - [Content-Length, { value: 3, as: equal }]
+              - [Content-Type, { value: application/javascript, as: equal }]
+              - [Expires, { value: "Mon, 23 Sep 2024 14:22:44 GMT", as: equal 
}]
+              - [Last-Modified, { value: "Mon, 23 Sep 2024 14:22:14 GMT", as: 
equal }]
+              - [X-Cache, { value: miss, as: equal }]
+              - [X-Reveal-Duplicate, { value: same, as: equal }]
+
+      # Test 3: Cache hit stale with content-type before duplicate headers
+      - client-request:
+          method: "GET"
+          version: "1.1"
+          url: /2
+          headers:
+            fields:
+              - [Host, example.com]
+              - [uuid, stale_2]
+              - [x-debug, "x-cache,x-cache-key,via"]
+
+        server-response:
+          status: 304
+          reason: Not Modified
+          headers:
+            fields:
+              - [Date, "Mon, 23 Sep 2024 14:22:14 GMT"]
+              - [Content-Type, application/javascript]
+              - [X-Reveal-Duplicate, same]
+              - [X-Reveal-Duplicate, same]
+              - [Cache-Control, "max-age=1, stale-if-error=1, 
stale-while-revalidate=1, public"]
+              - [Content-Length, 3]
+              - [Expires, "Mon, 23 Sep 2024 14:22:44 GMT"]
+              - [Last-Modified, "Mon, 23 Sep 2024 14:22:14 GMT"]
+
+        proxy-response:
+          status: 200
+          reason: OK
+          headers:
+            fields:
+              - [Date, { value: "Mon, 23 Sep 2024 14:22:14 GMT", as: equal }]
+              - [X-Reveal-Duplicate, { value: same, as: equal }]
+              - [X-Reveal-Duplicate, { value: same, as: equal }]
+              - [Cache-Control, { value: "max-age=1, stale-if-error=1, 
stale-while-revalidate=1, public", as: equal }]
+              - [Content-Length, { value: 3, as: equal }]
+              - [Content-Type, { value: application/javascript, as: equal }]
+              - [Expires, { value: "Mon, 23 Sep 2024 14:22:44 GMT", as: equal 
}]
+              - [Last-Modified, { value: "Mon, 23 Sep 2024 14:22:14 GMT", as: 
equal }]
+              - [X-Cache, { value: hit-stale, as: equal }]
+
+      # Test 4: Cache fill with no duplicate headers
+      - client-request:
+          method: "GET"
+          version: "1.1"
+          url: /3
+          headers:
+            fields:
+              - [Host, example.com]
+              - [uuid, fill_3]
+              - [x-debug, "x-cache,x-cache-key,via"]
+
+        server-response:
+          status: 200
+          reason: OK
+          headers:
+            fields:
+              - [Date, "Mon, 23 Sep 2024 14:22:14 GMT"]
+              - [Content-Type, application/javascript]
+              - [Cache-Control, "max-age=1, stale-if-error=1, 
stale-while-revalidate=1, public"]
+              - [Content-Length, 3]
+              - [Expires, "Mon, 23 Sep 2024 14:22:44 GMT"]
+              - [Last-Modified, "Mon, 23 Sep 2024 14:22:14 GMT"]
+
+        proxy-response:
+          status: 200
+          reason: OK
+          headers:
+            fields:
+              - [Date, { value: "Mon, 23 Sep 2024 14:22:14 GMT", as: equal }]
+              - [Cache-Control, { value: "max-age=1, stale-if-error=1, 
stale-while-revalidate=1, public", as: equal }]
+              - [Content-Length, { value: 3, as: equal }]
+              - [Content-Type, { value: application/javascript, as: equal }]
+              - [Expires, { value: "Mon, 23 Sep 2024 14:22:44 GMT", as: equal 
}]
+              - [Last-Modified, { value: "Mon, 23 Sep 2024 14:22:14 GMT", as: 
equal }]
+              - [X-Cache, { value: miss, as: equal }]
+
+      # Test 5: Cache hit stale no duplicate headers
+      - client-request:
+          method: "GET"
+          version: "1.1"
+          url: /3
+          headers:
+            fields:
+              - [Host, example.com]
+              - [uuid, stale_3]
+              - [x-debug, "x-cache,x-cache-key,via"]
+
+        server-response:
+          status: 304
+          reason: Not Modified
+          headers:
+            fields:
+              - [Date, "Mon, 23 Sep 2024 14:22:14 GMT"]
+              - [Content-Type, application/javascript]
+              - [Cache-Control, "max-age=1, stale-if-error=1, 
stale-while-revalidate=1, public"]
+              - [Content-Length, 3]
+              - [Expires, "Mon, 23 Sep 2024 14:22:44 GMT"]
+              - [Last-Modified, "Mon, 23 Sep 2024 14:22:14 GMT"]
+
+        proxy-response:
+          status: 200
+          reason: OK
+          headers:
+            fields:
+              - [Date, { value: "Mon, 23 Sep 2024 14:22:14 GMT", as: equal }]
+              - [Cache-Control, { value: "max-age=1, stale-if-error=1, 
stale-while-revalidate=1, public", as: equal }]
+              - [Content-Length, { value: 3, as: equal }]
+              - [Content-Type, { value: application/javascript, as: equal }]
+              - [Expires, { value: "Mon, 23 Sep 2024 14:22:44 GMT", as: equal 
}]
+              - [Last-Modified, { value: "Mon, 23 Sep 2024 14:22:14 GMT", as: 
equal }]
+              - [X-Cache, { value: hit-stale, as: equal }]

Reply via email to