Fault handling redirects in SOAPpy

Thomas D. Uram turam at mcs.anl.gov
Mon Mar 8 16:03:40 CST 2004


I like this, too.  It means that we don't have to smatter our code with 
checking for a valid proxy cert, it'll just happen automatically with 
each (failed) soap call.  I think we really need to be able to isolate 
it to authentication-related exceptions, though, since we don't want to 
retry the call in the face of unrelated failures.


Ivan R. Judson wrote:

>Looks cool; but I'm missing the motivation for it? Is something broken
>without this?
>
>--Ivan 
>
>  
>
>>-----Original Message-----
>>From: owner-ag-dev at mcs.anl.gov 
>>[mailto:owner-ag-dev at mcs.anl.gov] On Behalf Of Robert Olson
>>Sent: Monday, March 08, 2004 2:55 PM
>>To: ag-dev at mcs.anl.gov
>>Subject: Fault handling redirects in SOAPpy
>>
>>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
>>
>>
>>    
>>
>
>
>  
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/ag-dev/attachments/20040308/368220fa/attachment.htm>


More information about the ag-dev mailing list