I am currently working on porting a C++ soap client from the rather aged MS
Soap Toolkit to Axis2C.
To start with this will run on Windows but part of the exercise is to get
our system ported to Linux.
For the most part the port was fairly straight-forward and I am getting good
results with my unit tests.

However, there is one situation I haven't quite figured out yet - handling
of Soap Faults.

My unit test "SoapExceptionsService" returns the following (taken from
SoapUI output).

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/";
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; xmlns:xsd="
http://www.w3.org/2001/XMLSchema";>
   <soap:Body>
      <soap:Fault>
         <faultcode xmlns:q0="http://www.cc.com/SoapExceptionService
">q0:SoapExceptionService</faultcode>
         <faultstring>System.Web.Services.Protocols.SoapException: This is
the FaultString
   at SoapExceptionService.Service1.HelloWorld(RequestInput
ri)</faultstring>
         <faultactor>http://www.cc.com/SoapExceptionService</faultactor>
         <detail>
            <DetailMessage>This is the Detail section</DetailMessage>
         </detail>
      </soap:Fault>
   </soap:Body>
</soap:Envelope>

Using the MS Soap Toolkit there are methods returning all the separate
pieces of the exception:

FaultActor         = "http://www.cc.com/SoapExceptionService";
FaultCode         = "SoapExceptionService"
FaultCodeNamespace     = "http://www.cc.com/SoapExceptionService";
FaultDetail         = "<detail><DetailMessage>This is the Detail
section</DetailMessage></detail>"
FaultString         = "System.Web.Services.Protocols.SoapException: This is
the FaultString
                   at SoapExceptionService.Service1.HelloWorld(RequestInput
ri)"

However, using Axis2C (I tried both 1.6 and latest 1.7 code from SVN) only
returns a subset of these fields.

Fault Code: (null)
Exception: (null)
Reason: (null)
Role: http://www.cc.com/SoapExceptionService
Detail xml: <detail><DetailMessage>This is the Detail
section</DetailMessage></detail>

If I retrieve the fault base node and serialize it I see the whole fault
message so Axis has all the data available.
I stepped through function axiom_soap_body_convert_fault_to_soap11() and it
appears that the values are found and text elements are created for the
missing items but when I try to retrieve them using the axis functions the
string values end up being NULL.

Example:

                axis2_char_t *strcodevalue = "";
                ::axiom_soap_fault_code *fcode =
::axiom_soap_fault_get_code(fault, env);  // returns ok value
                if (fcode) {
                    ::axiom_soap_fault_value *fcodevalue =
::axiom_soap_fault_code_get_value(fcode, env);  // returns ok value
                    if (fcodevalue) {
                        strcodevalue =
::axiom_soap_fault_value_get_text(fcodevalue, env);  // return NULL
                    }
                }

I suppose I could manually parse the fault xml but I'd kinda prefer to let
the Soap library handle these details.

Am I missing something here or just plain oversimplifying things? Any
pointers would be appreciated.

Many thanks in advance,
Thomas

Reply via email to