[ 
https://issues.apache.org/jira/browse/CAMEL-3806?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13011210#comment-13011210
 ] 

Torsten Mielke commented on CAMEL-3806:
---------------------------------------

I see two solutions:

1) copy all CXF headers into Camel in message headers:

{code:title=org.apache.camel.component.cxf.DefaultCxfBinding.java}
// pseudo code
protected void propagateHeadersFromCxfToCamel(Message cxfMessage,
            org.apache.camel.Message camelMessage, Exchange exchange) {
        Map<String, List<String>> cxfHeaders = (Map)cxfMessage.getHeaders()
        Map<String, Object> camelHeaders = camelMessage.getHeaders();
        camelHeaders.put(CxfConstants.CAMEL_CXF_MESSAGE, cxfMessage);
...
{code}

This should also copy the SOAPAction header that the SoapActionInInterceptor 
added to the message.

2) Have the SoapActionInInterceptor strip off the surrounding double quote from 
the SOAPAction header (which it does already) and replace the SOAPAction header 
in the already populated org.apache.cxf.message.Message.PROTOCOL_HEADERS with 
the modified (stripped off) value. 
That way org.apache.camel.component.cxf.DefaultCxfBinding.java does not need to 
be changed. 

I personally kinda prefer the second option.


> SOAPAction HTTP header value not copied correctly to from CXF message to 
> Camel message header
> ---------------------------------------------------------------------------------------------
>
>                 Key: CAMEL-3806
>                 URL: https://issues.apache.org/jira/browse/CAMEL-3806
>             Project: Camel
>          Issue Type: Bug
>          Components: camel-cxf
>    Affects Versions: 2.6.0
>         Environment: camel-cxf, CXF consumer endpoint with PAYLOAD data 
> format 
>            Reporter: Torsten Mielke
>              Labels: CXF, HTTP, SOAPAction, header
>         Attachments: testcase.zip
>
>
> When using camel-cxf consumer endpoint with PAYLOAD data format, the 
> SoapActionInInterceptor correctly strips off any double quotes surrounding 
> the SOAPAction header value, e.g:
> {code}
> SOAPAction: "http://apache.org/hello_world_soap_http/greetMe";
> {code}
> and then sets this header on the message again:
> {code:title=SoapActionInInterceptor.java}
> public void handleMessage(SoapMessage message) throws Fault {
>         String action = getSoapAction(message);
>         if (!StringUtils.isEmpty(action)) {
>             getAndSetOperation(message, action);
>         }
>     }
> {code}
> After the execution of getAndSetOperation(message, action), there are two 
> SOAPAction headers set on the message. The original SOAPAction header value 
> (with surrounding quotes) is part of the 
> org.apache.cxf.message.Message.PROTOCOL_HEADERS. In addition the 
> getAndSetOperation() method also adds 
> SOAPAction=http://apache.org/hello_world_soap_http/greetMe header (without 
> surrounding quotes). 
> Later in 
> org.apache.camel.component.cxf.DefaultCxfBinding.propagateHeadersFromCxfToCamel(),
>  when the CXF message headers get copied to the Camel message, it only 
> retrieves the org.apache.cxf.message.Message.PROTOCOL_HEADERS:
> {code}
> Map<String, List<String>> cxfHeaders = 
> (Map)cxfMessage.get(Message.PROTOCOL_HEADERS);
> {code}
> The SOAPAction header in PROTOCOL_HEADERS wasn't changed by the 
> SoapActionInInterceptor and hence still has enclosed double quotes. These 
> headers then get copied to the Camel In message headers. The header that was 
> set by the SoapActionInInterceptor 
> SOAPAction=http://apache.org/hello_world_soap_http/greetMe does not get 
> copied!
> If later in a Camel route a custom Camel Processor tries to resolve this 
> SOAPAction header, it gets the the value with surrounding double quotes, but 
> these should actually have been stripped off. 
> This behavior is a bug.

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to