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