AbortResponse headers case insensitive header names Signed-off-by: jansupol <jan.supol@oracle.com>
diff --git a/core-client/src/test/java/org/glassfish/jersey/client/AbortTest.java b/core-client/src/test/java/org/glassfish/jersey/client/AbortTest.java index 1bac330..974cbe9 100644 --- a/core-client/src/test/java/org/glassfish/jersey/client/AbortTest.java +++ b/core-client/src/test/java/org/glassfish/jersey/client/AbortTest.java
@@ -53,6 +53,7 @@ import java.util.Collections; import java.util.Iterator; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.concurrent.CompletionStage; import java.util.concurrent.atomic.AtomicReference; @@ -225,6 +226,43 @@ } } + @Test + public void testResponseContextCaseInsensitiveKeys() { + try (Response response = ClientBuilder.newClient() + .register(new ClientRequestFilter() { + @Override + public void filter(ClientRequestContext requestContext) throws IOException { + requestContext.abortWith(Response.ok() + .header("header1", "value") + .header("header1", "value1 , value2") + .header("header1", "Value3,white space ") + .header("header2", "Value4;;Value5") + .build()); + } + }) + .register(new ClientResponseFilter() { + @Override + public void filter(ClientRequestContext requestContext, ClientResponseContext context) { + Assertions.assertTrue(context.getHeaderString("header1").contains("value")); + Assertions.assertTrue(context.getHeaderString("HEADER1").contains("value2")); + //White space in value not trimmed + Assertions.assertFalse(context.getHeaderString("header1").contains("whitespace")); + //Multiple character separator + Assertions.assertTrue(context.getHeaderString("header2").contains("Value5")); + + Assertions.assertTrue(context.getHeaders().containsKey("HEADer1")); + Assertions.assertFalse(context.getHeaders().get("HEADer1").isEmpty()); + Assertions.assertFalse(context.getHeaders().remove("HeAdEr1").isEmpty()); + Assertions.assertFalse(context.getHeaders().containsKey("header1")); + } + }) + .target("http://localhost:8080") + .request() + .get()) { + Assertions.assertEquals(200, response.getStatus()); + } + } + private static class StringHeader extends AtomicReference<String> { }
diff --git a/core-common/src/main/java/org/glassfish/jersey/internal/util/collection/Views.java b/core-common/src/main/java/org/glassfish/jersey/internal/util/collection/Views.java index 75b1987..d1480d2 100644 --- a/core-common/src/main/java/org/glassfish/jersey/internal/util/collection/Views.java +++ b/core-common/src/main/java/org/glassfish/jersey/internal/util/collection/Views.java
@@ -230,6 +230,76 @@ final List<Object> old = originalMap.put(key, (List<Object>) (List<?>) value); return valuesTransformer.apply(old); } + + @Override + public boolean containsKey(Object key) { + Iterator<Entry<String, List<String>>> i = entrySet().iterator(); + if (key == null) { + while (i.hasNext()) { + Entry<String, List<String>> e = i.next(); + if (e.getKey() == null) { + return true; + } + } + } else { + while (i.hasNext()) { + Entry<String, List<String>> e = i.next(); + if (((String) key).equalsIgnoreCase(e.getKey())) { + return true; + } + } + } + return false; + } + + @Override + public List<String> get(Object key) { + Iterator<Entry<String, List<String>>> i = entrySet().iterator(); + if (key == null) { + while (i.hasNext()) { + Entry<String, List<String>> e = i.next(); + if (e.getKey() == null) { + return e.getValue(); + } + } + } else { + while (i.hasNext()) { + Entry<String, List<String>> e = i.next(); + if (((String) key).equalsIgnoreCase(e.getKey())) { + return e.getValue(); + } + } + } + return null; + } + + @Override + public List<String> remove(Object key) { + Iterator<Entry<String, List<String>>> i = entrySet().iterator(); + Entry<String, List<String>> correctEntry = null; + if (key == null) { + while (correctEntry == null && i.hasNext()) { + Entry<String, List<String>> e = i.next(); + if (e.getKey() == null) { + correctEntry = e; + } + } + } else { + while (correctEntry == null && i.hasNext()) { + Entry<String, List<String>> e = i.next(); + if (((String) key).equalsIgnoreCase(e.getKey())) { + correctEntry = e; + } + } + } + + List<String> oldValue = null; + if (correctEntry != null) { + oldValue = correctEntry.getValue(); + i.remove(); + } + return oldValue; + } } /**