0

I have an issue with SOAPAction that contains accents.

From a third-party WSDL, I have generated Java Classes using CXF wsdl2java plugin. Using the generated classes, I have developed a CXF-based client and server. The problem is that the server fail to get the client's request with the following error :

2014-06-19 11:45:08,423 [qtp1051344475-17] WARN - Interceptor for {http://simulator.be.connectors.cam/}RIBSOAPSoapImplService#{http://tempuri.org/}Opération_1 has thrown exception, unwinding now
org.apache.cxf.interceptor.Fault: The given SOAPAction http://tempuri.org/RIB_SOAP/Opération_1 does not match an operation.
    at org.apache.cxf.binding.soap.interceptor.SoapActionInInterceptor$SoapActionInAttemptTwoInterceptor.handleMessage(SoapActionInInterceptor.java:188)
    at org.apache.cxf.binding.soap.interceptor.SoapActionInInterceptor$SoapActionInAttemptTwoInterceptor.handleMessage(SoapActionInInterceptor.java:163)
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272)
    at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)
    at ...

The log of the request at the client side shows the correct value of the SOAPAction while the request at the server side shows the wrong value.

The request at the client side is :

2014-06-19 11:45:08,349 [main] INFO - Outbound Message
---------------------------
ID: 1
Address: http://localhost:17081/SIMULATOR/RIB/WS
Encoding: UTF-8
Http-Method: POST
Content-Type: text/xml
Headers: {Accept=[*/*], Connection=[Keep-Alive], SOAPAction=["http://tempuri.org/RIB_SOAP/Opération_1"]}
Payload: <?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <ns3:Opération_1 xmlns:ns2="http://Rib_InSchema" xmlns:ns3="http://tempuri.org/" xmlns:ns4="http://Rib_OutSchema">
      <ns2:Root>
        <RIB>1234567890</RIB>
      </ns2:Root>
    </ns3:Opération_1>
  </soap:Body>
</soap:Envelope>

--------------------------------------

The request at the server side is :

2014-06-19 11:45:08,408 [qtp1051344475-17] INFO - Inbound Message
----------------------------
ID: 2
Address: http://localhost:17081/SIMULATOR/RIB/WS
Encoding: UTF-8
Http-Method: POST
Content-Type: text/xml; charset=UTF-8
Headers: {Accept=[*/*], Cache-Control=[no-cache], connection=[keep-alive], Content-Length=[339], content-type=[text/xml; charset=UTF-8], Host=[localhost:17081], Pragma=[no-cache], SOAPAction=["http://tempuri.org/RIB_SOAP/Opération_1"], User-Agent=[Apache CXF 2.7.10]}
Payload: <?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <ns3:Opération_1 xmlns:ns2="http://Rib_InSchema" xmlns:ns3="http://tempuri.org/" xmlns:ns4="http://Rib_OutSchema">
      <ns2:Root>
        <RIB>1234567890</RIB>
      </ns2:Root>
    </ns3:Opération_1>
  </soap:Body>
</soap:Envelope>

--------------------------------------

As you can see from the logs, the UTF-8 is the used encoding at all levels. However, for some reason, at the server side, the SOAPAction has been decoded using ISO-8859-1.

The used WSDL is :

<?xml version="1.0" encoding="utf-8"?>
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
    xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://tempuri.org/"
    xmlns:s1="http://Rib_InSchema" xmlns:s="http://www.w3.org/2001/XMLSchema"
    xmlns:s2="http://Rib_OutSchema"
    xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
    targetNamespace="http://tempuri.org/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
    <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">BizTalk assembly
        "BTS, Version=1.0.0.0, Culture=neutral,
        PublicKeyToken=dab3109d17486051" published web service.
    </wsdl:documentation>
    <wsdl:types>
        <s:schema elementFormDefault="qualified" targetNamespace="http://tempuri.org/">
            <s:import namespace="http://Rib_InSchema" />
            <s:import namespace="http://Rib_OutSchema" />
            <s:element name="Opération_1">
                <s:complexType>
                    <s:sequence>
                        <s:element minOccurs="0" maxOccurs="1" ref="s1:Root" />
                    </s:sequence>
                </s:complexType>
            </s:element>
            <s:element name="Opération_1Response">
                <s:complexType>
                    <s:sequence>
                        <s:element minOccurs="0" maxOccurs="1" ref="s2:Root" />
                    </s:sequence>
                </s:complexType>
            </s:element>
        </s:schema>
        <s:schema elementFormDefault="qualified"
            targetNamespace="http://Rib_InSchema">
            <s:element name="Root">
                <s:complexType>
                    <s:sequence>
                        <s:element minOccurs="0" maxOccurs="1" form="unqualified"
                            name="RIB" type="s:string" />
                    </s:sequence>
                </s:complexType>
            </s:element>
        </s:schema>
        <s:schema elementFormDefault="qualified"
            targetNamespace="http://Rib_OutSchema">
            <s:element name="Root">
                <s:complexType>
                    <s:sequence>
                        <s:element minOccurs="0" maxOccurs="1" form="unqualified"
                            name="NumCompte" type="s:string" />
                        <s:element minOccurs="0" maxOccurs="1" form="unqualified"
                            name="Nom" type="s:string" />
                        <s:element minOccurs="0" maxOccurs="1" form="unqualified"
                            name="Prenom" type="s:string" />
                        <s:element minOccurs="0" maxOccurs="1" form="unqualified"
                            name="Agence" type="s:string" />
                        <s:element minOccurs="0" maxOccurs="1" form="unqualified"
                            name="AgenceAdresse" type="s:string" />
                        <s:element minOccurs="0" maxOccurs="1" form="unqualified"
                            name="RIB" type="s:string" />
                    </s:sequence>
                </s:complexType>
            </s:element>
        </s:schema>
    </wsdl:types>
    <wsdl:message name="Opération_1SoapIn">
        <wsdl:part name="parameters" element="tns:Opération_1" />
    </wsdl:message>
    <wsdl:message name="Opération_1SoapOut">
        <wsdl:part name="parameters" element="tns:Opération_1Response" />
    </wsdl:message>
    <wsdl:portType name="RIB_SOAPSoap">
        <wsdl:operation name="Opération_1">
            <wsdl:input message="tns:Opération_1SoapIn" />
            <wsdl:output message="tns:Opération_1SoapOut" />
        </wsdl:operation>
    </wsdl:portType>
    <wsdl:binding name="RIB_SOAPSoap"
        type="tns:RIB_SOAPSoap">
        <soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
        <wsdl:operation name="Opération_1">
            <soap:operation
                soapAction="http://tempuri.org/RIB_SOAP/Opération_1"
                style="document" />
            <wsdl:input>
                <soap:body use="literal" />
            </wsdl:input>
            <wsdl:output>
                <soap:body use="literal" />
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>
    <wsdl:binding name="RIB_SOAPSoap12"
        type="tns:RIB_SOAPSoap">
        <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" />
        <wsdl:operation name="Opération_1">
            <soap12:operation
                soapAction="http://tempuri.org/RIB_SOAP/Opération_1"
                style="document" />
            <wsdl:input>
                <soap12:body use="literal" />
            </wsdl:input>
            <wsdl:output>
                <soap12:body use="literal" />
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>
    <wsdl:service name="RIB_SOAP">
        <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">BizTalk assembly
            "BTS, Version=1.0.0.0, Culture=neutral,
            PublicKeyToken=dab3109d17486051" published web service.
        </wsdl:documentation>
        <wsdl:port name="RIB_SOAPSoap"
            binding="tns:RIB_SOAPSoap">
            <soap:address
                location="http://localhost/BTS_Proxy/RIB_SOAP.asmx" />
        </wsdl:port>
        <wsdl:port name="RIB_SOAPSoap12"
            binding="tns:RIB_SOAPSoap12">
            <soap12:address
                location="http://localhost/BTS_Proxy/RIB_SOAP.asmx" />
        </wsdl:port>
    </wsdl:service>
</wsdl:definitions>

Spring conf for the client:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:jaxws="http://cxf.apache.org/jaxws"
    xmlns:http-conf="http://cxf.apache.org/transports/http/configuration"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd
        http://cxf.apache.org/jaxws
            http://cxf.apache.org/schemas/jaxws.xsd
        http://cxf.apache.org/transports/http/configuration
            http://cxf.apache.org/schemas/configuration/http-conf.xsd
    "
>
    <!--.~~~~~~~~..~~~~~~~~..~~~~~~~~..~~~~~~~~..~~~~~~~~..~~~~~~~~..~~~~~~~~-->
    <!--.~~~~~~~~..~~~~~~~~..~~~~~~~~..~~~~~~~~..~~~~~~~~..~~~~~~~~..~~~~~~~~-->
    <http-conf:conduit name=".*">
        <http-conf:client ConnectionTimeout="30000" ReceiveTimeout="30000" />
    </http-conf:conduit>

    <jaxws:client 
        id="ribWebServiceClient"
        serviceClass="org.tempuri.RIBSOAPSoap"
        address="${ws.rib.url}"
    >
        <jaxws:features>
            <bean class="org.apache.cxf.feature.LoggingFeature" >
                <property name="prettyLogging" value="true" />
            </bean>
        </jaxws:features>
        <jaxws:properties>
            <entry key="exceptionMessageCauseEnabled" value="true" />
            <entry key="faultStackTraceEnabled" value="true" />
        </jaxws:properties>
    </jaxws:client>
    <!--.~~~~~~~~..~~~~~~~~..~~~~~~~~..~~~~~~~~..~~~~~~~~..~~~~~~~~..~~~~~~~~-->
</beans>

Spring conf for the server:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:jaxws="http://cxf.apache.org/jaxws"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd
        http://cxf.apache.org/jaxws
            http://cxf.apache.org/schemas/jaxws.xsd
    "
>
    <!--.~~~~~~~~..~~~~~~~~..~~~~~~~~..~~~~~~~~..~~~~~~~~..~~~~~~~~..~~~~~~~~-->
    <!--.~~~~~~~~..~~~~~~~~..~~~~~~~~..~~~~~~~~..~~~~~~~~..~~~~~~~~..~~~~~~~~-->
    <import resource="classpath:META-INF/cxf/cxf.xml" />
    <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />

    <!--.~~~~~~~~..~~~~~~~~..~~~~~~~~-->
    <jaxws:endpoint
        id="ribWebServiceEndPoint"
        implementor="#ribWebService"
        address="${ws.rib.url}"
    >
        <jaxws:features>
            <bean class="org.apache.cxf.feature.LoggingFeature" >
                <property name="prettyLogging" value="true" />
            </bean>
        </jaxws:features>
        <jaxws:properties>
            <entry key="exceptionMessageCauseEnabled" value="true" />
            <entry key="faultStackTraceEnabled" value="true" />
        </jaxws:properties>
    </jaxws:endpoint>
    <!--.~~~~~~~~..~~~~~~~~..~~~~~~~~..~~~~~~~~..~~~~~~~~..~~~~~~~~..~~~~~~~~-->
</beans>
Younes
  • 1,635
  • 1
  • 19
  • 33

2 Answers2

2

According to the HTTP spec, all the HTTP headers are supposed to be ISO-8859-1. There is an separate spec for how to encode non-ISO-8859-1 characters into the header (https://www.rfc-editor.org/rfc/rfc2047) but I'm not sure if the HTTPUrlConnection object in the JDK supports that or not. I'm also not sure if other soap client would support it either.

I would strongly suggest making sure the SOAPAction values would be ISO-8859-1 compatible.

Community
  • 1
  • 1
Daniel Kulp
  • 14,447
  • 4
  • 45
  • 37
  • Thank you @Daniel. I see your point. Do you think this is a bug in CXF as it is encoding the SOAPAction header, at the client side, using UTF-8 while it should use ISO-8859-1 as per HTTP specs? – Younes Jun 19 '14 at 16:05
1

Please refer to this discussion in CXF Users Mainling List. As mentioned by Aki, HTTP Specs requires that HTTP Headers use only US-ASCII characters (see rfc2822). And as mentioned by Daniel and Aki, the spec rfc2047 should be used in case there is a need to use a none US-ASCII character.

The solution for this issue is to avoid using characters that are not US-ASCII characters (include accented characters of course).

Community
  • 1
  • 1
Younes
  • 1,635
  • 1
  • 19
  • 33