| # | 
 | # XML-RPC SERVER | 
 | # $Id$ | 
 | # | 
 | # a simple XML-RPC server for Python | 
 | # | 
 | # History: | 
 | # 1999-02-01 fl  added to xmlrpclib distribution | 
 | # | 
 | # written by Fredrik Lundh, January 1999. | 
 | # | 
 | # Copyright (c) 1999 by Secret Labs AB. | 
 | # Copyright (c) 1999 by Fredrik Lundh. | 
 | # | 
 | # fredrik@pythonware.com | 
 | # http://www.pythonware.com | 
 | # | 
 | # -------------------------------------------------------------------- | 
 | # Permission to use, copy, modify, and distribute this software and | 
 | # its associated documentation for any purpose and without fee is | 
 | # hereby granted.  This software is provided as is. | 
 | # -------------------------------------------------------------------- | 
 | # | 
 |  | 
 | import SocketServer, BaseHTTPServer | 
 | import xmlrpclib | 
 | import sys | 
 |  | 
 | class RequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): | 
 |  | 
 |     def do_POST(self): | 
 |         try: | 
 |             # get arguments | 
 |             data = self.rfile.read(int(self.headers["content-length"])) | 
 |             params, method = xmlrpclib.loads(data) | 
 |  | 
 |             # generate response | 
 |             try: | 
 |                 response = self.call(method, params) | 
 |                 # wrap response in a singleton tuple | 
 |                 response = (response,) | 
 |             except: | 
 |                 # report exception back to server | 
 |                 response = xmlrpclib.dumps( | 
 |                     xmlrpclib.Fault(1, "%s:%s" % sys.exc_info()[:2]) | 
 |                     ) | 
 |             else: | 
 |                 response = xmlrpclib.dumps( | 
 |                     response, | 
 |                     methodresponse=1 | 
 |                     ) | 
 |         except: | 
 |             # internal error, report as HTTP server error | 
 |             self.send_response(500) | 
 |             self.end_headers() | 
 |         else: | 
 |             # got a valid XML RPC response | 
 |             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) | 
 |  | 
 |             # shut down the connection (from Skip Montanaro) | 
 |             self.wfile.flush() | 
 |             self.connection.shutdown(1) | 
 |  | 
 |     def call(self, method, params): | 
 |         # override this method to implement RPC methods | 
 |         print "CALL", method, params | 
 |         return params | 
 |  | 
 | if __name__ == '__main__': | 
 |     server = SocketServer.TCPServer(('', 8000), RequestHandler) | 
 |     server.serve_forever() |