From: Joshua B. <jrb...@lb...> - 2007-07-20 18:40:47
|
A "SOAP:Fault" is wrapped in a ZSI.FaultMessage and raised. The exception contains a "fault" attribute that contains the "ZSI.Fault" which contains all the fault information. >>> from test import main >>> try: rsp = main() ... except Exception, ex: ... pass ... _____________ <?xml version="1.0" encoding="utf-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http:// www.w3.org/2001/XMLSchema- instance"><soapenv:Body><soapenv:Fault><faultcode>soapenv:Client.badRequ est</faultcode><faultstring>Malformed request</faultstring><detail/></ soapenv:Fault></soapenv:Body></soapenv:Envelope> >>> >>> >>> ex <ZSI.FaultException o12ea918> >>> ex.fault.__dict__ {'headerdetail': None, 'code': (u'http://schemas.xmlsoap.org/soap/ envelope/', u'Client.badRequest'), 'string': 'Malformed request', 'actor': None, 'detail': []} >>> So you can certainly check them, and logically make decisions based on the soap faults returned. I think you want are the contents of "ex.fault.detail" (here it is None) parsed into a pyobj, just like you would another response. Here is the FaultType typecode: FaultType.typecode = \ Struct(FaultType, [QName(pname='faultcode'), String(pname='faultstring'), URI(pname=(SOAP.ENV,'faultactor'), minOccurs=0), Detail.typecode, AnyElement(aname='any',minOccurs=0, maxOccurs=UNBOUNDED, processContents="lax"), ], pname=(SOAP.ENV,'Fault'), inline=True, hasextras=0, ) So this should be done automatically for you, because there is an "AnyElement" it will look for the correct typecode in the generated code and package it up for you. The only thing this will not do is check to see if the content of "detail" matches what the WSDL specified. -josh On Jul 20, 2007, at 6:32 AM, Chris Hobbs wrote: > Last week I submitted a question, entitled "ZSI: Returning a SOAP > Fault" > that itself referred to a posting by Allan Lyons on 22nd February > 2007. > > Neither Allan nor myself appears to have received an answer so I have > been exploring the ZSI code myself. > > I have found some strange generated code (for example, > > response = self.binding.Receive(ExchangeMessagesResponse.typecode) > > generated within the operation code in <service>_services.py > without the "faults" keyword. > > It would, however, be very helpful in my exploration of the ZSI > code to > know an answer to the following question: > > Is ZSI known to handle SOAP faults generated by the application > correctly? > > By "generated by the application" I mean fault and fault1 as > defined in > this snippet of WSDL rather than generated by a Python exception at > the > server: > > <wsdl:operation name="ExchangeMessages"> > <wsdl:input message="tns:ExchangeMessagesRequest"/> > <wsdl:output message="tns:ExchangeMessagesResponse"/> > <wsdl:fault name="fault" > message="tns:ExchangeMessages_faultMsg"></wsdl:fault> > <wsdl:fault name="fault1" > message="tns:ExchangeMessages_fault1Msg"></wsdl:fault> > </wsdl:operation> > > If the answer to the question is "yes but it's not well described > in the > documentation" then I'm looking for something missing in my code > and the > way I have invoked ZSI. > > If the answer to the question is "no, we haven't got around to > supporting that yet" then I'm looking to enhance the ZSI code. > > Could anyone supply me with a simple answer to my simple question > because it will help my exploration? > > Cheers, > > Chris Hobbs > > ---------------------------------------------------------------------- > --- > This SF.net email is sponsored by: Microsoft > Defy all challenges. Microsoft(R) Visual Studio 2005. > http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ > _______________________________________________ > Pywebsvcs-talk mailing list > Pyw...@li... > https://lists.sourceforge.net/lists/listinfo/pywebsvcs-talk > Also archived at http://groups.google.com/group/pywebsvcs |