This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/main by this push:
     new 46b8cac40b4e CAMEL-25131: Match header names in any case (#27040)
46b8cac40b4e is described below

commit 46b8cac40b4eeb9783b462294be1df488027f736
Author: Claus Ibsen <[email protected]>
AuthorDate: Tue Sep 29 08:46:11 2026 +0200

    CAMEL-25131: Match header names in any case (#27040)
    
    Message headers are case-insensitive, so Camel header names are now matched 
in any case in camel-support, camel-tracing, camel-telemetry, camel-netty-http, 
camel-jms, camel-sjms, camel-cxf, camel-kafka, camel-jcr and camel-tahu.
    
    Signed-off-by: Claus Ibsen <[email protected]>
    Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
---
 .../cxf/common/header/CxfHeaderHelper.java         | 14 ++---
 .../component/cxf/jaxws/DefaultCxfBinding.java     |  3 +-
 .../cxf/common/header/CxfHeaderHelperTest.java     | 13 +++++
 .../apache/camel/component/jcr/JcrProducer.java    |  4 +-
 .../org/apache/camel/component/jms/JmsBinding.java | 26 +++++++---
 .../apache/camel/component/jms/JmsBindingTest.java | 20 ++++++++
 .../component/kafka/KafkaHeaderDeserializer.java   |  3 +-
 .../kafka/KafkaHeaderDeserializerTest.java         | 50 ++++++++++++++++++
 .../netty/http/DefaultNettyHttpBinding.java        |  4 +-
 .../component/netty/http/NettyHttpProducer.java    |  3 +-
 .../DefaultNettyHttpBindingCamelHeadersTest.java   | 59 ++++++++++++++++++++++
 .../camel/component/sjms/jms/JmsBinding.java       | 26 +++++++---
 .../sjms/jms/JmsBindingStandardHeaderTest.java     | 56 ++++++++++++++++++++
 .../component/tahu/TahuEdgePayloadConverter.java   |  7 +--
 ...CamelHeadersSpanContextPropagationInjector.java |  8 ++-
 ...elJMSHeadersSpanContextPropagationInjector.java |  8 ++-
 .../propagation/CamelHeadersInjectAdapterTest.java | 17 +++++++
 .../CamelMessagingHeadersInjectAdapterTest.java    | 17 +++++++
 .../propagation/CamelHeadersInjectAdapter.java     |  3 +-
 .../CamelMessagingHeadersInjectAdapter.java        |  3 +-
 .../CamelHeadersInjectAdapterTest.java}            | 29 ++++++-----
 .../CamelMessagingHeadersInjectAdapterTest.java    | 12 +++++
 .../camel/support/DefaultExchangeHolder.java       |  3 +-
 .../ROOT/pages/camel-4x-upgrade-guide-4_23.adoc    | 11 ++++
 24 files changed, 350 insertions(+), 49 deletions(-)

diff --git 
a/components/camel-cxf/camel-cxf-common/src/main/java/org/apache/camel/component/cxf/common/header/CxfHeaderHelper.java
 
b/components/camel-cxf/camel-cxf-common/src/main/java/org/apache/camel/component/cxf/common/header/CxfHeaderHelper.java
index 8552309c5810..8d37b48d7c89 100644
--- 
a/components/camel-cxf/camel-cxf-common/src/main/java/org/apache/camel/component/cxf/common/header/CxfHeaderHelper.java
+++ 
b/components/camel-cxf/camel-cxf-common/src/main/java/org/apache/camel/component/cxf/common/header/CxfHeaderHelper.java
@@ -19,7 +19,6 @@ package org.apache.camel.component.cxf.common.header;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.TreeMap;
@@ -39,8 +38,9 @@ import org.slf4j.LoggerFactory;
 public final class CxfHeaderHelper {
     private static final Logger LOG = 
LoggerFactory.getLogger(CxfHeaderHelper.class);
 
-    private static final Map<String, String> CAMEL_TO_CXF_HEADERS = new 
HashMap<>();
-    private static final Map<String, String> CXF_TO_CAMEL_HEADERS = new 
HashMap<>();
+    // the header names are case-insensitive
+    private static final Map<String, String> CAMEL_TO_CXF_HEADERS = new 
TreeMap<>(String.CASE_INSENSITIVE_ORDER);
+    private static final Map<String, String> CXF_TO_CAMEL_HEADERS = new 
TreeMap<>(String.CASE_INSENSITIVE_ORDER);
 
     static {
         // initialize mappings between Camel and CXF header names
@@ -151,12 +151,12 @@ public final class CxfHeaderHelper {
 
             LOG.trace("Propagate Camel header: {}={} as {}", entry.getKey(), 
entry.getValue(), cxfHeaderName);
 
-            if (Exchange.CONTENT_TYPE.equals(entry.getKey())) {
+            if (Exchange.CONTENT_TYPE.equalsIgnoreCase(entry.getKey())) {
                 cxfMessage.put(cxfHeaderName, entry.getValue());
             }
-            if (Exchange.HTTP_RESPONSE_CODE.equals(entry.getKey())
-                    || Client.REQUEST_CONTEXT.equals(entry.getKey())
-                    || Client.RESPONSE_CONTEXT.equals(entry.getKey())) {
+            if (Exchange.HTTP_RESPONSE_CODE.equalsIgnoreCase(entry.getKey())
+                    || Client.REQUEST_CONTEXT.equalsIgnoreCase(entry.getKey())
+                    || 
Client.RESPONSE_CONTEXT.equalsIgnoreCase(entry.getKey())) {
                 cxfMessage.put(cxfHeaderName, entry.getValue());
             } else {
                 Object values = entry.getValue();
diff --git 
a/components/camel-cxf/camel-cxf-soap/src/main/java/org/apache/camel/component/cxf/jaxws/DefaultCxfBinding.java
 
b/components/camel-cxf/camel-cxf-soap/src/main/java/org/apache/camel/component/cxf/jaxws/DefaultCxfBinding.java
index e07f9976bb50..ee13313ca47f 100644
--- 
a/components/camel-cxf/camel-cxf-soap/src/main/java/org/apache/camel/component/cxf/jaxws/DefaultCxfBinding.java
+++ 
b/components/camel-cxf/camel-cxf-soap/src/main/java/org/apache/camel/component/cxf/jaxws/DefaultCxfBinding.java
@@ -914,7 +914,8 @@ public class DefaultCxfBinding implements CxfBinding, 
HeaderFilterStrategyAware
 
         for (Map.Entry<String, Object> entry : camelHeaders.entrySet()) {
             // put response code in request context so it will be copied to 
CXF message's property
-            if (Message.RESPONSE_CODE.equals(entry.getKey()) || 
CxfConstants.HTTP_RESPONSE_CODE.equals(entry.getKey())) {
+            if (Message.RESPONSE_CODE.equalsIgnoreCase(entry.getKey())
+                    || 
CxfConstants.HTTP_RESPONSE_CODE.equalsIgnoreCase(entry.getKey())) {
                 LOG.debug("Propagate to CXF header: {} value: {}", 
Message.RESPONSE_CODE, entry.getValue());
                 cxfContext.put(Message.RESPONSE_CODE, entry.getValue());
                 continue;
diff --git 
a/components/camel-cxf/camel-cxf-transport/src/test/java/org/apache/camel/component/cxf/common/header/CxfHeaderHelperTest.java
 
b/components/camel-cxf/camel-cxf-transport/src/test/java/org/apache/camel/component/cxf/common/header/CxfHeaderHelperTest.java
index 8c1c00b7345b..3d8c078e7607 100644
--- 
a/components/camel-cxf/camel-cxf-transport/src/test/java/org/apache/camel/component/cxf/common/header/CxfHeaderHelperTest.java
+++ 
b/components/camel-cxf/camel-cxf-transport/src/test/java/org/apache/camel/component/cxf/common/header/CxfHeaderHelperTest.java
@@ -181,4 +181,17 @@ public class CxfHeaderHelperTest {
         assertEquals(value, values.get(0), "The value must match");
     }
 
+    @Test
+    public void testPropagateCamelToCxfHeaderNameInAnyCase() {
+        Exchange exchange = new DefaultExchange(context);
+        exchange.getIn().setHeader("content-type", "text/xml");
+        exchange.getIn().setHeader("camelhttpresponsecode", "200");
+        Message cxfMessage = new MessageImpl();
+
+        CxfHeaderHelper.propagateCamelToCxf(new DefaultHeaderFilterStrategy(),
+                exchange.getIn().getHeaders(), cxfMessage, exchange);
+
+        assertEquals("text/xml", cxfMessage.get(Message.CONTENT_TYPE));
+        assertEquals("200", cxfMessage.get(Message.RESPONSE_CODE));
+    }
 }
diff --git 
a/components/camel-jcr/src/main/java/org/apache/camel/component/jcr/JcrProducer.java
 
b/components/camel-jcr/src/main/java/org/apache/camel/component/jcr/JcrProducer.java
index 1ead9b840321..7d78e93a67db 100644
--- 
a/components/camel-jcr/src/main/java/org/apache/camel/component/jcr/JcrProducer.java
+++ 
b/components/camel-jcr/src/main/java/org/apache/camel/component/jcr/JcrProducer.java
@@ -111,8 +111,8 @@ public class JcrProducer extends DefaultProducer {
         Map<String, Object> result = new HashMap<>(properties.size());
         for (Map.Entry<String, Object> entry : properties.entrySet()) {
             String key = entry.getKey();
-            if (!key.equals(JcrConstants.JCR_NODE_NAME) && 
!key.equals(JcrConstants.JCR_OPERATION)
-                    && !key.equals(JcrConstants.JCR_NODE_TYPE)) {
+            if (!key.equalsIgnoreCase(JcrConstants.JCR_NODE_NAME) && 
!key.equalsIgnoreCase(JcrConstants.JCR_OPERATION)
+                    && !key.equalsIgnoreCase(JcrConstants.JCR_NODE_TYPE)) {
                 result.put(entry.getKey(), entry.getValue());
             }
         }
diff --git 
a/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsBinding.java
 
b/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsBinding.java
index 6d211bdec594..4048099a6825 100644
--- 
a/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsBinding.java
+++ 
b/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsBinding.java
@@ -31,9 +31,11 @@ import java.util.Date;
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
+import java.util.TreeSet;
 
 import jakarta.jms.BytesMessage;
 import jakarta.jms.Destination;
@@ -80,6 +82,15 @@ import static 
org.apache.camel.component.jms.JmsMessageType.Text;
  */
 public class JmsBinding {
     private static final Logger LOG = 
LoggerFactory.getLogger(JmsBinding.class);
+
+    // the standard JMS headers (matched in any case, as Camel headers are 
case-insensitive)
+    private static final Set<String> STANDARD_JMS_HEADERS = new 
TreeSet<>(String.CASE_INSENSITIVE_ORDER);
+
+    static {
+        STANDARD_JMS_HEADERS.addAll(List.of("JMSCorrelationID", 
"JMSDeliveryMode", "JMSDeliveryTime", "JMSDestination",
+                "JMSExpiration", "JMSMessageID", "JMSPriority", 
"JMSRedelivered", "JMSReplyTo", "JMSTimestamp", "JMSType"));
+    }
+
     private final JmsEndpoint endpoint;
     private final HeaderFilterStrategy headerFilterStrategy;
     private final JmsKeyFormatStrategy jmsKeyFormatStrategy;
@@ -418,10 +429,10 @@ public class JmsBinding {
             String headerName, Object headerValue)
             throws JMSException {
         if (isStandardJMSHeader(headerName)) {
-            if (headerName.equals(JmsConstants.JMS_HEADER_CORRELATION_ID)
+            if 
(headerName.equalsIgnoreCase(JmsConstants.JMS_HEADER_CORRELATION_ID)
                     && (endpoint == null || 
!endpoint.isUseMessageIDAsCorrelationID())) {
                 
jmsMessage.setJMSCorrelationID(ExchangeHelper.convertToType(exchange, 
String.class, headerValue));
-            } else if (headerName.equals(JmsConstants.JMS_HEADER_REPLY_TO) && 
headerValue != null) {
+            } else if 
(headerName.equalsIgnoreCase(JmsConstants.JMS_HEADER_REPLY_TO) && headerValue 
!= null) {
                 if (headerValue instanceof String string) {
                     // if the value is a String we must normalize it first, 
and must include the prefix
                     // as ActiveMQ requires that when converting the String to 
a jakarta.jms.Destination type
@@ -429,14 +440,14 @@ public class JmsBinding {
                 }
                 Destination replyTo = ExchangeHelper.convertToType(exchange, 
Destination.class, headerValue);
                 JmsMessageHelper.setJMSReplyTo(jmsMessage, replyTo);
-            } else if (headerName.equals(JmsConstants.JMS_HEADER_TYPE)) {
+            } else if 
(headerName.equalsIgnoreCase(JmsConstants.JMS_HEADER_TYPE)) {
                 jmsMessage.setJMSType(ExchangeHelper.convertToType(exchange, 
String.class, headerValue));
-            } else if (headerName.equals(JmsConstants.JMS_HEADER_PRIORITY)) {
+            } else if 
(headerName.equalsIgnoreCase(JmsConstants.JMS_HEADER_PRIORITY)) {
                 
jmsMessage.setJMSPriority(ExchangeHelper.convertToType(exchange, Integer.class, 
headerValue));
-            } else if 
(headerName.equals(JmsConstants.JMS_HEADER_DELIVERY_MODE)) {
+            } else if 
(headerName.equalsIgnoreCase(JmsConstants.JMS_HEADER_DELIVERY_MODE)) {
                 boolean qos = endpoint != null && 
endpoint.isPreserveMessageQos();
                 JmsMessageHelper.setJMSDeliveryMode(exchange, jmsMessage, 
headerValue, qos);
-            } else if (headerName.equals(JmsConstants.JMS_HEADER_EXPIRATION)) {
+            } else if 
(headerName.equalsIgnoreCase(JmsConstants.JMS_HEADER_EXPIRATION)) {
                 
jmsMessage.setJMSExpiration(ExchangeHelper.convertToType(exchange, Long.class, 
headerValue));
             } else {
                 // The following properties are set by the MessageProducer:
@@ -501,6 +512,9 @@ public class JmsBinding {
      * @return            <tt>true</tt> if its a standard JMS header
      */
     protected boolean isStandardJMSHeader(String headerName) {
+        if (STANDARD_JMS_HEADERS.contains(headerName)) {
+            return true;
+        }
         if (!headerName.startsWith("JMS")) {
             return false;
         }
diff --git 
a/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsBindingTest.java
 
b/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsBindingTest.java
index 48e7ca9f26f7..b8aadf5e637c 100644
--- 
a/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsBindingTest.java
+++ 
b/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsBindingTest.java
@@ -25,12 +25,14 @@ import java.util.Date;
 import java.util.HashMap;
 
 import jakarta.jms.JMSException;
+import jakarta.jms.Message;
 import jakarta.jms.ObjectMessage;
 
 import com.example.external.NotAllowedPayload;
 import org.apache.activemq.artemis.jms.client.ActiveMQTextMessage;
 import org.apache.camel.Exchange;
 import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.camel.support.DefaultExchange;
 import org.apache.camel.support.DefaultExchangeHolder;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
@@ -43,8 +45,11 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertNull;
 import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.Mockito.lenient;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 @ExtendWith(MockitoExtension.class)
@@ -181,4 +186,19 @@ public class JmsBindingTest {
         // when enabled, extraction proceeds (returns the deserialized payload)
         assertDoesNotThrow(() -> jmsBindingUnderTest.extractBodyFromJms(null, 
message));
     }
+
+    @Test
+    public void testStandardJmsHeaderInAnyCase() throws Exception {
+        Message message = mock(Message.class);
+        try (DefaultCamelContext camelContext = new DefaultCamelContext()) {
+            Exchange exchange = new DefaultExchange(camelContext);
+            jmsBindingUnderTest.appendJmsProperty(message, exchange, 
"jmscorrelationid", "123");
+            jmsBindingUnderTest.appendJmsProperty(message, exchange, 
"JMSTYPE", "myType");
+            jmsBindingUnderTest.appendJmsProperty(message, exchange, 
"jmsPriority", 7);
+        }
+        verify(message).setJMSCorrelationID("123");
+        verify(message).setJMSType("myType");
+        verify(message).setJMSPriority(7);
+        verify(message, never()).setStringProperty(anyString(), anyString());
+    }
 }
diff --git 
a/components/camel-kafka/src/main/java/org/apache/camel/component/kafka/KafkaHeaderDeserializer.java
 
b/components/camel-kafka/src/main/java/org/apache/camel/component/kafka/KafkaHeaderDeserializer.java
index e758d38dea14..64d5ce463056 100644
--- 
a/components/camel-kafka/src/main/java/org/apache/camel/component/kafka/KafkaHeaderDeserializer.java
+++ 
b/components/camel-kafka/src/main/java/org/apache/camel/component/kafka/KafkaHeaderDeserializer.java
@@ -85,7 +85,8 @@ public class KafkaHeaderDeserializer implements Processor {
      * Exclude special Kafka headers from auto deserialization.
      */
     private boolean shouldDeserialize(Map.Entry<String, Object> entry) {
-        return !entry.getKey().equals(KafkaConstants.HEADERS) && 
!entry.getKey().equals(KafkaConstants.MANUAL_COMMIT);
+        return !entry.getKey().equalsIgnoreCase(KafkaConstants.HEADERS)
+                && 
!entry.getKey().equalsIgnoreCase(KafkaConstants.MANUAL_COMMIT);
     }
 
     public void setEnabled(String enabled) {
diff --git 
a/components/camel-kafka/src/test/java/org/apache/camel/component/kafka/KafkaHeaderDeserializerTest.java
 
b/components/camel-kafka/src/test/java/org/apache/camel/component/kafka/KafkaHeaderDeserializerTest.java
new file mode 100644
index 000000000000..6fcc17c6ff10
--- /dev/null
+++ 
b/components/camel-kafka/src/test/java/org/apache/camel/component/kafka/KafkaHeaderDeserializerTest.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.kafka;
+
+import java.nio.charset.StandardCharsets;
+
+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;
+import static org.junit.jupiter.api.Assertions.assertInstanceOf;
+
+public class KafkaHeaderDeserializerTest {
+
+    @Test
+    public void testSpecialHeadersInAnyCaseAreNotDeserialized() throws 
Exception {
+        try (DefaultCamelContext context = new DefaultCamelContext()) {
+            context.start();
+            Exchange exchange = new DefaultExchange(context);
+            byte[] data = "hello".getBytes(StandardCharsets.UTF_8);
+            exchange.getMessage().setHeader("foo", data);
+            exchange.getMessage().setHeader("camelkafkamanualcommit", data);
+            exchange.getMessage().setHeader("CAMELKAFKAHEADERS", data);
+
+            KafkaHeaderDeserializer deserializer = new 
KafkaHeaderDeserializer();
+            deserializer.setEnabled("true");
+            deserializer.process(exchange);
+
+            assertEquals("hello", exchange.getMessage().getHeader("foo"));
+            assertInstanceOf(byte[].class, 
exchange.getMessage().getHeader(KafkaConstants.MANUAL_COMMIT));
+            assertInstanceOf(byte[].class, 
exchange.getMessage().getHeader(KafkaConstants.HEADERS));
+        }
+    }
+}
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..67e8d54704a8 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)));
 
     }
@@ -340,7 +340,7 @@ public class DefaultNettyHttpBinding implements 
NettyHttpBinding, Cloneable {
     protected String shouldUrlDecodeHeader(
             NettyHttpConfiguration configuration, String headerName, Object 
value, Charset charset) {
         // do not decode Content-Type
-        if (NettyHttpConstants.CONTENT_TYPE.equals(headerName)) {
+        if (NettyHttpConstants.CONTENT_TYPE.equalsIgnoreCase(headerName)) {
             return value.toString();
         } else if (configuration.isUrlDecodeHeaders()) {
             return URLDecoder.decode(value.toString(), charset);
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-netty-http/src/test/java/org/apache/camel/component/netty/http/DefaultNettyHttpBindingCamelHeadersTest.java
 
b/components/camel-netty-http/src/test/java/org/apache/camel/component/netty/http/DefaultNettyHttpBindingCamelHeadersTest.java
new file mode 100644
index 000000000000..038b225d2a69
--- /dev/null
+++ 
b/components/camel-netty-http/src/test/java/org/apache/camel/component/netty/http/DefaultNettyHttpBindingCamelHeadersTest.java
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.netty.http;
+
+import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
+import java.util.Map;
+
+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 DefaultNettyHttpBindingCamelHeadersTest {
+
+    @Test
+    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 testContentTypeInAnyCaseIsNotUrlDecoded() {
+        NettyHttpConfiguration configuration = new NettyHttpConfiguration();
+        configuration.setUrlDecodeHeaders(true);
+        DefaultNettyHttpBinding binding = new DefaultNettyHttpBinding();
+
+        assertEquals("text/plain; a=b%20c",
+                binding.shouldUrlDecodeHeader(configuration, "content-type", 
"text/plain; a=b%20c", StandardCharsets.UTF_8));
+        assertEquals("b c", binding.shouldUrlDecodeHeader(configuration, 
"foo", "b%20c", StandardCharsets.UTF_8));
+    }
+}
diff --git 
a/components/camel-sjms/src/main/java/org/apache/camel/component/sjms/jms/JmsBinding.java
 
b/components/camel-sjms/src/main/java/org/apache/camel/component/sjms/jms/JmsBinding.java
index a66f323d5d88..ed1678b723c0 100644
--- 
a/components/camel-sjms/src/main/java/org/apache/camel/component/sjms/jms/JmsBinding.java
+++ 
b/components/camel-sjms/src/main/java/org/apache/camel/component/sjms/jms/JmsBinding.java
@@ -27,8 +27,10 @@ import java.nio.ByteBuffer;
 import java.util.Date;
 import java.util.Enumeration;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.TreeSet;
 
 import jakarta.jms.BytesMessage;
 import jakarta.jms.Destination;
@@ -67,6 +69,15 @@ import static 
org.apache.camel.component.sjms.jms.JmsMessageHelper.normalizeDest
 public class JmsBinding {
 
     private static final Logger LOG = 
LoggerFactory.getLogger(JmsBinding.class);
+
+    // the standard JMS headers (matched in any case, as Camel headers are 
case-insensitive)
+    private static final Set<String> STANDARD_JMS_HEADERS = new 
TreeSet<>(String.CASE_INSENSITIVE_ORDER);
+
+    static {
+        STANDARD_JMS_HEADERS.addAll(List.of("JMSCorrelationID", 
"JMSDeliveryMode", "JMSDeliveryTime", "JMSDestination",
+                "JMSExpiration", "JMSMessageID", "JMSPriority", 
"JMSRedelivered", "JMSReplyTo", "JMSTimestamp", "JMSType"));
+    }
+
     private final boolean mapJmsMessage;
     private final boolean allowNullBody;
     private final HeaderFilterStrategy headerFilterStrategy;
@@ -315,9 +326,9 @@ public class JmsBinding {
     public void appendJmsProperty(Message jmsMessage, Exchange exchange, 
String headerName, Object headerValue)
             throws JMSException {
         if (isStandardJMSHeader(headerName)) {
-            if (headerName.equals(JmsConstants.JMS_CORRELATION_ID)) {
+            if (headerName.equalsIgnoreCase(JmsConstants.JMS_CORRELATION_ID)) {
                 
jmsMessage.setJMSCorrelationID(ExchangeHelper.convertToType(exchange, 
String.class, headerValue));
-            } else if (headerName.equals(JmsConstants.JMS_REPLY_TO) && 
headerValue != null) {
+            } else if (headerName.equalsIgnoreCase(JmsConstants.JMS_REPLY_TO) 
&& headerValue != null) {
                 if (headerValue instanceof String s) {
                     // if the value is a String we must normalize it first, 
and must include the prefix
                     // as ActiveMQ requires that when converting the String to 
a jakarta.jms.Destination type
@@ -325,13 +336,13 @@ public class JmsBinding {
                 }
                 Destination replyTo = ExchangeHelper.convertToType(exchange, 
Destination.class, headerValue);
                 JmsMessageHelper.setJMSReplyTo(jmsMessage, replyTo);
-            } else if (headerName.equals("JMSType")) {
+            } else if (headerName.equalsIgnoreCase("JMSType")) {
                 jmsMessage.setJMSType(ExchangeHelper.convertToType(exchange, 
String.class, headerValue));
-            } else if (headerName.equals("JMSPriority")) {
+            } else if (headerName.equalsIgnoreCase("JMSPriority")) {
                 
jmsMessage.setJMSPriority(ExchangeHelper.convertToType(exchange, Integer.class, 
headerValue));
-            } else if (headerName.equals("JMSDeliveryMode")) {
+            } else if (headerName.equalsIgnoreCase("JMSDeliveryMode")) {
                 JmsMessageHelper.setJMSDeliveryMode(exchange, jmsMessage, 
headerValue);
-            } else if (headerName.equals("JMSExpiration")) {
+            } else if (headerName.equalsIgnoreCase("JMSExpiration")) {
                 
jmsMessage.setJMSExpiration(ExchangeHelper.convertToType(exchange, Long.class, 
headerValue));
             } else {
                 // The following properties are set by the MessageProducer:
@@ -365,6 +376,9 @@ public class JmsBinding {
      * @return            <tt>true</tt> if its a standard JMS header
      */
     protected boolean isStandardJMSHeader(String headerName) {
+        if (STANDARD_JMS_HEADERS.contains(headerName)) {
+            return true;
+        }
         if (!headerName.startsWith("JMS")) {
             return false;
         }
diff --git 
a/components/camel-sjms/src/test/java/org/apache/camel/component/sjms/jms/JmsBindingStandardHeaderTest.java
 
b/components/camel-sjms/src/test/java/org/apache/camel/component/sjms/jms/JmsBindingStandardHeaderTest.java
new file mode 100644
index 000000000000..e1c83b079594
--- /dev/null
+++ 
b/components/camel-sjms/src/test/java/org/apache/camel/component/sjms/jms/JmsBindingStandardHeaderTest.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.sjms.jms;
+
+import java.lang.reflect.Proxy;
+import java.util.HashMap;
+import java.util.Map;
+
+import jakarta.jms.Message;
+
+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 JmsBindingStandardHeaderTest {
+
+    @Test
+    public void testStandardJmsHeaderInAnyCase() throws Exception {
+        // records the calls of the setters on the JMS message
+        Map<String, Object> calls = new HashMap<>();
+        Message message = (Message) 
Proxy.newProxyInstance(getClass().getClassLoader(), new Class<?>[] { 
Message.class },
+                (proxy, method, args) -> {
+                    if (method.getName().startsWith("set")) {
+                        calls.put(method.getName(), args[args.length - 1]);
+                    }
+                    return null;
+                });
+
+        JmsBinding binding = new JmsBinding(true, false, null, null, null, 
null);
+        try (DefaultCamelContext context = new DefaultCamelContext()) {
+            Exchange exchange = new DefaultExchange(context);
+            binding.appendJmsProperty(message, exchange, "jmscorrelationid", 
"123");
+            binding.appendJmsProperty(message, exchange, "JMSTYPE", "myType");
+            binding.appendJmsProperty(message, exchange, "jmsPriority", 7);
+        }
+
+        assertEquals(Map.of("setJMSCorrelationID", "123", "setJMSType", 
"myType", "setJMSPriority", 7), calls);
+    }
+}
diff --git 
a/components/camel-tahu/src/main/java/org/apache/camel/component/tahu/TahuEdgePayloadConverter.java
 
b/components/camel-tahu/src/main/java/org/apache/camel/component/tahu/TahuEdgePayloadConverter.java
index 83558bbe3775..2d5099cb8a0f 100644
--- 
a/components/camel-tahu/src/main/java/org/apache/camel/component/tahu/TahuEdgePayloadConverter.java
+++ 
b/components/camel-tahu/src/main/java/org/apache/camel/component/tahu/TahuEdgePayloadConverter.java
@@ -28,6 +28,7 @@ import org.apache.camel.TypeConverter;
 import org.apache.camel.spi.HeaderFilterStrategy;
 import org.apache.camel.spi.HeaderFilterStrategyAware;
 import org.apache.camel.spi.TypeConverterRegistry;
+import org.apache.camel.util.StringHelper;
 import org.eclipse.tahu.SparkplugInvalidTypeException;
 import org.eclipse.tahu.message.model.Metric;
 import org.eclipse.tahu.message.model.MetricDataType;
@@ -74,7 +75,7 @@ public class TahuEdgePayloadConverter implements 
HeaderFilterStrategyAware {
                 // Skip headers where the headerFilterStrategy returns true, 
per
                 // HeaderFilterStrategy.applyFilterToCamelHeaders
 
-            } else if (headerName.equals(TahuConstants.MESSAGE_UUID)) {
+            } else if 
(headerName.equalsIgnoreCase(TahuConstants.MESSAGE_UUID)) {
 
                 dataPayloadBuilder.setUuid(headerValue.toString());
 
@@ -82,12 +83,12 @@ public class TahuEdgePayloadConverter implements 
HeaderFilterStrategyAware {
 
                 dataPayloadBuilder.addMetric(metricValue);
 
-            } else if 
(headerName.startsWith(TahuConstants.METRIC_HEADER_PREFIX)) {
+            } else if (StringHelper.startsWithIgnoreCase(headerName, 
TahuConstants.METRIC_HEADER_PREFIX)) {
 
                 String metricName = headerName;
 
                 // If using the default headerFilterStrategy, strip off the 
header name prefix
-                if (metricName.startsWith(TahuConstants.METRIC_HEADER_PREFIX)) 
{
+                if (StringHelper.startsWithIgnoreCase(metricName, 
TahuConstants.METRIC_HEADER_PREFIX)) {
                     metricName = 
metricName.substring(TahuConstants.METRIC_HEADER_PREFIX.length());
                 }
 
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..991b83f8591c 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,8 @@ package org.apache.camel.telemetry.propagation;
 import java.util.Map;
 
 import org.apache.camel.telemetry.SpanContextPropagationInjector;
+import org.apache.camel.telemetry.Tracer;
+import org.apache.camel.util.StringHelper;
 
 public final class CamelHeadersSpanContextPropagationInjector implements 
SpanContextPropagationInjector {
     private final Map<String, Object> map;
@@ -29,8 +31,10 @@ 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")) {
+        // Assume any header property that begins with 'Camel' (in any case) 
is for internal use,
+        // except the trace and span id headers that the tracer includes on 
purpose
+        if (!StringHelper.startsWithIgnoreCase(key, "Camel") || 
Tracer.TRACE_HEADER.equals(key)
+                || Tracer.SPAN_HEADER.equals(key)) {
             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..dff0e2994b35 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,8 @@ package org.apache.camel.telemetry.propagation;
 import java.util.Map;
 
 import org.apache.camel.telemetry.SpanContextPropagationInjector;
+import org.apache.camel.telemetry.Tracer;
+import org.apache.camel.util.StringHelper;
 
 public final class CamelJMSHeadersSpanContextPropagationInjector implements 
SpanContextPropagationInjector {
 
@@ -36,8 +38,10 @@ 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")) {
+        // Assume any header property that begins with 'Camel' (in any case) 
is for internal use,
+        // except the trace and span id headers that the tracer includes on 
purpose
+        if (!StringHelper.startsWithIgnoreCase(key, "Camel") || 
Tracer.TRACE_HEADER.equals(key)
+                || Tracer.SPAN_HEADER.equals(key)) {
             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..fe76b72c021c 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
@@ -20,6 +20,7 @@ import java.util.HashMap;
 import java.util.Map;
 
 import org.apache.camel.telemetry.SpanContextPropagationInjector;
+import org.apache.camel.telemetry.Tracer;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
@@ -51,4 +52,20 @@ 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");
+        // the trace and span id headers are included on purpose
+        adapter.put(Tracer.TRACE_HEADER, "value6");
+        adapter.put(Tracer.SPAN_HEADER, "value7");
+        assertEquals(3, map.size());
+        assertEquals("value5", map.get("traceparent"));
+        assertEquals("value6", map.get(Tracer.TRACE_HEADER));
+        assertEquals("value7", map.get(Tracer.SPAN_HEADER));
+    }
 }
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..516dc6de245b 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
@@ -20,6 +20,7 @@ import java.util.HashMap;
 import java.util.Map;
 
 import org.apache.camel.telemetry.SpanContextPropagationInjector;
+import org.apache.camel.telemetry.Tracer;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
@@ -52,4 +53,20 @@ 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");
+        // the trace and span id headers are included on purpose
+        adapter.put(Tracer.TRACE_HEADER, "value6");
+        adapter.put(Tracer.SPAN_HEADER, "value7");
+        assertEquals(3, map.size());
+        assertEquals("value5", map.get("traceparent"));
+        assertEquals("value6", map.get(Tracer.TRACE_HEADER));
+        assertEquals("value7", map.get(Tracer.SPAN_HEADER));
+    }
 }
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(
diff --git 
a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_23.adoc 
b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_23.adoc
index c679b2715009..d796f084bd0d 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_23.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_23.adoc
@@ -3485,6 +3485,17 @@ The `onWhen` predicate of an `onException` is now 
created when the route is crea
 A class in `onException` or `doCatch` that is not an exception (such as 
`<exception>java.lang.String</exception>` in XML
 or YAML) now fails at startup. Previously it was accepted, and never matched 
any exception.
 
+=== Header names are matched in any case
+
+Message headers are case-insensitive, and components now also match the header 
names they look for in any case:
+
+- camel-jms, camel-sjms: a standard JMS header set with another case, such as 
`jmscorrelationid` or `JMSTYPE`, now
+  sets the JMS header (such as the correlation id). Previously it was sent as 
a JMS property with that name.
+- camel-cxf: a `content-type` or `camelhttpresponsecode` header is used as the 
content type or response code of the
+  CXF message, as `Content-Type` and `CamelHttpResponseCode` are.
+- camel-tracing, camel-telemetry, camel-netty-http: a header whose name starts 
with `Camel` in any case (such as
+  `camelFoo`) is treated as a Camel header.
+
 === camel-debezium - a failed embedded engine is now reported
 
 The Debezium consumers now register a `CompletionCallback` on the embedded 
engine. When the engine stops

Reply via email to