From 934fb85e34b7215f356385a803ced6ce87e2e1f5 Mon Sep 17 00:00:00 2001 From: Daniel Kec Date: Mon, 7 Feb 2022 20:42:42 +0100 Subject: [PATCH] LRA - case-insensitive header propagation (#3870) * LRA - case-insensitive header propagation Signed-off-by: Daniel Kec --- .../coordinator/client/PropagatedHeaders.java | 21 ++++++++++++++++++- .../lra/CoordinatorHeaderPropagationTest.java | 4 ++-- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/lra/coordinator/client/spi/src/main/java/io/helidon/lra/coordinator/client/PropagatedHeaders.java b/lra/coordinator/client/spi/src/main/java/io/helidon/lra/coordinator/client/PropagatedHeaders.java index f0aa60206db..ca926b1ffb9 100644 --- a/lra/coordinator/client/spi/src/main/java/io/helidon/lra/coordinator/client/PropagatedHeaders.java +++ b/lra/coordinator/client/spi/src/main/java/io/helidon/lra/coordinator/client/PropagatedHeaders.java @@ -21,6 +21,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Set; /** @@ -95,7 +96,7 @@ public void scan(Map> headers) { for (Map.Entry> entry : headers.entrySet()) { String key = entry.getKey(); for (String prefix : prefixes) { - if (key.startsWith(prefix)) { + if (startsWithIgnoreCase(prefix, key)) { filteredMap.put(key, Collections.unmodifiableList(entry.getValue())); } } @@ -133,4 +134,22 @@ public void clear() { } } + + /** + * Case-insensitive starts with check. + * + * @param prefix prefix to start with + * @param value value to check + * @return true if the value starts with the prefix + */ + private static boolean startsWithIgnoreCase(String prefix, String value) { + if (prefix == null || value == null) { + return Objects.equals(prefix, value); + } + int prefixLength = prefix.length(); + if (prefixLength > value.length()) { + return false; + } + return value.regionMatches(true, 0, prefix, 0, prefixLength); + } } diff --git a/microprofile/lra/jax-rs/src/test/java/io/helidon/microprofile/lra/CoordinatorHeaderPropagationTest.java b/microprofile/lra/jax-rs/src/test/java/io/helidon/microprofile/lra/CoordinatorHeaderPropagationTest.java index 09d06c20118..8eff3b24cb4 100644 --- a/microprofile/lra/jax-rs/src/test/java/io/helidon/microprofile/lra/CoordinatorHeaderPropagationTest.java +++ b/microprofile/lra/jax-rs/src/test/java/io/helidon/microprofile/lra/CoordinatorHeaderPropagationTest.java @@ -98,14 +98,14 @@ @AddBean(CoordinatorHeaderPropagationTest.TestResourceJaxRsCompensate.class) @AddBean(CoordinatorHeaderPropagationTest.TestResourceNonJaxRsCompensate.class) // Override context -@AddConfig(key = CoordinatorClient.CONF_KEY_COORDINATOR_HEADERS_PROPAGATION_PREFIX + ".0", value = "xxx-tmm-") +@AddConfig(key = CoordinatorClient.CONF_KEY_COORDINATOR_HEADERS_PROPAGATION_PREFIX + ".0", value = "Xxx-tmm-") @AddConfig(key = CoordinatorClient.CONF_KEY_COORDINATOR_HEADERS_PROPAGATION_PREFIX + ".1", value = "xbb-tmm-") @AddConfig(key = CoordinatorClient.CONF_KEY_COORDINATOR_HEADERS_PROPAGATION_PREFIX + ".2", value = "xcc-tmm-") class CoordinatorHeaderPropagationTest { private static final long TIMEOUT_SEC = 10L; private static final String PROPAGATED_HEADER = "xxx-tmm-propagated-header"; - private static final String EXTRA_COORDINATOR_PROPAGATED_HEADER = "xbb-tmm-extra-start-header"; + private static final String EXTRA_COORDINATOR_PROPAGATED_HEADER = "xBb-tmm-extra-start-header"; private static final String NOT_PROPAGATED_HEADER = "non-propagated-header"; private static volatile int port = -1;