Closed Bug 455721 Opened 17 years ago Closed 16 years ago

xmlrpc faultcode should be integer

Categories

(Testopia :: API, defect)

x86
Linux
defect
Not set
normal

Tracking

(Not tracked)

RESOLVED FIXED

People

(Reporter: nparrish, Assigned: gregaryh)

Details

Attachments

(2 files)

User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.10) Gecko/20071128 Fedora/2.0.0.10-2.fc7 Firefox/2.0.0.10 Build Identifier: Testopia 2.1 in some cases, testopia xmlrpc server is returning a string faultcode instead of an integer, which blows up some xmlrpc client libraries, consequently making error handling nigh impossible. in a network trace I will attach, we see that when TestRun.create is fed an additional parameter 'bogusness', it sets the faultCode to the string 'Server', which causes the xmlrpc library (apache xmlrpc v3) to puke with 'java.lang.ClassCastException: java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer'. however, if I instead feed the arguments meant for TestCaseRun.create to TestRun.create, the faultCode is properly set to integer -32000, and the xmlrpc library happily raises an XmlRpcException with the faultString. Reproducible: Always Steps to Reproduce: - using sun java 1.6.0 - xmlrpc v3 library - actually calling methods with jython 2.2 >>> import org.apache.commons.httpclient.HttpClient >>> import org.apache.commons.httpclient.HttpState >>> import org.apache.xmlrpc.client.XmlRpcClient >>> import org.apache.xmlrpc.client.XmlRpcCommonsTransport >>> import org.apache.xmlrpc.client.XmlRpcCommonsTransportFactory >>> >>> import java.net.URL >>> import java.util >>> >>> client = org.apache.xmlrpc.client.XmlRpcClient() >>> httpClient = org.apache.commons.httpclient.HttpClient() >>> factory = org.apache.xmlrpc.client.XmlRpcCommonsTransportFactory(client) >>> >>> factory.setHttpClient(httpClient) >>> client.setTransportFactory(factory) >>> client.config.setServerURL(java.net.URL("http://bugstest/tr_xmlrpc.cgi")) >>> >>> login = java.util.Hashtable(); >>> login.put("login","automator@sproutsys.com") >>> login.put("password","automator") >>> params = java.util.Vector() >>> params.add(login) 1 >>> user_id = client.execute("User.login", params) >>> query = java.util.Hashtable(); >>> query.put("run_id", 945); >>> query.put("case_id", 767); >>> query.put("build", 1); >>> query.put("environment", 1); >>> query.put("case_text_version", 1); >>> query.put("environment", 1); 1 >>> params = java.util.Vector() >>> params.add(query) 1 >>> result = client.execute("TestRun.create", params) Traceback (innermost last): File "<console>", line 1, in ? Bugzilla::Testopia::TestPlan::new function. at org.apache.xmlrpc.client.XmlRpcStreamTransport.readResponse(XmlRpcStreamTransport.java:186) at org.apache.xmlrpc.client.XmlRpcStreamTransport.sendRequest(XmlRpcStreamTransport.java:145) at org.apache.xmlrpc.client.XmlRpcHttpTransport.sendRequest(XmlRpcHttpTransport.java:94) at org.apache.xmlrpc.client.XmlRpcClientWorker.execute(XmlRpcClientWorker.java:53) at org.apache.xmlrpc.client.XmlRpcClient.execute(XmlRpcClient.java:166) at org.apache.xmlrpc.client.XmlRpcClient.execute(XmlRpcClient.java:157) at org.apache.xmlrpc.client.XmlRpcClient.execute(XmlRpcClient.java:146) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:623) org.apache.xmlrpc.XmlRpcException: org.apache.xmlrpc.XmlRpcException: Bad argument param sent to Bugzilla::Testopia::TestPlan::new function. >>> Actual Results: >>> import org.apache.commons.httpclient.HttpClient >>> import org.apache.commons.httpclient.HttpState >>> import org.apache.xmlrpc.client.XmlRpcClient >>> import org.apache.xmlrpc.client.XmlRpcCommonsTransport >>> import org.apache.xmlrpc.client.XmlRpcCommonsTransportFactory >>> >>> import java.net.URL >>> import java.util >>> >>> client = org.apache.xmlrpc.client.XmlRpcClient() >>> httpClient = org.apache.commons.httpclient.HttpClient() >>> factory = org.apache.xmlrpc.client.XmlRpcCommonsTransportFactory(client) >>> >>> factory.setHttpClient(httpClient) >>> client.setTransportFactory(factory) >>> client.config.setServerURL(java.net.URL("http://bugstest/tr_xmlrpc.cgi")) >>> >>> login = java.util.Hashtable(); >>> login.put("login","automator@sproutsys.com") >>> login.put("password","automator") >>> params = java.util.Vector() >>> params.add(login) 1 >>> query = java.util.Hashtable(); >>> query.put("run_id", 945); >>> query.put("case_id", 767); >>> query.put("build_id", 1); >>> query.put("environment_id", 1); >>> # query.put("case_text_version_id", 1); >>> params = java.util.Vector() >>> params.add(query) 1 >>> result = client.execute("TestCaseRun.create", params) Traceback (innermost last): File "<console>", line 1, in ? at org.apache.xmlrpc.parser.XmlRpcResponseParser.addResult(XmlRpcResponseParser.java:58) at org.apache.xmlrpc.parser.RecursiveTypeParserImpl.endValueTag(RecursiveTypeParserImpl.java:71) at org.apache.xmlrpc.parser.XmlRpcResponseParser.endElement(XmlRpcResponseParser.java:183) at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(AbstractSAXParser.java:605) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.java:1749) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2900) at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:624) at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:117) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:485) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:811) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:741) at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:111) at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1209) at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:526) at org.apache.xmlrpc.client.XmlRpcStreamTransport.readResponse(XmlRpcStreamTransport.java:175) at org.apache.xmlrpc.client.XmlRpcStreamTransport.sendRequest(XmlRpcStreamTransport.java:145) at org.apache.xmlrpc.client.XmlRpcHttpTransport.sendRequest(XmlRpcHttpTransport.java:94) at org.apache.xmlrpc.client.XmlRpcClientWorker.execute(XmlRpcClientWorker.java:53) at org.apache.xmlrpc.client.XmlRpcClient.execute(XmlRpcClient.java:166) at org.apache.xmlrpc.client.XmlRpcClient.execute(XmlRpcClient.java:157) at org.apache.xmlrpc.client.XmlRpcClient.execute(XmlRpcClient.java:146) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:623) java.lang.ClassCastException: java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer >>> Expected Results: >>> import org.apache.commons.httpclient.HttpClient >>> import org.apache.commons.httpclient.HttpState >>> import org.apache.xmlrpc.client.XmlRpcClient >>> import org.apache.xmlrpc.client.XmlRpcCommonsTransport >>> import org.apache.xmlrpc.client.XmlRpcCommonsTransportFactory >>> >>> import java.net.URL >>> import java.util >>> >>> client = org.apache.xmlrpc.client.XmlRpcClient() >>> httpClient = org.apache.commons.httpclient.HttpClient() >>> factory = org.apache.xmlrpc.client.XmlRpcCommonsTransportFactory(client) >>> >>> factory.setHttpClient(httpClient) >>> client.setTransportFactory(factory) >>> client.config.setServerURL(java.net.URL("http://bugstest/tr_xmlrpc.cgi")) >>> >>> login = java.util.Hashtable(); >>> login.put("login","automator@sproutsys.com") >>> login.put("password","automator") >>> params = java.util.Vector() >>> params.add(login) 1 >>> query = java.util.Hashtable(); >>> query.put("run_id", 945); >>> query.put("case_id", 767); >>> query.put("build_id", 1); >>> query.put("environment_id", 1); >>> query.put("case_text_version", 1); >>> params = java.util.Vector() >>> params.add(query) 1 >>> result = client.execute("TestRun.create", params) Traceback (innermost last): File "<console>", line 1, in ? Bugzilla::Testopia::TestPlan::new function. at org.apache.xmlrpc.client.XmlRpcStreamTransport.readResponse(XmlRpcStreamTransport.java:186) at org.apache.xmlrpc.client.XmlRpcStreamTransport.sendRequest(XmlRpcStreamTransport.java:145) at org.apache.xmlrpc.client.XmlRpcHttpTransport.sendRequest(XmlRpcHttpTransport.java:94) at org.apache.xmlrpc.client.XmlRpcClientWorker.execute(XmlRpcClientWorker.java:53) at org.apache.xmlrpc.client.XmlRpcClient.execute(XmlRpcClient.java:166) at org.apache.xmlrpc.client.XmlRpcClient.execute(XmlRpcClient.java:157) at org.apache.xmlrpc.client.XmlRpcClient.execute(XmlRpcClient.java:146) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:623) org.apache.xmlrpc.XmlRpcException: org.apache.xmlrpc.XmlRpcException: Bad argument param sent to Bugzilla::Testopia::TestPlan::new function. >>>
packet 9 is the invalid string fault code, packet 21 is the proper int fault code.
DBD::Pg::db selectcol_arrayref failed: ERROR: invalid input syntax for integer: "nada" [for Statement "SELECT DISTINCT test_cases.case_id FROM test_cases INNER JOIN test_case_plans AS case_plans ON (test_cases.case_id = case_plans.case_id) INNER JOIN test_plans ON (case_plans.plan_id = test_plans.plan_id) WHERE ((test_plans.plan_id = 'nada') AND (test_cases.isautomated IN ('1')) AND (test_cases.case_status_id IN ('2')))"] at /var/www/virts/bugs/Bugzilla/Testopia/Table.pm line 118 Bugzilla::Testopia::Table::init('Bugzilla::Testopia::Table=HASH(0x7f3133392f08)', 'case', 'tr_xmlrpc.cgi', 'Bugzilla::CGI=HASH(0x7f31331efbe8)', undef, 'SELECT DISTINCT test_cases.case_id FROM test_cases INNER JOI...') called at /var/www/virts/bugs/Bugzilla/Testopia/Table.pm line 88 Bugzilla::Testopia::Table::new('Bugzilla::Testopia::Table', 'case', 'tr_xmlrpc.cgi', 'Bugzilla::CGI=HASH(0x7f31331efbe8)', undef, 'SELECT DISTINCT test_cases.case_id FROM test_cases INNER JOI...') called at /var/www/virts/bugs/Bugzilla/WebService/Testopia/TestCase.pm line 71 Bugzilla::WebService::Testopia::TestCase::list('Bugzilla::WebService::Testopia::TestCase', 'HASH(0x7f31331c9b98)') called at /usr/lib/perl5/vendor_perl/5.10.0/SOAP/Lite.pm line 2559 eval {...} called at /usr/lib/perl5/vendor_perl/5.10.0/SOAP/Lite.pm line 2547 eval {...} called at /usr/lib/perl5/vendor_perl/5.10.0/SOAP/Lite.pm line 2516 SOAP::Server::handle('Bugzilla::WebService::XMLRPC::Transport::HTTP::CGI=HASH(0x7f3...', '&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;methodCall&gt;&lt;methodName...') called at /usr/lib/perl5/vendor_perl/5.10.0/SOAP/Transport/HTTP.pm line 327 SOAP::Transport::HTTP::Server::handle('Bugzilla::WebService::XMLRPC::Transport::HTTP::CGI=HASH(0x7f3...') called at /usr/lib/perl5/vendor_perl/5.10.0/SOAP/Transport/HTTP.pm line 423 SOAP::Transport::HTTP::CGI::handle('Bugzilla::WebService::XMLRPC::Transport::HTTP::CGI=HASH(0x7f3...') called at /var/www/virts/bugs/tr_xmlrpc.cgi line 39 ModPerl::ROOT::Bugzilla::ModPerl::ResponseHandler::var_www_virts_bugs_tr_xmlrpc_2ecgi::handler('Apache2::RequestRec=SCALAR(0x7f312f264b68)') called at /usr/lib64/perl5/vendor_perl/5.10.0/x86_64-linux-thread-multi/ModPerl/RegistryCooker.pm line 204 eval {...} called at /usr/lib64/perl5/vendor_perl/5.10.0/x86_64-linux-thread-multi/ModPerl/RegistryCooker.pm line 204 ModPerl::RegistryCooker::run('Bugzilla::ModPerl::ResponseHandler=HASH(0x7f3132b069b0)') called at /usr/lib64/perl5/vendor_perl/5.10.0/x86_64-linux-thread-multi/ModPerl/RegistryCooker.pm line 170 ModPerl::RegistryCooker::default_handler('Bugzilla::ModPerl::ResponseHandler=HASH(0x7f3132b069b0)') called at /usr/lib64/perl5/vendor_perl/5.10.0/x86_64-linux-thread-multi/ModPerl/Registry.pm line 31 ModPerl::Registry::handler('Bugzilla::ModPerl::ResponseHandler', 'Apache2::RequestRec=SCALAR(0x7f312f264b68)') called at /var/www/virts/bugs/mod_perl.pl line 96 Bugzilla::ModPerl::ResponseHandler::handler('Bugzilla::ModPerl::ResponseHandler', 'Apache2::RequestRec=SCALAR(0x7f312f264b68)') called at -e line 0 eval {...} called at -e line 0 I think the problem is something stupid in SOAP::Lite, around line 2575 # let application errors pass through with 'Server' code die ref $@ ? $@ : $@ =~ /^Can\'t locate object method "$method_name"/ ? "Failed to locate method ($method_name) in class ($class)" : SOAP::Fault->faultcode($SOAP::Constants::FAULT_SERVER)->faultstring($@) elsewhere in Lite.pm: $FAULT_SERVER = 'Server';
hardcoding Lite.pm to return 32000 instead of FAULT_SERVER gets me happy little xmlrpc exceptions instead of java cast exceptions: SOAP::Fault->faultcode(32000)->faultstring($@)
I'm running in to this same issue when using the XML-RPC.NET library from C#. http://www.xml-rpc.net/
The XML-RPC spec at http://www.xmlrpc.com/spec defines only integer fault codes. But the XML-RPC implementation in the used Perl module XMLRPC::Lite which is part of SOAP::lite and uses its fault constants violates this. There is a bug for this filed at https://sourceforge.net/tracker/?func=detail&aid=2126937&group_id=66000&atid=513017 .
This SOAP::Lite bug was fixed in Bugzilla by a workaround in xmlrpc.cgi. See the attached patch file https://bugzilla.mozilla.org/attachment.cgi?id=370629.
This is now fixed for the Bugzilla 3.4 version as they will both use the same Bugzilla code.
Status: UNCONFIRMED → RESOLVED
Closed: 16 years ago
Resolution: --- → FIXED
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Creator:
Created:
Updated:
Size: