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(

Reply via email to