X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sfa%2Fserver%2Fxmlrpcapi.py;h=f3d4e680a68d9e97768c0aac7f8b85801d5be401;hb=df86e084563ff7d7483ccde93b87e21aa71729cc;hp=b4fa748f78cc8949e59026adce86450f30560a25;hpb=8e558be62ca1e048cedb76d6036d1acbfa827bd4;p=sfa.git diff --git a/sfa/server/xmlrpcapi.py b/sfa/server/xmlrpcapi.py index b4fa748f..f3d4e680 100644 --- a/sfa/server/xmlrpcapi.py +++ b/sfa/server/xmlrpcapi.py @@ -15,7 +15,6 @@ except ImportError: SOAPpy = None #################### -#from sfa.util.faults import SfaNotImplemented, SfaAPIError, SfaInvalidAPIMethod, SfaFault from sfa.util.faults import SfaInvalidAPIMethod, SfaAPIError, SfaFault from sfa.util.sfalogging import logger from sfa.util.py23 import xmlrpc_client @@ -27,12 +26,15 @@ from sfa.util.py23 import xmlrpc_client # avoiding # [#x7F-#x84], [#x86-#x9F], [#xFDD0-#xFDDF] -invalid_xml_ascii = map(chr, range(0x0, 0x8) + [0xB, 0xC] + range(0xE, 0x1F)) -xml_escape_table = string.maketrans( - "".join(invalid_xml_ascii), "?" * len(invalid_xml_ascii)) +invalid_codepoints = range(0x0, 0x8) + [0xB, 0xC] + range(0xE, 0x1F) +# broke with f24, somehow we get a unicode as an incoming string to be translated +str_xml_escape_table = string.maketrans("".join((chr(x) for x in invalid_codepoints)), + "?" * len(invalid_codepoints)) +# loosely inspired from +# http://stackoverflow.com/questions/1324067/how-do-i-get-str-translate-to-work-with-unicode-strings +unicode_xml_escape_table = { invalid : u"?" for invalid in invalid_codepoints} - -def xmlrpclib_escape(s, replace=string.replace): +def xmlrpclib_escape(s, replace = string.replace): """ xmlrpclib does not handle invalid 7-bit control characters. This function augments xmlrpclib.escape, which by default only replaces @@ -45,7 +47,10 @@ def xmlrpclib_escape(s, replace=string.replace): s = replace(s, ">", ">",) # Replace invalid 7-bit control characters with '?' - return s.translate(xml_escape_table) + if isinstance(s, str): + return s.translate(str_xml_escape_table) + else: + return s.translate(unicode_xml_escape_table) def xmlrpclib_dump(self, value, write): @@ -86,7 +91,7 @@ xmlrpc_client.Marshaller._Marshaller__dump = xmlrpclib_dump class XmlrpcApi: """ - The XmlrpcApi class implements a basic xmlrpc (or soap) service + The XmlrpcApi class implements a basic xmlrpc (or soap) service """ protocol = None @@ -101,8 +106,6 @@ class XmlrpcApi: methods, fromlist=[methods]) self.methods = methods_module.all - self.logger = logger - def callable(self, method): """ Return a new instance of the specified method. @@ -119,7 +122,7 @@ class XmlrpcApi: callablemethod = getattr(module, classname)(self) return getattr(module, classname)(self) except (ImportError, AttributeError): - self.logger.log_exc("Error importing method: %s" % method) + logger.log_exc("Error importing method: %s" % method) raise SfaInvalidAPIMethod(method) def call(self, source, method, *args): @@ -161,9 +164,9 @@ class XmlrpcApi: result = self.call(source, method, *args) except SfaFault as fault: result = fault - self.logger.log_exc("XmlrpcApi.handle has caught Exception") + logger.log_exc("XmlrpcApi.handle has caught Exception") except Exception as fault: - self.logger.log_exc("XmlrpcApi.handle has caught Exception") + logger.log_exc("XmlrpcApi.handle has caught Exception") result = SfaAPIError(fault) # Return result