Fault handling redirects in SOAPpy
Robert Olson
olson at mcs.anl.gov
Mon Mar 8 14:54:38 CST 2004
Try this on for size. In SOAPpy/CLient.py:
--- Client.py~ 2004-02-17 22:05:59.000000000 -0600
+++ Client.py 2004-03-08 14:45:21.000000000 -0600
@@ -339,11 +339,46 @@
header = hd, methodattrs = ma, encoding = self.encoding,
config = self.config, noroot = self.noroot)
- r, self.namespace = self.transport.call(self.proxy, m, ns, sa,
- encoding = self.encoding,
- http_proxy = self.http_proxy,
- config = self.config)
+ call_retry = 0
+ try:
+
+ r, self.namespace = self.transport.call(self.proxy, m, ns, sa,
+ encoding = self.encoding,
+ http_proxy =
self.http_proxy,
+ config = self.config)
+
+ except Exception, ex:
+ #
+ # Call failed.
+ #
+ # See if we have a fault handling vector installed in our
+ # config. If we do, invoke it. If it returns a true value,
+ # retry the call.
+ #
+ # In any circumstance other than the fault handler returning
+ # true, reraise the exception. This keeps the semantics of this
+ # code the same as without the fault_handler code.
+ #
+
+ if hasattr(self.config, "fault_handler"):
+ if callable(self.config.fault_handler):
+ call_retry = self.config.fault_handler(self.proxy, ex)
+ if not call_retry:
+ raise
+ else:
+ raise
+ else:
+ raise
+
+ if call_retry:
+ r, self.namespace = self.transport.call(self.proxy, m, ns, sa,
+ encoding = self.encoding,
+ http_proxy =
self.http_proxy,
+ config = self.config)
+
+
+ print r
p, attrs = parseSOAPRPC(r, attrs = 1)
try:
With this mod to hosting/SOAPpy/Client.py:
diff -u -r1.6 Client.py
--- Client.py 2 Mar 2004 19:12:47 -0000 1.6
+++ Client.py 8 Mar 2004 20:51:20 -0000
@@ -29,7 +29,7 @@
A class that encapsulates a SOAP proxy.
"""
def __init__(self, url, namespace = None, authCallback = None, debug = 0,
- config = None):
+ config = None, faultHandler = None):
"""
@param url: the url to the service
@param namespace: the namespace for the service
@@ -46,6 +46,7 @@
self.config = config
self.config.debug = debug
+ self.config.fault_handler = faultHandler
self.url = url.replace("https", "httpg")
self.proxy = None
self.namespace = namespace
We can write:
def fh(proxy, ex):
print "Fault handler invoked! proxy=%s exception=%s" % (proxy, ex)
return 0
try:
self.profile.capabilities = Client.Handle( self.nodeServiceUri,
faultHandler = fh).
GetProxy().GetCapabilities()
A non-stub fault handler would do something like query the local cert mgmt
infrastructure, which can interact with the user, to create the right
flavor of proxy if possible, and return 1 to have the soap level retry the
call.
Thoughts?
--bob
More information about the ag-dev
mailing list