00001
00002
00003
00004
00005
00006 import sys
00007 from ZSI import ServiceContainer, Fault
00008 from ZSI.ServiceContainer import AsServer, ServiceSOAPBinding
00009 from EchoServer_server import EchoServer
00010
00011 from ZSI.fault import Fault, ZSIFaultDetail
00012 def WSDLFaultFromException(ex, inheader, tb=None, actor=None):
00013 '''Return a Fault object created from a Python exception.
00014
00015 <SOAP-ENV:Fault>
00016 <faultcode>SOAP-ENV:Server</faultcode>
00017 <faultstring>Processing Failure</faultstring>
00018 <detail>
00019 <ZSI:FaultDetail>
00020 <ZSI:string></ZSI:string>
00021 <ZSI:trace></ZSI:trace>
00022 </ZSI:FaultDetail>
00023 </detail>
00024 </SOAP-ENV:Fault>
00025 '''
00026 tracetext = None
00027 if tb:
00028 try:
00029 lines = '\n'.join(['%s:%d:%s' % (name, line, func)
00030 for name, line, func, text in traceback.extract_tb(tb)])
00031 except:
00032 pass
00033 else:
00034 tracetext = lines
00035
00036 exceptionName = ""
00037 try:
00038 exceptionName = ":".join([ex.__module__, ex.__class__.__name__])
00039 except: pass
00040
00041 if isinstance(ex, Fault):
00042 return ex
00043
00044 elt = ZSIFaultDetail(string=exceptionName + "\n" + str(ex), trace=tracetext)
00045 if inheader:
00046 detail, headerdetail = None, elt
00047 else:
00048 detail, headerdetail = elt, None
00049 return Fault(Fault.Server, 'Processing Failure',
00050 actor, detail, headerdetail)
00051
00052 ServiceContainer.FaultFromException = WSDLFaultFromException
00053
00054 class Service(EchoServer):
00055 def soap_Echo(self, ps, **kw):
00056 request,response = EchoServer.soap_Echo(self, ps, **kw)
00057 response.EchoResult = request.EchoIn
00058
00059
00060
00061 return request,response
00062
00063
00064 def twisted_main(port):
00065 from twisted.internet import reactor
00066 from twisted.application import service, internet
00067 from twisted.web.resource import Resource
00068 from twisted.web.server import Site
00069
00070 root = Resource()
00071 root.putChild('test', Service())
00072 reactor.listenTCP(port, Site(root))
00073
00074 def main():
00075 port = int(sys.argv[1])
00076 if issubclass(EchoServer, ServiceSOAPBinding):
00077 AsServer(port, (Service('test'),))
00078 return
00079
00080
00081
00082 from twisted.internet import reactor
00083 reactor.callWhenRunning(twisted_main, port)
00084 reactor.run()
00085
00086
00087 if __name__ == "__main__" :
00088 main()