This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch fix/CAMEL-25131 in repository https://gitbox.apache.org/repos/asf/camel.git
commit 6a8c5cc9f118beff7d739c1012a5f312ce4b6e27 Author: Claus Ibsen <[email protected]> AuthorDate: Tue Sep 29 07:53:51 2026 +0200 CAMEL-25131: Checks of Camel header names should be case-insensitive Message headers are case-insensitive, so a Camel header can be named Camel*, camel*, CAMEL* or any other case. Use StringHelper.startsWithIgnoreCase in camel-tracing, camel-telemetry, camel-netty-http and DefaultExchangeHolder, as DefaultHeaderFilterStrategy already does. Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]> Signed-off-by: Claus Ibsen <[email protected]> --- .../netty/http/DefaultNettyHttpBinding.java | 2 +- .../component/netty/http/NettyHttpProducer.java | 3 +- .../DefaultNettyHttpBindingCamelHeadersTest.java} | 45 +++++++++------------- ...CamelHeadersSpanContextPropagationInjector.java | 3 +- ...elJMSHeadersSpanContextPropagationInjector.java | 3 +- .../propagation/CamelHeadersInjectAdapterTest.java | 11 ++++++ .../CamelMessagingHeadersInjectAdapterTest.java | 11 ++++++ .../propagation/CamelHeadersInjectAdapter.java | 3 +- .../CamelMessagingHeadersInjectAdapter.java | 3 +- .../CamelHeadersInjectAdapterTest.java} | 29 +++++++------- .../CamelMessagingHeadersInjectAdapterTest.java | 12 ++++++ .../camel/support/DefaultExchangeHolder.java | 3 +- 12 files changed, 82 insertions(+), 46 deletions(-) diff --git a/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/DefaultNettyHttpBinding.java b/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/DefaultNettyHttpBinding.java index 2bdc975b4827..c8a4090fdcf0 100644 --- a/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/DefaultNettyHttpBinding.java +++ b/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/DefaultNettyHttpBinding.java @@ -302,7 +302,7 @@ public class DefaultNettyHttpBinding implements NettyHttpBinding, Cloneable { protected void copyCamelHeaders(Map<String, Object> headers, Exchange exchange) { exchange.getIn().getHeaders().keySet() .stream() - .filter(key -> key.startsWith("Camel")) + .filter(key -> StringHelper.startsWithIgnoreCase(key, "Camel")) .forEach(key -> headers.put(key, exchange.getIn().getHeaders().get(key))); } diff --git a/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/NettyHttpProducer.java b/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/NettyHttpProducer.java index 78fbe0609927..8214f8371190 100644 --- a/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/NettyHttpProducer.java +++ b/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/NettyHttpProducer.java @@ -31,6 +31,7 @@ import org.apache.camel.component.netty.NettyConfiguration; import org.apache.camel.component.netty.NettyProducer; import org.apache.camel.http.base.cookie.CookieHandler; import org.apache.camel.support.SynchronizationAdapter; +import org.apache.camel.util.StringHelper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -205,7 +206,7 @@ public class NettyHttpProducer extends NettyProducer { .stream() .filter(key -> !key.equalsIgnoreCase(Exchange.HTTP_RESPONSE_CODE) && !key.equalsIgnoreCase(Exchange.HTTP_RESPONSE_TEXT) - && key.startsWith("Camel")) + && StringHelper.startsWithIgnoreCase(key, "Camel")) .collect(Collectors.toList()); headersToRemove.stream().forEach(header -> exchange.getMessage().removeHeaders(header)); diff --git a/components/camel-telemetry/src/test/java/org/apache/camel/telemetry/propagation/CamelHeadersInjectAdapterTest.java b/components/camel-netty-http/src/test/java/org/apache/camel/component/netty/http/DefaultNettyHttpBindingCamelHeadersTest.java similarity index 50% copy from components/camel-telemetry/src/test/java/org/apache/camel/telemetry/propagation/CamelHeadersInjectAdapterTest.java copy to components/camel-netty-http/src/test/java/org/apache/camel/component/netty/http/DefaultNettyHttpBindingCamelHeadersTest.java index 189ce9713450..ab1945348db1 100644 --- a/components/camel-telemetry/src/test/java/org/apache/camel/telemetry/propagation/CamelHeadersInjectAdapterTest.java +++ b/components/camel-netty-http/src/test/java/org/apache/camel/component/netty/http/DefaultNettyHttpBindingCamelHeadersTest.java @@ -14,41 +14,34 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.telemetry.propagation; +package org.apache.camel.component.netty.http; import java.util.HashMap; import java.util.Map; -import org.apache.camel.telemetry.SpanContextPropagationInjector; -import org.junit.jupiter.api.BeforeEach; +import org.apache.camel.CamelContext; +import org.apache.camel.Exchange; +import org.apache.camel.impl.DefaultCamelContext; +import org.apache.camel.support.DefaultExchange; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; -public class CamelHeadersInjectAdapterTest { - - private Map<String, Object> map; - - @BeforeEach - public void before() { - map = new HashMap<>(); - } +public class DefaultNettyHttpBindingCamelHeadersTest { @Test - public void putProperties() { - SpanContextPropagationInjector adapter = new CamelHeadersSpanContextPropagationInjector(map); - adapter.put("key1", "value1"); - adapter.put("key2", "value2"); - adapter.put("key1", "value3"); - assertEquals("value3", map.get("key1")); - assertEquals("value2", map.get("key2")); + public void testCopyCamelHeadersInAnyCase() { + CamelContext context = new DefaultCamelContext(); + Exchange exchange = new DefaultExchange(context); + exchange.getIn().setHeader("CamelFoo", "1"); + exchange.getIn().setHeader("camelBar", "2"); + exchange.getIn().setHeader("CAMELBAZ", "3"); + exchange.getIn().setHeader("CaMeLqux", "4"); + exchange.getIn().setHeader("foo", "5"); + + Map<String, Object> headers = new HashMap<>(); + new DefaultNettyHttpBinding().copyCamelHeaders(headers, exchange); + + assertEquals(Map.of("CamelFoo", "1", "camelBar", "2", "CAMELBAZ", "3", "CaMeLqux", "4"), headers); } - - @Test - public void propertyWithDash() { - SpanContextPropagationInjector adapter = new CamelHeadersSpanContextPropagationInjector(map); - adapter.put("-key-1-", "value1"); - assertEquals("value1", map.get("-key-1-")); - } - } diff --git a/components/camel-telemetry/src/main/java/org/apache/camel/telemetry/propagation/CamelHeadersSpanContextPropagationInjector.java b/components/camel-telemetry/src/main/java/org/apache/camel/telemetry/propagation/CamelHeadersSpanContextPropagationInjector.java index a17f806f433f..425546787d97 100644 --- a/components/camel-telemetry/src/main/java/org/apache/camel/telemetry/propagation/CamelHeadersSpanContextPropagationInjector.java +++ b/components/camel-telemetry/src/main/java/org/apache/camel/telemetry/propagation/CamelHeadersSpanContextPropagationInjector.java @@ -19,6 +19,7 @@ package org.apache.camel.telemetry.propagation; import java.util.Map; import org.apache.camel.telemetry.SpanContextPropagationInjector; +import org.apache.camel.util.StringHelper; public final class CamelHeadersSpanContextPropagationInjector implements SpanContextPropagationInjector { private final Map<String, Object> map; @@ -30,7 +31,7 @@ public final class CamelHeadersSpanContextPropagationInjector implements SpanCon @Override public void put(String key, String value) { // Assume any header property that begins with 'Camel' is for internal use - if (!key.startsWith("Camel")) { + if (!StringHelper.startsWithIgnoreCase(key, "Camel")) { this.map.put(key, value); } } diff --git a/components/camel-telemetry/src/main/java/org/apache/camel/telemetry/propagation/CamelJMSHeadersSpanContextPropagationInjector.java b/components/camel-telemetry/src/main/java/org/apache/camel/telemetry/propagation/CamelJMSHeadersSpanContextPropagationInjector.java index bed6726e3bc7..bdee339b3cea 100644 --- a/components/camel-telemetry/src/main/java/org/apache/camel/telemetry/propagation/CamelJMSHeadersSpanContextPropagationInjector.java +++ b/components/camel-telemetry/src/main/java/org/apache/camel/telemetry/propagation/CamelJMSHeadersSpanContextPropagationInjector.java @@ -19,6 +19,7 @@ package org.apache.camel.telemetry.propagation; import java.util.Map; import org.apache.camel.telemetry.SpanContextPropagationInjector; +import org.apache.camel.util.StringHelper; public final class CamelJMSHeadersSpanContextPropagationInjector implements SpanContextPropagationInjector { @@ -37,7 +38,7 @@ public final class CamelJMSHeadersSpanContextPropagationInjector implements Span @Override public void put(String key, String value) { // Assume any header property that begins with 'Camel' is for internal use - if (!key.startsWith("Camel")) { + if (!StringHelper.startsWithIgnoreCase(key, "Camel")) { this.map.put(encodeDash(key), value); } } diff --git a/components/camel-telemetry/src/test/java/org/apache/camel/telemetry/propagation/CamelHeadersInjectAdapterTest.java b/components/camel-telemetry/src/test/java/org/apache/camel/telemetry/propagation/CamelHeadersInjectAdapterTest.java index 189ce9713450..a5a32753c018 100644 --- a/components/camel-telemetry/src/test/java/org/apache/camel/telemetry/propagation/CamelHeadersInjectAdapterTest.java +++ b/components/camel-telemetry/src/test/java/org/apache/camel/telemetry/propagation/CamelHeadersInjectAdapterTest.java @@ -51,4 +51,15 @@ public class CamelHeadersInjectAdapterTest { assertEquals("value1", map.get("-key-1-")); } + @Test + public void camelHeadersInAnyCaseAreNotInjected() { + SpanContextPropagationInjector adapter = new CamelHeadersSpanContextPropagationInjector(map); + adapter.put("CamelFoo", "value1"); + adapter.put("camelFoo", "value2"); + adapter.put("CAMELFOO", "value3"); + adapter.put("CaMeLfoo", "value4"); + adapter.put("traceparent", "value5"); + assertEquals(1, map.size()); + assertEquals("value5", map.get("traceparent")); + } } diff --git a/components/camel-telemetry/src/test/java/org/apache/camel/telemetry/propagation/CamelMessagingHeadersInjectAdapterTest.java b/components/camel-telemetry/src/test/java/org/apache/camel/telemetry/propagation/CamelMessagingHeadersInjectAdapterTest.java index 76c8ef59ca5d..d6a85f48389d 100644 --- a/components/camel-telemetry/src/test/java/org/apache/camel/telemetry/propagation/CamelMessagingHeadersInjectAdapterTest.java +++ b/components/camel-telemetry/src/test/java/org/apache/camel/telemetry/propagation/CamelMessagingHeadersInjectAdapterTest.java @@ -52,4 +52,15 @@ public class CamelMessagingHeadersInjectAdapterTest { assertEquals("value1", map.get(JMS_DASH + "key" + JMS_DASH + "1" + JMS_DASH)); } + @Test + public void camelHeadersInAnyCaseAreNotInjected() { + SpanContextPropagationInjector adapter = new CamelJMSHeadersSpanContextPropagationInjector(map); + adapter.put("CamelFoo", "value1"); + adapter.put("camelFoo", "value2"); + adapter.put("CAMELFOO", "value3"); + adapter.put("CaMeLfoo", "value4"); + adapter.put("traceparent", "value5"); + assertEquals(1, map.size()); + assertEquals("value5", map.get("traceparent")); + } } diff --git a/components/camel-tracing/src/main/java/org/apache/camel/tracing/propagation/CamelHeadersInjectAdapter.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/propagation/CamelHeadersInjectAdapter.java index 04612cbf3df9..dbdc8c49949b 100644 --- a/components/camel-tracing/src/main/java/org/apache/camel/tracing/propagation/CamelHeadersInjectAdapter.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/propagation/CamelHeadersInjectAdapter.java @@ -19,6 +19,7 @@ package org.apache.camel.tracing.propagation; import java.util.Map; import org.apache.camel.tracing.InjectAdapter; +import org.apache.camel.util.StringHelper; @Deprecated(since = "4.19.0") public final class CamelHeadersInjectAdapter implements InjectAdapter { @@ -31,7 +32,7 @@ public final class CamelHeadersInjectAdapter implements InjectAdapter { @Override public void put(String key, String value) { // Assume any header property that begins with 'Camel' is for internal use - if (!key.startsWith("Camel")) { + if (!StringHelper.startsWithIgnoreCase(key, "Camel")) { this.map.put(key, value); } } diff --git a/components/camel-tracing/src/main/java/org/apache/camel/tracing/propagation/CamelMessagingHeadersInjectAdapter.java b/components/camel-tracing/src/main/java/org/apache/camel/tracing/propagation/CamelMessagingHeadersInjectAdapter.java index fbe6eb511eef..8f9353663b34 100644 --- a/components/camel-tracing/src/main/java/org/apache/camel/tracing/propagation/CamelMessagingHeadersInjectAdapter.java +++ b/components/camel-tracing/src/main/java/org/apache/camel/tracing/propagation/CamelMessagingHeadersInjectAdapter.java @@ -19,6 +19,7 @@ package org.apache.camel.tracing.propagation; import java.util.Map; import org.apache.camel.tracing.InjectAdapter; +import org.apache.camel.util.StringHelper; @Deprecated(since = "4.19.0") public final class CamelMessagingHeadersInjectAdapter implements InjectAdapter { @@ -41,7 +42,7 @@ public final class CamelMessagingHeadersInjectAdapter implements InjectAdapter { @Override public void put(String key, String value) { // Assume any header property that begins with 'Camel' is for internal use - if (!key.startsWith("Camel")) { + if (!StringHelper.startsWithIgnoreCase(key, "Camel")) { this.map.put(encodeDash(key), value); } } diff --git a/components/camel-tracing/src/main/java/org/apache/camel/tracing/propagation/CamelHeadersInjectAdapter.java b/components/camel-tracing/src/test/java/org/apache/camel/tracing/propagation/CamelHeadersInjectAdapterTest.java similarity index 57% copy from components/camel-tracing/src/main/java/org/apache/camel/tracing/propagation/CamelHeadersInjectAdapter.java copy to components/camel-tracing/src/test/java/org/apache/camel/tracing/propagation/CamelHeadersInjectAdapterTest.java index 04612cbf3df9..2f1cd8063a26 100644 --- a/components/camel-tracing/src/main/java/org/apache/camel/tracing/propagation/CamelHeadersInjectAdapter.java +++ b/components/camel-tracing/src/test/java/org/apache/camel/tracing/propagation/CamelHeadersInjectAdapterTest.java @@ -16,23 +16,26 @@ */ package org.apache.camel.tracing.propagation; +import java.util.HashMap; import java.util.Map; -import org.apache.camel.tracing.InjectAdapter; +import org.junit.jupiter.api.Test; -@Deprecated(since = "4.19.0") -public final class CamelHeadersInjectAdapter implements InjectAdapter { - private final Map<String, Object> map; +import static org.junit.jupiter.api.Assertions.assertEquals; - public CamelHeadersInjectAdapter(final Map<String, Object> map) { - this.map = map; - } +@Deprecated(since = "4.19.0") +public class CamelHeadersInjectAdapterTest { - @Override - public void put(String key, String value) { - // Assume any header property that begins with 'Camel' is for internal use - if (!key.startsWith("Camel")) { - this.map.put(key, value); - } + @Test + public void camelHeadersInAnyCaseAreNotInjected() { + Map<String, Object> map = new HashMap<>(); + CamelHeadersInjectAdapter adapter = new CamelHeadersInjectAdapter(map); + adapter.put("CamelFoo", "value1"); + adapter.put("camelFoo", "value2"); + adapter.put("CAMELFOO", "value3"); + adapter.put("CaMeLfoo", "value4"); + adapter.put("traceparent", "value5"); + assertEquals(1, map.size()); + assertEquals("value5", map.get("traceparent")); } } diff --git a/components/camel-tracing/src/test/java/org/apache/camel/tracing/propagation/CamelMessagingHeadersInjectAdapterTest.java b/components/camel-tracing/src/test/java/org/apache/camel/tracing/propagation/CamelMessagingHeadersInjectAdapterTest.java index cb3d85ac8a81..6a32b37c154f 100644 --- a/components/camel-tracing/src/test/java/org/apache/camel/tracing/propagation/CamelMessagingHeadersInjectAdapterTest.java +++ b/components/camel-tracing/src/test/java/org/apache/camel/tracing/propagation/CamelMessagingHeadersInjectAdapterTest.java @@ -59,4 +59,16 @@ public class CamelMessagingHeadersInjectAdapterTest { adapter.put("-key-1-", "value1"); assertNull(map.get(JMS_DASH + "key" + JMS_DASH + "1" + JMS_DASH)); } + + @Test + public void camelHeadersInAnyCaseAreNotInjected() { + CamelMessagingHeadersInjectAdapter adapter = new CamelMessagingHeadersInjectAdapter(map, true); + adapter.put("CamelFoo", "value1"); + adapter.put("camelFoo", "value2"); + adapter.put("CAMELFOO", "value3"); + adapter.put("CaMeLfoo", "value4"); + adapter.put("traceparent", "value5"); + assertEquals(1, map.size()); + assertEquals("value5", map.get("traceparent")); + } } diff --git a/core/camel-support/src/main/java/org/apache/camel/support/DefaultExchangeHolder.java b/core/camel-support/src/main/java/org/apache/camel/support/DefaultExchangeHolder.java index 768c09c18b43..d23e0a161a04 100644 --- a/core/camel-support/src/main/java/org/apache/camel/support/DefaultExchangeHolder.java +++ b/core/camel-support/src/main/java/org/apache/camel/support/DefaultExchangeHolder.java @@ -29,6 +29,7 @@ import org.apache.camel.Exchange; import org.apache.camel.RuntimeExchangeException; import org.apache.camel.WrappedFile; import org.apache.camel.util.ObjectHelper; +import org.apache.camel.util.StringHelper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -421,7 +422,7 @@ public class DefaultExchangeHolder implements Serializable { } private static void logCannotSerializeObject(String type, String key, Object value) { - if (key.startsWith("Camel")) { + if (StringHelper.startsWithIgnoreCase(key, "Camel")) { // log Camel at DEBUG level if (LOG.isDebugEnabled()) { LOG.debug(
