blob: 7af73bec99ab510f347e6e59005a5d3f5a2650b4 [file] [log] [blame]
Fredrik Lundhb9056332001-07-11 17:42:21 +00001#
2# XML-RPC SERVER
3# $Id$
4#
5# a simple XML-RPC server for Python
6#
7# History:
8# 1999-02-01 fl added to xmlrpclib distribution
9#
10# written by Fredrik Lundh, January 1999.
11#
12# Copyright (c) 1999 by Secret Labs AB.
13# Copyright (c) 1999 by Fredrik Lundh.
14#
15# fredrik@pythonware.com
16# http://www.pythonware.com
17#
18# --------------------------------------------------------------------
19# Permission to use, copy, modify, and distribute this software and
20# its associated documentation for any purpose and without fee is
21# hereby granted. This software is provided as is.
22# --------------------------------------------------------------------
23#
24
25import SocketServer, BaseHTTPServer
26import xmlrpclib
27import sys
28
29class RequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
30
31 def do_POST(self):
32 try:
33 # get arguments
34 data = self.rfile.read(int(self.headers["content-length"]))
35 params, method = xmlrpclib.loads(data)
36
37 # generate response
38 try:
39 response = self.call(method, params)
40 # wrap response in a singleton tuple
41 response = (response,)
42 except:
43 # report exception back to server
44 response = xmlrpclib.dumps(
Fred Drake71cc46e2002-04-03 21:47:47 +000045 xmlrpclib.Fault(1, "%s:%s" % sys.exc_info()[:2])
Fredrik Lundhb9056332001-07-11 17:42:21 +000046 )
47 else:
48 response = xmlrpclib.dumps(
49 response,
50 methodresponse=1
51 )
52 except:
53 # internal error, report as HTTP server error
54 self.send_response(500)
55 self.end_headers()
56 else:
57 # got a valid XML RPC response
58 self.send_response(200)
59 self.send_header("Content-type", "text/xml")
60 self.send_header("Content-length", str(len(response)))
61 self.end_headers()
62 self.wfile.write(response)
63
64 # shut down the connection (from Skip Montanaro)
65 self.wfile.flush()
66 self.connection.shutdown(1)
67
68 def call(self, method, params):
69 # override this method to implement RPC methods
70 print "CALL", method, params
71 return params
72
73if __name__ == '__main__':
74 server = SocketServer.TCPServer(('', 8000), RequestHandler)
75 server.serve_forever()