You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@camel.apache.org by ddewaele <dd...@gmail.com> on 2013/05/02 12:20:23 UTC

CXFEndpoint and SOAPAction HTTP header

I'm using the cxfEndpoint in my camel flow to act as a webservice producer.

I have a number of clients that are able to send SOAP messages to that
endpoint, where Camel does the 
required processing and returns either a valid SOAP response or a SOAP
fault.

        <cxf:cxfEndpoint id="soapMessageEndpoint" 
                                         
address="http://localhost:9080/app/webservices/service1"
                          endpointName="s:SoapOverHttpRouter" 
                          serviceName="s:SOAPService" 
                          xmlns:s="http://apache.org/service_soap_http">
                          
                <cxf:properties>
                        <entry key="dataFormat" value="PAYLOAD"/>
                </cxf:properties>
        
        </cxf:cxfEndpoint>

        <from uri="cxf:bean:soapMessageEndpoint"/>

This endpoint is very dynamic in nature as 

* we are using payload mode
* are not bound to a particular WSDL / service class
* can accept different type of soap request payloads (for different soap
actions).

We discovered an issue with a Soap 1.1 client that is sending a SOAPAction
HTTP header to the endpoint. When the SOAPAction HTTP header is present the
following soap fault is returned:

The given SOAPAction
ServiceCommercialKnowledgeDatabase/v1/ServiceCommercialKnowledgeDatabasePortType_Soap11_HTTP/KnowledgeDatabaseConsultationLogEntryCreation
does not match an operation.

As there is no WSDL associated with the endpoint (the endpoint is running in
payload mode) how can the SOAPAction HTTP header ever be matched ? 

What is the proper way to handle this ?



--
View this message in context: http://camel.465427.n5.nabble.com/CXFEndpoint-and-SOAPAction-HTTP-header-tp5731906.html
Sent from the Camel - Users mailing list archive at Nabble.com.

Re: CXFEndpoint and SOAPAction HTTP header

Posted by ddewaele <dd...@gmail.com>.
Is there an easy way to remove the SOAPAction HTTP header before the message
enters the cxfEndpoint ? I tried applying a HeaderFilterStrategy or a custom
CxfBinding to remove the SOAPAction but I never got to that point.

Is this mechanism below the correct way to expose a generic webservice
endpoint capable of accepting different type of SOAP payloads ?



ddewaele wrote
> I'm using the cxfEndpoint in my camel flow to act as a webservice
> producer.
> 
> I have a number of clients that are able to send SOAP messages to that
> endpoint, where Camel does the 
> required processing and returns either a valid SOAP response or a SOAP
> fault.
> 
>         
> <cxf:cxfEndpoint id="soapMessageEndpoint" 
>                                          
> address="http://localhost:9080/app/webservices/service1"
>                           endpointName="s:SoapOverHttpRouter" 
>                           serviceName="s:SOAPService" 
>                           xmlns:s="http://apache.org/service_soap_http">
>                           
>                 
> <cxf:properties>
>                         
> <entry key="dataFormat" value="PAYLOAD"/>
>                 
> </cxf:properties>
>         
>         
> </cxf:cxfEndpoint>
>         
> <from uri="cxf:bean:soapMessageEndpoint"/>
> This endpoint is very dynamic in nature as 
> 
> * we are using payload mode
> * are not bound to a particular WSDL / service class
> * can accept different type of soap request payloads (for different soap
> actions).
> 
> We discovered an issue with a Soap 1.1 client that is sending a SOAPAction
> HTTP header to the endpoint. When the SOAPAction HTTP header is present
> the following soap fault is returned:
> 
> The given SOAPAction
> ServiceCommercialKnowledgeDatabase/v1/ServiceCommercialKnowledgeDatabasePortType_Soap11_HTTP/KnowledgeDatabaseConsultationLogEntryCreation
> does not match an operation.
> 
> As there is no WSDL associated with the endpoint (the endpoint is running
> in payload mode) how can the SOAPAction HTTP header ever be matched ? 
> 
> What is the proper way to handle this ?





--
View this message in context: http://camel.465427.n5.nabble.com/CXFEndpoint-and-SOAPAction-HTTP-header-tp5731906p5732121.html
Sent from the Camel - Users mailing list archive at Nabble.com.

Re: CXFEndpoint and SOAPAction HTTP header

Posted by ddewaele <dd...@gmail.com>.
I managed to fix this by adding an inInterceptor to the cxf bean.
The interceptor removes the SOAPAction protocol header and is configured to
run before the "official" SoapActionInInterceptor.

public class RemoveSoapActionInInterceptor extends AbstractSoapInterceptor {

    public RemoveSoapActionInInterceptor() {
        super(Phase.READ);
        addBefore(SoapActionInInterceptor.class.getName());
    }

    @Override
	public void handleMessage(SoapMessage message) throws Fault {
        if (message.getVersion() instanceof Soap11) {
            Map<String, List&lt;String>> headers =
CastUtils.cast((Map)message.get(Message.PROTOCOL_HEADERS));
            headers.remove("SOAPAction");
        }
    }

}

For some strange reason I wasn't able to create a new SpringBus bean under a
different name. I had to use the existing "cxf" beanId for it to work.

<from uri="cxf://dynamicService?dataFormat=PAYLOAD&amp;bus=#cxf"/>


ddewaele wrote
> I'm using the cxfEndpoint in my camel flow to act as a webservice
> producer.
> 
> I have a number of clients that are able to send SOAP messages to that
> endpoint, where Camel does the 
> required processing and returns either a valid SOAP response or a SOAP
> fault.
> 
>         
> <cxf:cxfEndpoint id="soapMessageEndpoint" 
>                                          
> address="http://localhost:9080/app/webservices/service1"
>                           endpointName="s:SoapOverHttpRouter" 
>                           serviceName="s:SOAPService" 
>                           xmlns:s="http://apache.org/service_soap_http">
>                           
>                 
> <cxf:properties>
>                         
> <entry key="dataFormat" value="PAYLOAD"/>
>                 
> </cxf:properties>
>         
>         
> </cxf:cxfEndpoint>
>         
> <from uri="cxf:bean:soapMessageEndpoint"/>
> This endpoint is very dynamic in nature as 
> 
> * we are using payload mode
> * are not bound to a particular WSDL / service class
> * can accept different type of soap request payloads (for different soap
> actions).
> 
> We discovered an issue with a Soap 1.1 client that is sending a SOAPAction
> HTTP header to the endpoint. When the SOAPAction HTTP header is present
> the following soap fault is returned:
> 
> The given SOAPAction
> ServiceCommercialKnowledgeDatabase/v1/ServiceCommercialKnowledgeDatabasePortType_Soap11_HTTP/KnowledgeDatabaseConsultationLogEntryCreation
> does not match an operation.
> 
> As there is no WSDL associated with the endpoint (the endpoint is running
> in payload mode) how can the SOAPAction HTTP header ever be matched ? 
> 
> What is the proper way to handle this ?


ddewaele wrote
> I'm using the cxfEndpoint in my camel flow to act as a webservice
> producer.
> 
> I have a number of clients that are able to send SOAP messages to that
> endpoint, where Camel does the 
> required processing and returns either a valid SOAP response or a SOAP
> fault.
> 
>         
> <cxf:cxfEndpoint id="soapMessageEndpoint" 
>                                          
> address="http://localhost:9080/app/webservices/service1"
>                           endpointName="s:SoapOverHttpRouter" 
>                           serviceName="s:SOAPService" 
>                           xmlns:s="http://apache.org/service_soap_http">
>                           
>                 
> <cxf:properties>
>                         
> <entry key="dataFormat" value="PAYLOAD"/>
>                 
> </cxf:properties>
>         
>         
> </cxf:cxfEndpoint>
>         
> <from uri="cxf:bean:soapMessageEndpoint"/>
> This endpoint is very dynamic in nature as 
> 
> * we are using payload mode
> * are not bound to a particular WSDL / service class
> * can accept different type of soap request payloads (for different soap
> actions).
> 
> We discovered an issue with a Soap 1.1 client that is sending a SOAPAction
> HTTP header to the endpoint. When the SOAPAction HTTP header is present
> the following soap fault is returned:
> 
> The given SOAPAction
> ServiceCommercialKnowledgeDatabase/v1/ServiceCommercialKnowledgeDatabasePortType_Soap11_HTTP/KnowledgeDatabaseConsultationLogEntryCreation
> does not match an operation.
> 
> As there is no WSDL associated with the endpoint (the endpoint is running
> in payload mode) how can the SOAPAction HTTP header ever be matched ? 
> 
> What is the proper way to handle this ?


ddewaele wrote
> I'm using the cxfEndpoint in my camel flow to act as a webservice
> producer.
> 
> I have a number of clients that are able to send SOAP messages to that
> endpoint, where Camel does the 
> required processing and returns either a valid SOAP response or a SOAP
> fault.
> 
>         
> <cxf:cxfEndpoint id="soapMessageEndpoint" 
>                                          
> address="http://localhost:9080/app/webservices/service1"
>                           endpointName="s:SoapOverHttpRouter" 
>                           serviceName="s:SOAPService" 
>                           xmlns:s="http://apache.org/service_soap_http">
>                           
>                 
> <cxf:properties>
>                         
> <entry key="dataFormat" value="PAYLOAD"/>
>                 
> </cxf:properties>
>         
>         
> </cxf:cxfEndpoint>
>         
> <from uri="cxf:bean:soapMessageEndpoint"/>
> This endpoint is very dynamic in nature as 
> 
> * we are using payload mode
> * are not bound to a particular WSDL / service class
> * can accept different type of soap request payloads (for different soap
> actions).
> 
> We discovered an issue with a Soap 1.1 client that is sending a SOAPAction
> HTTP header to the endpoint. When the SOAPAction HTTP header is present
> the following soap fault is returned:
> 
> The given SOAPAction
> ServiceCommercialKnowledgeDatabase/v1/ServiceCommercialKnowledgeDatabasePortType_Soap11_HTTP/KnowledgeDatabaseConsultationLogEntryCreation
> does not match an operation.
> 
> As there is no WSDL associated with the endpoint (the endpoint is running
> in payload mode) how can the SOAPAction HTTP header ever be matched ? 
> 
> What is the proper way to handle this ?





--
View this message in context: http://camel.465427.n5.nabble.com/CXFEndpoint-and-SOAPAction-HTTP-header-tp5731906p5732124.html
Sent from the Camel - Users mailing list archive at Nabble.com.