[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [xmlblaster] connect failed, but xmlrpc faultcode = 0



Cyrille Giquello wrote:

Hello,

I've got a problem with error and xmlrpc.
When connect() failed because of some reason, the response is a well formatted fault, but the faultCode==0.
What do you think about this ?
It is not compatible with some xmlrpc library that I'm trying but perhaps it is correct with the xmlrpc specification ??

When our XmlRpc server implementation has problems it throws an XmlBlasterException.
The used XmlRpc framework calls xmlBlasterException.toString() which produces the
<value> you have noted below.
I don't think we can influence the <int>0</int> like this.
From reading the spec it seems to be perfectly legal to send a fault code of 0.
The rule is simple: if there is a <fault> tag then we have a problem.


Here is an excerpt from http://www.xmlrpc.org/spec

----------------------------------------
Can the <fault> struct contain other members than <faultCode> and <faultString>? Is there a global list of faultCodes? (so they can be mapped to distinct exceptions for languages like Python and Java)?


A <fault> struct *may not* contain members other than those specified. This is true for all other structures. We believe the specification is flexible enough so that all reasonable data-transfer needs can be accomodated within the specified structures. If you believe strongly that this is not true, please post a message on the discussion group.

There is no global list of fault codes. It is up to the server implementer, or higher-level standards to specify fault codes.
----------------------------------------



If you desire the faultCode you can add the following lines to our remote method invocation implementations like:


AuthenticateImpl.java:
public String connect(String qos_literal) throws org.apache.xmlrpc.XmlRpcException
try {
... // existing code


  }
  catch (XmlBlasterException e) {
     throw new org.apache.xmlrpc.XmlRpcException(2500, e.getMessage());
  }

We could add some mapping for our ErrorCodes.java to ints like

     internal.*    -> 1000
     resource.*  -> 2000
     communication.*  -> 3000
     user.* -> 9000

regards,
Marcel


cyrille.

here is the dump of the received response :

<?xml version="1.0" encoding="ISO-8859-1"?>
<methodResponse>
<fault>
<value>
<struct>
<member>
<name>faultString</name>
<value>java.lang.Exception: errorCode=user.configuration.maxSession message=#exported Max sessions = 10 exhausted, login denied.</value>
</member>
<member>
<name>faultCode</name>
<value>
<int>0</int>
</value>
</member>
</struct>
</value>
</fault>
</methodResponse>