You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2026/10/02 07:52:59 UTC
(camel) branch camel-4.18.x updated: [backport camel-4.18.x] CAMEL-25225: camel-spring-ws - apply the HeaderFilterStrategy to producer response headers (#27257)
This is an automated email from the ASF dual-hosted git repository.
davsclaus pushed a commit to branch camel-4.18.x
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/camel-4.18.x by this push:
new ff188658ba87 [backport camel-4.18.x] CAMEL-25225: camel-spring-ws - apply the HeaderFilterStrategy to producer response headers (#27257)
ff188658ba87 is described below
commit ff188658ba87d805ecdce241249dd8f739104eec
Author: Andrea Cosentino <an...@gmail.com>
AuthorDate: Fri Oct 2 09:52:51 2026 +0200
[backport camel-4.18.x] CAMEL-25225: camel-spring-ws - apply the HeaderFilterStrategy to producer response headers (#27257)
Co-Authored-By: Claude Opus 5.5 (1M context) <no...@anthropic.com>
---
.../apache/camel/catalog/components/spring-ws.json | 2 +-
.../camel/component/spring/ws/spring-ws.json | 2 +-
.../spring/ws/SpringWebserviceConfiguration.java | 4 +-
.../spring/ws/SpringWebserviceProducer.java | 31 +++++--
.../spring/ws/ProducerSoapHeaderFilterTest.java | 98 ++++++++++++++++++++++
.../ResponseSoapHeaderMessageFilter.java | 51 +++++++++++
.../ws/ProducerSoapHeaderFilterTest-context.xml | 70 ++++++++++++++++
.../SpringWebserviceEndpointBuilderFactory.java | 10 ++-
8 files changed, 254 insertions(+), 14 deletions(-)
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/spring-ws.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/spring-ws.json
index 0919981533a7..f68d778f2128 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/spring-ws.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/spring-ws.json
@@ -53,7 +53,7 @@
"exceptionHandler": { "index": 10, "kind": "parameter", "displayName": "Exception Handler", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.ExceptionHandler", "optionalPrefix": "consumer.", "deprecated": false, "autowired": false, "secret": false, "description": "To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By de [...]
"exchangePattern": { "index": 11, "kind": "parameter", "displayName": "Exchange Pattern", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "enum", "javaType": "org.apache.camel.ExchangePattern", "enum": [ "InOnly", "InOut" ], "deprecated": false, "autowired": false, "secret": false, "description": "Sets the exchange pattern when the consumer creates an exchange." },
"allowResponseAttachmentOverride": { "index": 12, "kind": "parameter", "displayName": "Allow Response Attachment Override", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.spring.ws.SpringWebserviceConfiguration", "configurationField": "configuration", "description": "Option to override soap response [...]
- "allowResponseHeaderOverride": { "index": 13, "kind": "parameter", "displayName": "Allow Response Header Override", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.spring.ws.SpringWebserviceConfiguration", "configurationField": "configuration", "description": "Option to override soap response header i [...]
+ "allowResponseHeaderOverride": { "index": 13, "kind": "parameter", "displayName": "Allow Response Header Override", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.spring.ws.SpringWebserviceConfiguration", "configurationField": "configuration", "description": "Option to override soap response header i [...]
"faultAction": { "index": 14, "kind": "parameter", "displayName": "Fault Action", "group": "producer", "label": "producer", "required": false, "type": "string", "javaType": "java.net.URI", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.spring.ws.SpringWebserviceConfiguration", "configurationField": "configuration", "description": "Signifies the value for the faultAction response WS-Addressing Fault Action header that is pro [...]
"faultTo": { "index": 15, "kind": "parameter", "displayName": "Fault To", "group": "producer", "label": "producer", "required": false, "type": "string", "javaType": "java.net.URI", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.spring.ws.SpringWebserviceConfiguration", "configurationField": "configuration", "description": "Signifies the value for the faultAction response WS-Addressing FaultTo header that is provided by the [...]
"messageFactory": { "index": 16, "kind": "parameter", "displayName": "Message Factory", "group": "producer", "label": "producer", "required": false, "type": "object", "javaType": "org.springframework.ws.WebServiceMessageFactory", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.spring.ws.SpringWebserviceConfiguration", "configurationField": "configuration", "description": "Option to provide a custom WebServiceMessageFactory." },
diff --git a/components/camel-spring-parent/camel-spring-ws/src/generated/resources/META-INF/org/apache/camel/component/spring/ws/spring-ws.json b/components/camel-spring-parent/camel-spring-ws/src/generated/resources/META-INF/org/apache/camel/component/spring/ws/spring-ws.json
index 0919981533a7..f68d778f2128 100644
--- a/components/camel-spring-parent/camel-spring-ws/src/generated/resources/META-INF/org/apache/camel/component/spring/ws/spring-ws.json
+++ b/components/camel-spring-parent/camel-spring-ws/src/generated/resources/META-INF/org/apache/camel/component/spring/ws/spring-ws.json
@@ -53,7 +53,7 @@
"exceptionHandler": { "index": 10, "kind": "parameter", "displayName": "Exception Handler", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.ExceptionHandler", "optionalPrefix": "consumer.", "deprecated": false, "autowired": false, "secret": false, "description": "To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By de [...]
"exchangePattern": { "index": 11, "kind": "parameter", "displayName": "Exchange Pattern", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "enum", "javaType": "org.apache.camel.ExchangePattern", "enum": [ "InOnly", "InOut" ], "deprecated": false, "autowired": false, "secret": false, "description": "Sets the exchange pattern when the consumer creates an exchange." },
"allowResponseAttachmentOverride": { "index": 12, "kind": "parameter", "displayName": "Allow Response Attachment Override", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.spring.ws.SpringWebserviceConfiguration", "configurationField": "configuration", "description": "Option to override soap response [...]
- "allowResponseHeaderOverride": { "index": 13, "kind": "parameter", "displayName": "Allow Response Header Override", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.spring.ws.SpringWebserviceConfiguration", "configurationField": "configuration", "description": "Option to override soap response header i [...]
+ "allowResponseHeaderOverride": { "index": 13, "kind": "parameter", "displayName": "Allow Response Header Override", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.spring.ws.SpringWebserviceConfiguration", "configurationField": "configuration", "description": "Option to override soap response header i [...]
"faultAction": { "index": 14, "kind": "parameter", "displayName": "Fault Action", "group": "producer", "label": "producer", "required": false, "type": "string", "javaType": "java.net.URI", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.spring.ws.SpringWebserviceConfiguration", "configurationField": "configuration", "description": "Signifies the value for the faultAction response WS-Addressing Fault Action header that is pro [...]
"faultTo": { "index": 15, "kind": "parameter", "displayName": "Fault To", "group": "producer", "label": "producer", "required": false, "type": "string", "javaType": "java.net.URI", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.spring.ws.SpringWebserviceConfiguration", "configurationField": "configuration", "description": "Signifies the value for the faultAction response WS-Addressing FaultTo header that is provided by the [...]
"messageFactory": { "index": 16, "kind": "parameter", "displayName": "Message Factory", "group": "producer", "label": "producer", "required": false, "type": "object", "javaType": "org.springframework.ws.WebServiceMessageFactory", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.spring.ws.SpringWebserviceConfiguration", "configurationField": "configuration", "description": "Option to provide a custom WebServiceMessageFactory." },
diff --git a/components/camel-spring-parent/camel-spring-ws/src/main/java/org/apache/camel/component/spring/ws/SpringWebserviceConfiguration.java b/components/camel-spring-parent/camel-spring-ws/src/main/java/org/apache/camel/component/spring/ws/SpringWebserviceConfiguration.java
index 3a7da5ea2542..123cf22b74a4 100644
--- a/components/camel-spring-parent/camel-spring-ws/src/main/java/org/apache/camel/component/spring/ws/SpringWebserviceConfiguration.java
+++ b/components/camel-spring-parent/camel-spring-ws/src/main/java/org/apache/camel/component/spring/ws/SpringWebserviceConfiguration.java
@@ -444,7 +444,9 @@ public class SpringWebserviceConfiguration {
/**
* Option to override soap response header in in/out exchange with header info from the actual service layer. If the
* invoked service appends or rewrites the soap header this option when set to true, allows the modified soap header
- * to be overwritten in in/out message headers
+ * to be overwritten in in/out message headers. The names of the soap response header attributes and elements are
+ * filtered using the headerFilterStrategy, which by default filters out the internal {@code Camel} and
+ * {@code camel} header namespace (case-insensitive).
*/
public void setAllowResponseHeaderOverride(boolean allowResponseHeaderOverride) {
this.allowResponseHeaderOverride = allowResponseHeaderOverride;
diff --git a/components/camel-spring-parent/camel-spring-ws/src/main/java/org/apache/camel/component/spring/ws/SpringWebserviceProducer.java b/components/camel-spring-parent/camel-spring-ws/src/main/java/org/apache/camel/component/spring/ws/SpringWebserviceProducer.java
index 112ac4812130..f31558346062 100644
--- a/components/camel-spring-parent/camel-spring-ws/src/main/java/org/apache/camel/component/spring/ws/SpringWebserviceProducer.java
+++ b/components/camel-spring-parent/camel-spring-ws/src/main/java/org/apache/camel/component/spring/ws/SpringWebserviceProducer.java
@@ -36,6 +36,7 @@ import org.apache.camel.Exchange;
import org.apache.camel.Message;
import org.apache.camel.RuntimeCamelException;
import org.apache.camel.attachment.AttachmentMessage;
+import org.apache.camel.spi.HeaderFilterStrategy;
import org.apache.camel.support.DefaultProducer;
import org.apache.camel.support.ExchangeHelper;
import org.slf4j.Logger;
@@ -109,10 +110,12 @@ public class SpringWebserviceProducer extends DefaultProducer {
SoapMessage soapMessage = (SoapMessage) responseMessage;
if (ExchangeHelper.isOutCapable(exchange)) {
exchange.getOut().copyFromWithNewBody(exchange.getIn(), soapMessage.getPayloadSource());
- populateHeaderAndAttachmentsFromResponse(exchange.getOut(AttachmentMessage.class), soapMessage);
+ populateHeaderAndAttachmentsFromResponse(exchange, exchange.getOut(AttachmentMessage.class),
+ soapMessage);
} else {
exchange.getIn().setBody(soapMessage.getPayloadSource());
- populateHeaderAndAttachmentsFromResponse(exchange.getIn(AttachmentMessage.class), soapMessage);
+ populateHeaderAndAttachmentsFromResponse(exchange, exchange.getIn(AttachmentMessage.class),
+ soapMessage);
}
}
@@ -122,9 +125,10 @@ public class SpringWebserviceProducer extends DefaultProducer {
/**
* Populates soap message headers and attachments from soap response
*/
- private void populateHeaderAndAttachmentsFromResponse(AttachmentMessage inOrOut, SoapMessage soapMessage) {
+ private void populateHeaderAndAttachmentsFromResponse(
+ Exchange exchange, AttachmentMessage inOrOut, SoapMessage soapMessage) {
if (soapMessage.getSoapHeader() != null && getEndpoint().getConfiguration().isAllowResponseHeaderOverride()) {
- populateMessageHeaderFromResponse(inOrOut, soapMessage.getSoapHeader());
+ populateMessageHeaderFromResponse(exchange, inOrOut, soapMessage.getSoapHeader());
}
if (soapMessage.getAttachments() != null && getEndpoint().getConfiguration().isAllowResponseAttachmentOverride()) {
populateMessageAttachmentsFromResponse(inOrOut, soapMessage.getAttachments());
@@ -132,15 +136,22 @@ public class SpringWebserviceProducer extends DefaultProducer {
}
/**
- * Populates message headers from soapHeader response
+ * Populates message headers from soapHeader response, applying the endpoint's {@link HeaderFilterStrategy} to the
+ * soap header attribute and element names
*/
- private void populateMessageHeaderFromResponse(Message message, SoapHeader soapHeader) {
+ private void populateMessageHeaderFromResponse(Exchange exchange, Message message, SoapHeader soapHeader) {
+ HeaderFilterStrategy headerFilterStrategy = getEndpoint().getHeaderFilterStrategy();
+
message.setHeader(SpringWebserviceConstants.SPRING_WS_SOAP_HEADER, soapHeader.getSource());
// Set header values for the soap header attributes
Iterator<QName> attIter = soapHeader.getAllAttributes();
while (attIter.hasNext()) {
QName name = attIter.next();
- message.getHeaders().put(name.getLocalPart(), soapHeader.getAttributeValue(name));
+ Object value = soapHeader.getAttributeValue(name);
+ if (headerFilterStrategy == null
+ || !headerFilterStrategy.applyFilterToExternalHeaders(name.getLocalPart(), value, exchange)) {
+ message.getHeaders().put(name.getLocalPart(), value);
+ }
}
// Set header values for the soap header elements
@@ -148,8 +159,10 @@ public class SpringWebserviceProducer extends DefaultProducer {
while (elementIter.hasNext()) {
SoapHeaderElement element = elementIter.next();
QName name = element.getName();
- message.getHeaders().put(name.getLocalPart(), element);
-
+ if (headerFilterStrategy == null
+ || !headerFilterStrategy.applyFilterToExternalHeaders(name.getLocalPart(), element, exchange)) {
+ message.getHeaders().put(name.getLocalPart(), element);
+ }
}
}
diff --git a/components/camel-spring-parent/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/ProducerSoapHeaderFilterTest.java b/components/camel-spring-parent/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/ProducerSoapHeaderFilterTest.java
new file mode 100644
index 000000000000..86af8046d6d5
--- /dev/null
+++ b/components/camel-spring-parent/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/ProducerSoapHeaderFilterTest.java
@@ -0,0 +1,98 @@
+/*
+ * 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.spring.ws;
+
+import org.apache.camel.EndpointInject;
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.spring.junit5.CamelSpringTestSupport;
+import org.junit.jupiter.api.Test;
+import org.springframework.context.support.AbstractXmlApplicationContext;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+import org.springframework.ws.soap.SoapHeaderElement;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertInstanceOf;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+
+class ProducerSoapHeaderFilterTest extends CamelSpringTestSupport {
+
+ private final String xmlRequest = "<GetQuote xmlns=\"http://www.stockquotes.edu/\"><symbol>GOOG</symbol></GetQuote>";
+
+ @EndpointInject("mock:result")
+ private MockEndpoint result;
+
+ @EndpointInject("mock:resultCustomStrategy")
+ private MockEndpoint resultCustomStrategy;
+
+ @Test
+ void internalCamelAttributeFromResponseSoapHeaderIsFiltered() throws Exception {
+ result.expectedMessageCount(1);
+
+ template.requestBody("direct:responseHeaderOverride", xmlRequest);
+
+ result.assertIsSatisfied();
+ Message message = result.getExchanges().get(0).getMessage();
+ // the raw SOAP header and a regular application-level attribute are still mapped
+ assertNotNull(message.getHeader(SpringWebserviceConstants.SPRING_WS_SOAP_HEADER),
+ "The SOAP response header should be propagated");
+ assertEquals("1234567890", message.getHeader("MessageId"),
+ "Application-level SOAP response header attribute should be propagated");
+ // attribute names in the internal Camel header namespace are filtered out, whatever their case
+ assertNull(message.getHeader(Exchange.HTTP_URI),
+ "Internal Camel* header coming from a SOAP response header attribute must be filtered");
+ assertNull(message.getHeader(Exchange.HTTP_QUERY),
+ "Internal Camel* header coming from a SOAP response header attribute must be filtered case-insensitively");
+ }
+
+ @Test
+ void internalCamelElementFromResponseSoapHeaderIsFiltered() throws Exception {
+ result.expectedMessageCount(1);
+
+ template.requestBody("direct:responseHeaderOverride", xmlRequest);
+
+ result.assertIsSatisfied();
+ Message message = result.getExchanges().get(0).getMessage();
+ // a regular application-level element is still mapped
+ assertInstanceOf(SoapHeaderElement.class, message.getHeader("TransactionId"),
+ "Application-level SOAP response header element should be propagated");
+ // an element whose local name is in the internal Camel header namespace is filtered out
+ assertNull(message.getHeader(Exchange.FILE_NAME),
+ "Internal Camel* header coming from a SOAP response header element must be filtered");
+ }
+
+ @Test
+ void customHeaderFilterStrategyIsApplied() throws Exception {
+ resultCustomStrategy.expectedMessageCount(1);
+
+ template.requestBody("direct:responseHeaderOverrideCustomStrategy", xmlRequest);
+
+ resultCustomStrategy.assertIsSatisfied();
+ Message message = resultCustomStrategy.getExchanges().get(0).getMessage();
+ // the endpoint's own strategy decides, so a strategy that filters nothing maps every name
+ assertEquals("http://localhost/other", message.getHeader(Exchange.HTTP_URI),
+ "The headerFilterStrategy configured on the endpoint should be applied");
+ }
+
+ @Override
+ protected AbstractXmlApplicationContext createApplicationContext() {
+ return new ClassPathXmlApplicationContext(
+ "org/apache/camel/component/spring/ws/ProducerSoapHeaderFilterTest-context.xml");
+ }
+}
diff --git a/components/camel-spring-parent/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/testfilters/ResponseSoapHeaderMessageFilter.java b/components/camel-spring-parent/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/testfilters/ResponseSoapHeaderMessageFilter.java
new file mode 100644
index 000000000000..d79ddeb4f1ab
--- /dev/null
+++ b/components/camel-spring-parent/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/testfilters/ResponseSoapHeaderMessageFilter.java
@@ -0,0 +1,51 @@
+/*
+ * 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.spring.ws.testfilters;
+
+import javax.xml.namespace.QName;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.component.spring.ws.filter.MessageFilter;
+import org.springframework.ws.WebServiceMessage;
+import org.springframework.ws.soap.SoapHeader;
+import org.springframework.ws.soap.SoapMessage;
+
+/**
+ * Adds SOAP header attributes and elements to the response of a spring-ws consumer, the way an invoked web service may
+ * append to or rewrite the SOAP header of its response.
+ */
+public class ResponseSoapHeaderMessageFilter implements MessageFilter {
+
+ private static final String NAMESPACE = "http://example.com/test";
+
+ @Override
+ public void filterProducer(Exchange exchange, WebServiceMessage produceResponse) {
+ // Do nothing
+ }
+
+ @Override
+ public void filterConsumer(Exchange exchange, WebServiceMessage consumerResponse) {
+ SoapHeader soapHeader = ((SoapMessage) consumerResponse).getSoapHeader();
+ // regular application-level header attribute and element
+ soapHeader.addAttribute(new QName(NAMESPACE, "MessageId"), "1234567890");
+ soapHeader.addHeaderElement(new QName(NAMESPACE, "TransactionId")).setText("42");
+ // header attributes and element whose local names are in the internal Camel header namespace
+ soapHeader.addAttribute(new QName(NAMESPACE, "CamelHttpUri"), "http://localhost/other");
+ soapHeader.addAttribute(new QName(NAMESPACE, "cAmElHttpQuery"), "param=value");
+ soapHeader.addHeaderElement(new QName(NAMESPACE, "CamelFileName")).setText("response.xml");
+ }
+}
diff --git a/components/camel-spring-parent/camel-spring-ws/src/test/resources/org/apache/camel/component/spring/ws/ProducerSoapHeaderFilterTest-context.xml b/components/camel-spring-parent/camel-spring-ws/src/test/resources/org/apache/camel/component/spring/ws/ProducerSoapHeaderFilterTest-context.xml
new file mode 100644
index 000000000000..73ba1beb66a4
--- /dev/null
+++ b/components/camel-spring-parent/camel-spring-ws/src/test/resources/org/apache/camel/component/spring/ws/ProducerSoapHeaderFilterTest-context.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ 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.
+
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="
+ http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+ http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
+
+ <camelContext xmlns="http://camel.apache.org/schema/spring">
+ <!-- producer routes (web service clients) mapping the SOAP response header onto the message -->
+ <route>
+ <from uri="direct:responseHeaderOverride"/>
+ <to uri="spring-ws:http://localhost?webServiceTemplate=#webServiceTemplate&soapAction=http://www.stockquotes.edu/GetQuote&allowResponseHeaderOverride=true"/>
+ <to uri="mock:result"/>
+ </route>
+ <route>
+ <from uri="direct:responseHeaderOverrideCustomStrategy"/>
+ <to uri="spring-ws:http://localhost?webServiceTemplate=#webServiceTemplate&soapAction=http://www.stockquotes.edu/GetQuote&allowResponseHeaderOverride=true&headerFilterStrategy=#passThroughHeaderFilterStrategy"/>
+ <to uri="mock:resultCustomStrategy"/>
+ </route>
+
+ <!-- consumer route (the actual web service) whose response carries SOAP header attributes and elements -->
+ <route>
+ <from uri="spring-ws:soapaction:http://www.stockquotes.edu/GetQuote?endpointMapping=#endpointMapping&messageFilter=#responseSoapHeaderMessageFilter"/>
+ <setBody>
+ <constant><GetQuoteResponse xmlns="http://www.stockquotes.edu/"><GetQuoteResult>100</GetQuoteResult></GetQuoteResponse></constant>
+ </setBody>
+ </route>
+ </camelContext>
+
+ <bean id="messageFactory" class="org.springframework.ws.soap.saaj.SaajSoapMessageFactory"/>
+
+ <bean id="endpointMapping"
+ class="org.apache.camel.component.spring.ws.bean.CamelEndpointMapping"/>
+
+ <bean id="responseSoapHeaderMessageFilter"
+ class="org.apache.camel.component.spring.ws.testfilters.ResponseSoapHeaderMessageFilter"/>
+
+ <!-- a header filter strategy that does not filter any inbound header -->
+ <bean id="passThroughHeaderFilterStrategy" class="org.apache.camel.support.DefaultHeaderFilterStrategy">
+ <property name="inFilterStartsWith">
+ <null/>
+ </property>
+ </bean>
+
+ <bean id="webServiceTemplate" class="org.springframework.ws.client.core.WebServiceTemplate">
+ <property name="defaultUri" value="http://localhost"/>
+ <property name="messageSender">
+ <bean class="net.javacrumbs.springws.test.helper.InMemoryWebServiceMessageSender2"/>
+ </property>
+ </bean>
+
+</beans>
diff --git a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/SpringWebserviceEndpointBuilderFactory.java b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/SpringWebserviceEndpointBuilderFactory.java
index 818cd53b7b0a..ef1afa2cea38 100644
--- a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/SpringWebserviceEndpointBuilderFactory.java
+++ b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/SpringWebserviceEndpointBuilderFactory.java
@@ -549,7 +549,10 @@ public interface SpringWebserviceEndpointBuilderFactory {
* header info from the actual service layer. If the invoked service
* appends or rewrites the soap header this option when set to true,
* allows the modified soap header to be overwritten in in/out message
- * headers.
+ * headers. The names of the soap response header attributes and
+ * elements are filtered using the headerFilterStrategy, which by
+ * default filters out the internal Camel and camel header namespace
+ * (case-insensitive).
*
* The option is a: <code>boolean</code> type.
*
@@ -568,7 +571,10 @@ public interface SpringWebserviceEndpointBuilderFactory {
* header info from the actual service layer. If the invoked service
* appends or rewrites the soap header this option when set to true,
* allows the modified soap header to be overwritten in in/out message
- * headers.
+ * headers. The names of the soap response header attributes and
+ * elements are filtered using the headerFilterStrategy, which by
+ * default filters out the internal Camel and camel header namespace
+ * (case-insensitive).
*
* The option will be converted to a <code>boolean</code> type.
*