home *** CD-ROM | disk | FTP | other *** search
- # Source Generated with Decompyle++
- # File: in.pyc (Python 2.6)
-
- import xmlrpclib
- from xmlrpclib import Fault
- import SocketServer
- import BaseHTTPServer
- import sys
- import os
- import traceback
-
- try:
- import fcntl
- except ImportError:
- fcntl = None
-
-
- def resolve_dotted_attribute(obj, attr, allow_dotted_names = True):
- if allow_dotted_names:
- attrs = attr.split('.')
- else:
- attrs = [
- attr]
- for i in attrs:
- if i.startswith('_'):
- raise AttributeError('attempt to access private attribute "%s"' % i)
- i.startswith('_')
- obj = getattr(obj, i)
-
- return obj
-
-
- def list_public_methods(obj):
- return _[1]
-
-
- def remove_duplicates(lst):
- u = { }
- for x in lst:
- u[x] = 1
-
- return u.keys()
-
-
- class SimpleXMLRPCDispatcher:
-
- def __init__(self, allow_none = False, encoding = None):
- self.funcs = { }
- self.instance = None
- self.allow_none = allow_none
- self.encoding = encoding
-
-
- def register_instance(self, instance, allow_dotted_names = False):
- self.instance = instance
- self.allow_dotted_names = allow_dotted_names
-
-
- def register_function(self, function, name = None):
- if name is None:
- name = function.__name__
-
- self.funcs[name] = function
-
-
- def register_introspection_functions(self):
- self.funcs.update({
- 'system.listMethods': self.system_listMethods,
- 'system.methodSignature': self.system_methodSignature,
- 'system.methodHelp': self.system_methodHelp })
-
-
- def register_multicall_functions(self):
- self.funcs.update({
- 'system.multicall': self.system_multicall })
-
-
- def _marshaled_dispatch(self, data, dispatch_method = None):
-
- try:
- (params, method) = xmlrpclib.loads(data)
- if dispatch_method is not None:
- response = dispatch_method(method, params)
- else:
- response = self._dispatch(method, params)
- response = (response,)
- response = xmlrpclib.dumps(response, methodresponse = 1, allow_none = self.allow_none, encoding = self.encoding)
- except Fault:
- fault = None
- response = xmlrpclib.dumps(fault, allow_none = self.allow_none, encoding = self.encoding)
- except:
- (exc_type, exc_value, exc_tb) = sys.exc_info()
- response = xmlrpclib.dumps(xmlrpclib.Fault(1, '%s:%s' % (exc_type, exc_value)), encoding = self.encoding, allow_none = self.allow_none)
-
- return response
-
-
- def system_listMethods(self):
- methods = self.funcs.keys()
- if self.instance is not None:
- if hasattr(self.instance, '_listMethods'):
- methods = remove_duplicates(methods + self.instance._listMethods())
- elif not hasattr(self.instance, '_dispatch'):
- methods = remove_duplicates(methods + list_public_methods(self.instance))
-
-
- methods.sort()
- return methods
-
-
- def system_methodSignature(self, method_name):
- return 'signatures not supported'
-
-
- def system_methodHelp(self, method_name):
- method = None
- if method_name in self.funcs:
- method = self.funcs[method_name]
- elif self.instance is not None:
- if hasattr(self.instance, '_methodHelp'):
- return self.instance._methodHelp(method_name)
- if not hasattr(self.instance, '_dispatch'):
-
- try:
- method = resolve_dotted_attribute(self.instance, method_name, self.allow_dotted_names)
- except AttributeError:
- hasattr(self.instance, '_methodHelp')
- hasattr(self.instance, '_methodHelp')
- except:
- hasattr(self.instance, '_methodHelp')<EXCEPTION MATCH>AttributeError
-
-
- hasattr(self.instance, '_methodHelp')<EXCEPTION MATCH>AttributeError
-
- if method is None:
- return ''
- import pydoc
- return pydoc.getdoc(method)
-
-
- def system_multicall(self, call_list):
- results = []
- for call in call_list:
- method_name = call['methodName']
- params = call['params']
-
- try:
- results.append([
- self._dispatch(method_name, params)])
- continue
- except Fault:
- fault = None
- results.append({
- 'faultCode': fault.faultCode,
- 'faultString': fault.faultString })
- continue
- (exc_type, exc_value, exc_tb) = sys.exc_info()
- results.append({
- 'faultCode': 1,
- 'faultString': '%s:%s' % (exc_type, exc_value) })
- continue
-
-
-
- return results
-
-
- def _dispatch(self, method, params):
- func = None
-
- try:
- func = self.funcs[method]
- except KeyError:
- if self.instance is not None:
- if hasattr(self.instance, '_dispatch'):
- return self.instance._dispatch(method, params)
-
- try:
- func = resolve_dotted_attribute(self.instance, method, self.allow_dotted_names)
- except AttributeError:
- hasattr(self.instance, '_dispatch')
- hasattr(self.instance, '_dispatch')
- except:
- hasattr(self.instance, '_dispatch')<EXCEPTION MATCH>AttributeError
-
-
- hasattr(self.instance, '_dispatch')<EXCEPTION MATCH>AttributeError
- except:
- hasattr(self.instance, '_dispatch')
-
- if func is not None:
- return func(*params)
- raise Exception('method "%s" is not supported' % method)
-
-
-
- class SimpleXMLRPCRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
- rpc_paths = ('/', '/RPC2')
-
- def is_rpc_path_valid(self):
- if self.rpc_paths:
- return self.path in self.rpc_paths
- return True
-
-
- def do_POST(self):
- if not self.is_rpc_path_valid():
- self.report_404()
- return None
-
- try:
- max_chunk_size = 10485760
- size_remaining = int(self.headers['content-length'])
- L = []
- while size_remaining:
- chunk_size = min(size_remaining, max_chunk_size)
- L.append(self.rfile.read(chunk_size))
- size_remaining -= len(L[-1])
- continue
- self.is_rpc_path_valid()
- data = ''.join(L)
- response = self.server._marshaled_dispatch(data, getattr(self, '_dispatch', None))
- except Exception:
- self.is_rpc_path_valid()
- e = self.is_rpc_path_valid()
- self.send_response(500)
- if hasattr(self.server, '_send_traceback_header') and self.server._send_traceback_header:
- self.send_header('X-exception', str(e))
- self.send_header('X-traceback', traceback.format_exc())
-
- self.end_headers()
- except:
- self.is_rpc_path_valid()
-
- self.send_response(200)
- self.send_header('Content-type', 'text/xml')
- self.send_header('Content-length', str(len(response)))
- self.end_headers()
- self.wfile.write(response)
- self.wfile.flush()
- self.connection.shutdown(1)
-
-
- def report_404(self):
- self.send_response(404)
- response = 'No such page'
- self.send_header('Content-type', 'text/plain')
- self.send_header('Content-length', str(len(response)))
- self.end_headers()
- self.wfile.write(response)
- self.wfile.flush()
- self.connection.shutdown(1)
-
-
- def log_request(self, code = '-', size = '-'):
- if self.server.logRequests:
- BaseHTTPServer.BaseHTTPRequestHandler.log_request(self, code, size)
-
-
-
-
- class SimpleXMLRPCServer(SocketServer.TCPServer, SimpleXMLRPCDispatcher):
- allow_reuse_address = True
- _send_traceback_header = False
-
- def __init__(self, addr, requestHandler = SimpleXMLRPCRequestHandler, logRequests = True, allow_none = False, encoding = None, bind_and_activate = True):
- self.logRequests = logRequests
- SimpleXMLRPCDispatcher.__init__(self, allow_none, encoding)
- SocketServer.TCPServer.__init__(self, addr, requestHandler, bind_and_activate)
- if fcntl is not None and hasattr(fcntl, 'FD_CLOEXEC'):
- flags = fcntl.fcntl(self.fileno(), fcntl.F_GETFD)
- flags |= fcntl.FD_CLOEXEC
- fcntl.fcntl(self.fileno(), fcntl.F_SETFD, flags)
-
-
-
-
- class CGIXMLRPCRequestHandler(SimpleXMLRPCDispatcher):
-
- def __init__(self, allow_none = False, encoding = None):
- SimpleXMLRPCDispatcher.__init__(self, allow_none, encoding)
-
-
- def handle_xmlrpc(self, request_text):
- response = self._marshaled_dispatch(request_text)
- print 'Content-Type: text/xml'
- print 'Content-Length: %d' % len(response)
- print
- sys.stdout.write(response)
-
-
- def handle_get(self):
- code = 400
- (message, explain) = BaseHTTPServer.BaseHTTPRequestHandler.responses[code]
- response = BaseHTTPServer.DEFAULT_ERROR_MESSAGE % {
- 'code': code,
- 'message': message,
- 'explain': explain }
- print 'Status: %d %s' % (code, message)
- print 'Content-Type: text/html'
- print 'Content-Length: %d' % len(response)
- print
- sys.stdout.write(response)
-
-
- def handle_request(self, request_text = None):
- if request_text is None and os.environ.get('REQUEST_METHOD', None) == 'GET':
- self.handle_get()
- else:
-
- try:
- length = int(os.environ.get('CONTENT_LENGTH', None))
- except (TypeError, ValueError):
- length = -1
-
- if request_text is None:
- request_text = sys.stdin.read(length)
-
- self.handle_xmlrpc(request_text)
-
-
- if __name__ == '__main__':
- print 'Running XML-RPC server on port 8000'
- server = SimpleXMLRPCServer(('localhost', 8000))
- server.register_function(pow)
- server.register_function((lambda x, y: x + y), 'add')
- server.serve_forever()
-
-