cinap_lenrekadd hg and python4bb9e2215 years agoHistory
595 lines · 20.4 KB · Python
RawDownload
         if self.server.logRequests:            BaseHTTPServer.BaseHTTPRequestHandler.log_request(self, code, size) class SimpleXMLRPCServer(SocketServer.TCPServer,                         SimpleXMLRPCDispatcher):    """Simple XML-RPC server.     Simple XML-RPC server that allows functions and a single instance    to be installed to handle requests. The default implementation    attempts to dispatch XML-RPC calls to the functions or instance    installed in the server. Override the _dispatch method inhereted    from SimpleXMLRPCDispatcher to change this behavior.    """     allow_reuse_address = True     def __init__(self, addr, requestHandler=SimpleXMLRPCRequestHandler,                 logRequests=True, allow_none=False, encoding=None):        self.logRequests = logRequests         SimpleXMLRPCDispatcher.__init__(self, allow_none, encoding)        SocketServer.TCPServer.__init__(self, addr, requestHandler)         # [Bug #1222790] If possible, set close-on-exec flag; if a        # method spawns a subprocess, the subprocess shouldn't have        # the listening socket open.        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):    """Simple handler for XML-RPC data passed through CGI."""     def __init__(self, allow_none=False, encoding=None):        SimpleXMLRPCDispatcher.__init__(self, allow_none, encoding)     def handle_xmlrpc(self, request_text):        """Handle a single XML-RPC request"""         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):        """Handle a single HTTP GET request.         Default implementation indicates an error because        XML-RPC uses the POST method.        """         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):        """Handle a single XML-RPC request passed through a CGI post method.         If no XML data is given then it is read from stdin. The resulting        XML-RPC response is printed to stdout along with the correct HTTP        headers.        """         if request_text is None and \            os.environ.get('REQUEST_METHOD', None) == 'GET':            self.handle_get()        else:            # POST data is normally available through stdin            if request_text is None:                request_text = sys.stdin.read()             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()

Lines 501–595 of 595. Previous lines