Merge branch 'master' of ssh://git.planet-lab.org/git/sfa
[sfa.git] / sfa / server / modpythonapi / BaseClient.py
1 import xmlrpclib
2
3 from ApiExceptionCodes import *
4
5 class ExceptionUnmarshaller(xmlrpclib.Unmarshaller):
6     def close(self):
7         try:
8             return xmlrpclib.Unmarshaller.close(self)
9         except xmlrpclib.Fault, e:
10             # if the server tagged some traceback info onto the end of the
11             # exception text, then print it out on the client.
12
13             if "\nFAULT_TRACEBACK:" in e.faultString:
14                 parts = e.faultString.split("\nFAULT_TRACEBACK:")
15                 e.faultString = parts[0]
16                 if BaseClient.VerboseExceptions:
17                     print "\n|Server Traceback:", "\n|".join(parts[1].split("\n"))
18
19             raise e
20
21 class ExceptionReportingTransport(xmlrpclib.Transport):
22     def make_connection(self, host):
23         import httplib
24         if host.startswith("https:"):
25            return httplib.HTTPS(host)
26         else:
27            return httplib.HTTP(host)
28
29     def getparser(self):
30         unmarshaller = ExceptionUnmarshaller()
31         parser = xmlrpclib.ExpatParser(unmarshaller)
32         return parser, unmarshaller
33
34 class BaseClient():
35     
36     VerboseExceptions = False
37
38     def __init__(self, url):
39         self.url = url
40         self.server = xmlrpclib.ServerProxy(self.url, ExceptionReportingTransport())
41
42     def noop(self, value):
43         return self.server.noop(value)
44
45     @staticmethod
46     def EnableVerboseExceptions(x=True):
47         BaseClient.VerboseExceptions = x
48