From ce8a5b3a37a3353f20138e6bada656c2e923f3f8 Mon Sep 17 00:00:00 2001 From: Keith Massey Date: Wed, 20 Sep 2023 13:23:52 -0500 Subject: [PATCH] Treating response header names as case-insensitive --- .../xpack/watcher/common/http/HttpClient.java | 14 ++++++++++---- .../xpack/watcher/common/http/HttpClientTests.java | 3 ++- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/x-pack/plugin/watcher/src/main/java/org/elasticsearch/xpack/watcher/common/http/HttpClient.java b/x-pack/plugin/watcher/src/main/java/org/elasticsearch/xpack/watcher/common/http/HttpClient.java index 59aac833111c0..e70e1ba349086 100644 --- a/x-pack/plugin/watcher/src/main/java/org/elasticsearch/xpack/watcher/common/http/HttpClient.java +++ b/x-pack/plugin/watcher/src/main/java/org/elasticsearch/xpack/watcher/common/http/HttpClient.java @@ -72,6 +72,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; @@ -274,17 +275,22 @@ public HttpResponse execute(HttpRequest request) throws IOException { // headers Header[] headers = response.getAllHeaders(); Map responseHeaders = Maps.newMapWithExpectedSize(headers.length); + /* + * Headers are not case sensitive, so in the following loop we lowercase all of them. We also roll up all values for the same + * case-insensitive header into a list. + */ for (Header header : headers) { - if (responseHeaders.containsKey(header.getName())) { - String[] old = responseHeaders.get(header.getName()); + String lowerCaseHeaderName = header.getName().toLowerCase(Locale.ROOT); + if (responseHeaders.containsKey(lowerCaseHeaderName)) { + String[] old = responseHeaders.get(lowerCaseHeaderName); String[] values = new String[old.length + 1]; System.arraycopy(old, 0, values, 0, old.length); values[values.length - 1] = header.getValue(); - responseHeaders.put(header.getName(), values); + responseHeaders.put(lowerCaseHeaderName, values); } else { - responseHeaders.put(header.getName(), new String[] { header.getValue() }); + responseHeaders.put(lowerCaseHeaderName, new String[] { header.getValue() }); } } diff --git a/x-pack/plugin/watcher/src/test/java/org/elasticsearch/xpack/watcher/common/http/HttpClientTests.java b/x-pack/plugin/watcher/src/test/java/org/elasticsearch/xpack/watcher/common/http/HttpClientTests.java index 2a6138380afff..0aac3cb4463e4 100644 --- a/x-pack/plugin/watcher/src/test/java/org/elasticsearch/xpack/watcher/common/http/HttpClientTests.java +++ b/x-pack/plugin/watcher/src/test/java/org/elasticsearch/xpack/watcher/common/http/HttpClientTests.java @@ -500,6 +500,7 @@ public void testThatDuplicateHeaderKeysAreReturned() throws Exception { .setBody("foo") .addHeader("foo", "bar") .addHeader("foo", "baz") + .addHeader("Foo", "bam") .addHeader("Content-Length", "3"); webServer.enqueue(mockResponse); @@ -509,7 +510,7 @@ public void testThatDuplicateHeaderKeysAreReturned() throws Exception { assertThat(webServer.requests(), hasSize(1)); assertThat(httpResponse.headers(), hasKey("foo")); - assertThat(httpResponse.headers().get("foo"), containsInAnyOrder("bar", "baz")); + assertThat(httpResponse.headers().get("foo"), containsInAnyOrder("bar", "baz", "bam")); } // finally fixing https://github.com/elastic/x-plugins/issues/1141 - yay! Fixed due to switching to apache http client internally!