#

# XML-RPC SERVER

# $Id: //modules/xmlrpclib/xmlrpcserver.py#5 $

#

# a simple XML-RPC server for Python

#

# History:

# 1999-02-01 fl  created

# 2001-10-01 fl  added to xmlrpclib distribution

# 2002-06-27 fl  improved exception handling (from Peter Åstrand)

#

# written by Fredrik Lundh, January 1999.

#

# Copyright (c) 1999-2002 by Secret Labs AB.

# Copyright (c) 1999-2002 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, traceback

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:
                # print exception to stderr (to aid debugging)

                traceback.print_exc(file=sys.stderr)
                # 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

            traceback.print_exc(file=sys.stderr)
            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()


syntax highlighted by Code2HTML, v. 0.9.1