def __register_methods(self):
"""Register all Pypacker TG methods.
"""
def xmlrpc_wrap(func, *args, **kwargs):
"""Register all Pypacker TG methods.
"""
try:
return func(*args, **kwargs)
except:
exc_type, exc_value, exc_traceback = sys.exc_info()
traceback_message = traceback.format_exception(exc_type, exc_value, exc_traceback)
raise xmlrpc.Fault(500, traceback_message)
def wrap_method(method):
"""Register all Pypacker TG methods.
"""
return lambda args, kwargs: xmlrpc_wrap(getattr(self.pypacker, method),
*pickle.loads(args.data), **pickle.loads(kwargs.data))
def wrap_attibute(attr):
"""Register all Pypacker TG attributes.
"""
return lambda: getattr(self.pypacker, attr)
# Get full list of pypacker attrs
pypacker_attrs = (fn for fn in dir(self.pypacker) if not fn.startswith("_"))
# Register attributes and methods
for attr in pypacker_attrs:
attr_instance = getattr(self.pypacker, attr)
if isinstance(attr_instance, (str, int, Sequence, Mapping)):
setattr(self, "xmlrpc_{0}".format(attr), wrap_attibute(attr))
self.class_logger.debug("Registered Pypacker TG attribute %s", attr)
elif callable(attr_instance):
setattr(self, "xmlrpc_{0}".format(attr), wrap_method(attr))
self.class_logger.debug("Registered Pypacker TG method %s", attr)
# Need to wrap stop_sniff separately
# because we have to perform additional procedures with sniffed data before sending.
self.xmlrpc_stop_sniff = self.stop_sniff # pylint: disable=attribute-defined-outside-init
评论列表
文章目录