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