annotate Lib/SimpleXMLRPCServer.py @ 39940:dfd809dcf680 2.5

Bug #1446043: correctly raise a LookupError if an encoding name given to encodings.search_function() contains a dot. (backport from rev. 52075)
author Georg Brandl <georg@python.org>
date Sat, 30 Sep 2006 11:22:35 +0000
parents 995ecd231f7c
children 71ac796a018c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
1 """Simple XML-RPC Server.
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
2
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
3 This module can be used to create simple XML-RPC servers
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
4 by creating a server and either installing functions, a
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
5 class instance, or by extending the SimpleXMLRPCServer
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
6 class.
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
7
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
8 It can also be used to handle XML-RPC requests in a CGI
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
9 environment using CGIXMLRPCRequestHandler.
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
10
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
11 A list of possible usage patterns follows:
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
12
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
13 1. Install functions:
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
14
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
15 server = SimpleXMLRPCServer(("localhost", 8000))
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
16 server.register_function(pow)
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
17 server.register_function(lambda x,y: x+y, 'add')
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
18 server.serve_forever()
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
19
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
20 2. Install an instance:
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
21
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
22 class MyFuncs:
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
23 def __init__(self):
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
24 # make all of the string functions available through
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
25 # string.func_name
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
26 import string
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
27 self.string = string
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
28 def _listMethods(self):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
29 # implement this method so that system.listMethods
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
30 # knows to advertise the strings methods
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
31 return list_public_methods(self) + \
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
32 ['string.' + method for method in list_public_methods(self.string)]
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
33 def pow(self, x, y): return pow(x, y)
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
34 def add(self, x, y) : return x + y
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
35
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
36 server = SimpleXMLRPCServer(("localhost", 8000))
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
37 server.register_introspection_functions()
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
38 server.register_instance(MyFuncs())
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
39 server.serve_forever()
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
40
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
41 3. Install an instance with custom dispatch method:
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
42
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
43 class Math:
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
44 def _listMethods(self):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
45 # this method must be present for system.listMethods
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
46 # to work
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
47 return ['add', 'pow']
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
48 def _methodHelp(self, method):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
49 # this method must be present for system.methodHelp
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
50 # to work
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
51 if method == 'add':
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
52 return "add(2,3) => 5"
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
53 elif method == 'pow':
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
54 return "pow(x, y[, z]) => number"
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
55 else:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
56 # By convention, return empty
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
57 # string if no help is available
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
58 return ""
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
59 def _dispatch(self, method, params):
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
60 if method == 'pow':
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
61 return pow(*params)
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
62 elif method == 'add':
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
63 return params[0] + params[1]
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
64 else:
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
65 raise 'bad method'
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
66
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
67 server = SimpleXMLRPCServer(("localhost", 8000))
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
68 server.register_introspection_functions()
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
69 server.register_instance(Math())
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
70 server.serve_forever()
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
71
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
72 4. Subclass SimpleXMLRPCServer:
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
73
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
74 class MathServer(SimpleXMLRPCServer):
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
75 def _dispatch(self, method, params):
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
76 try:
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
77 # We are forcing the 'export_' prefix on methods that are
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
78 # callable through XML-RPC to prevent potential security
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
79 # problems
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
80 func = getattr(self, 'export_' + method)
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
81 except AttributeError:
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
82 raise Exception('method "%s" is not supported' % method)
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
83 else:
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
84 return func(*params)
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
85
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
86 def export_add(self, x, y):
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
87 return x + y
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
88
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
89 server = MathServer(("localhost", 8000))
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
90 server.serve_forever()
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
91
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
92 5. CGI script:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
93
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
94 server = CGIXMLRPCRequestHandler()
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
95 server.register_function(pow)
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
96 server.handle_request()
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
97 """
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
98
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
99 # Written by Brian Quinlan (brian@sweetapp.com).
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
100 # Based on code written by Fredrik Lundh.
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
101
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
102 import xmlrpclib
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
103 from xmlrpclib import Fault
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
104 import SocketServer
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
105 import BaseHTTPServer
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
106 import sys
37631
399a9a72095f Bug #1469163: SimpleXMLRPCServer unconditionally attempted to import fcntl.
Anthony Baxter <anthonybaxter@gmail.com>
parents: 36121
diff changeset
107 import os
399a9a72095f Bug #1469163: SimpleXMLRPCServer unconditionally attempted to import fcntl.
Anthony Baxter <anthonybaxter@gmail.com>
parents: 36121
diff changeset
108 try:
399a9a72095f Bug #1469163: SimpleXMLRPCServer unconditionally attempted to import fcntl.
Anthony Baxter <anthonybaxter@gmail.com>
parents: 36121
diff changeset
109 import fcntl
399a9a72095f Bug #1469163: SimpleXMLRPCServer unconditionally attempted to import fcntl.
Anthony Baxter <anthonybaxter@gmail.com>
parents: 36121
diff changeset
110 except ImportError:
399a9a72095f Bug #1469163: SimpleXMLRPCServer unconditionally attempted to import fcntl.
Anthony Baxter <anthonybaxter@gmail.com>
parents: 36121
diff changeset
111 fcntl = None
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
112
34528
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
113 def resolve_dotted_attribute(obj, attr, allow_dotted_names=True):
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
114 """resolve_dotted_attribute(a, 'b.c.d') => a.b.c.d
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
115
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
116 Resolves a dotted attribute name to an object. Raises
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
117 an AttributeError if any attribute in the chain starts with a '_'.
34528
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
118
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
119 If the optional allow_dotted_names argument is false, dots are not
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
120 supported and this function operates similar to getattr(obj, attr).
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
121 """
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
122
34528
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
123 if allow_dotted_names:
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
124 attrs = attr.split('.')
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
125 else:
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
126 attrs = [attr]
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
127
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
128 for i in attrs:
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
129 if i.startswith('_'):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
130 raise AttributeError(
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
131 'attempt to access private attribute "%s"' % i
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
132 )
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
133 else:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
134 obj = getattr(obj,i)
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
135 return obj
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
136
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
137 def list_public_methods(obj):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
138 """Returns a list of attribute strings, found in the specified
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
139 object, which represent callable attributes"""
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
140
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
141 return [member for member in dir(obj)
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
142 if not member.startswith('_') and
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
143 callable(getattr(obj, member))]
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
144
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
145 def remove_duplicates(lst):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
146 """remove_duplicates([2,2,2,1,3,3]) => [3,1,2]
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
147
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
148 Returns a copy of a list without duplicates. Every list
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
149 item must be hashable and the order of the items in the
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
150 resulting list is not defined.
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
151 """
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
152 u = {}
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
153 for x in lst:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
154 u[x] = 1
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
155
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
156 return u.keys()
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
157
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
158 class SimpleXMLRPCDispatcher:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
159 """Mix-in class that dispatches XML-RPC requests.
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
160
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
161 This class is used to register XML-RPC method handlers
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
162 and then to dispatch them. There should never be any
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
163 reason to instantiate this class directly.
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
164 """
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
165
35982
03ae0b8eb6cb [Patch #1039083] Add 'encoding' parameter to SimpleXMLRPCServer
Andrew M. Kuchling <amk@amk.ca>
parents: 35981
diff changeset
166 def __init__(self, allow_none, encoding):
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
167 self.funcs = {}
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
168 self.instance = None
35980
ad0f0385c6f3 [Patch #893642] Add optional allow_none argument to SimpleXMLRPCServer, CGIXMLRPCRequestHandler
Andrew M. Kuchling <amk@amk.ca>
parents: 35977
diff changeset
169 self.allow_none = allow_none
35982
03ae0b8eb6cb [Patch #1039083] Add 'encoding' parameter to SimpleXMLRPCServer
Andrew M. Kuchling <amk@amk.ca>
parents: 35981
diff changeset
170 self.encoding = encoding
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
171
34528
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
172 def register_instance(self, instance, allow_dotted_names=False):
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
173 """Registers an instance to respond to XML-RPC requests.
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
174
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
175 Only one instance can be installed at a time.
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
176
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
177 If the registered instance has a _dispatch method then that
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
178 method will be called with the name of the XML-RPC method and
35276
4adbd331d335 Fix all wrong instances of "it's".
Georg Brandl <georg@python.org>
parents: 34528
diff changeset
179 its parameters as a tuple
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
180 e.g. instance._dispatch('add',(2,3))
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
181
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
182 If the registered instance does not have a _dispatch method
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
183 then the instance will be searched to find a matching method
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
184 and, if found, will be called. Methods beginning with an '_'
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
185 are considered private and will not be called by
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
186 SimpleXMLRPCServer.
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
187
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
188 If a registered function matches a XML-RPC request, then it
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
189 will be called instead of the registered instance.
34528
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
190
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
191 If the optional allow_dotted_names argument is true and the
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
192 instance does not have a _dispatch method, method names
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
193 containing dots are supported and resolved, as long as none of
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
194 the name segments start with an '_'.
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
195
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
196 *** SECURITY WARNING: ***
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
197
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
198 Enabling the allow_dotted_names options allows intruders
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
199 to access your module's global variables and may allow
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
200 intruders to execute arbitrary code on your machine. Only
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
201 use this option on a secure, closed network.
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
202
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
203 """
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
204
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
205 self.instance = instance
34528
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
206 self.allow_dotted_names = allow_dotted_names
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
207
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
208 def register_function(self, function, name = None):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
209 """Registers a function to respond to XML-RPC requests.
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
210
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
211 The optional name argument can be used to set a Unicode name
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
212 for the function.
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
213 """
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
214
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
215 if name is None:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
216 name = function.__name__
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
217 self.funcs[name] = function
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
218
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
219 def register_introspection_functions(self):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
220 """Registers the XML-RPC introspection methods in the system
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
221 namespace.
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
222
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
223 see http://xmlrpc.usefulinc.com/doc/reserved.html
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
224 """
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
225
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
226 self.funcs.update({'system.listMethods' : self.system_listMethods,
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
227 'system.methodSignature' : self.system_methodSignature,
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
228 'system.methodHelp' : self.system_methodHelp})
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
229
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
230 def register_multicall_functions(self):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
231 """Registers the XML-RPC multicall method in the system
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
232 namespace.
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
233
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
234 see http://www.xmlrpc.com/discuss/msgReader$1208"""
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
235
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
236 self.funcs.update({'system.multicall' : self.system_multicall})
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
237
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
238 def _marshaled_dispatch(self, data, dispatch_method = None):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
239 """Dispatches an XML-RPC method from marshalled (XML) data.
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
240
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
241 XML-RPC methods are dispatched from the marshalled (XML) data
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
242 using the _dispatch method and the result is returned as
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
243 marshalled data. For backwards compatibility, a dispatch
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
244 function can be provided as an argument (see comment in
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
245 SimpleXMLRPCRequestHandler.do_POST) but overriding the
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
246 existing method through subclassing is the prefered means
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
247 of changing method dispatch behavior.
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
248 """
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
249
38534
b1eb4a674998 Correctly dispatch Faults in loads (patch #1498627)
Georg Brandl <georg@python.org>
parents: 38526
diff changeset
250 try:
b1eb4a674998 Correctly dispatch Faults in loads (patch #1498627)
Georg Brandl <georg@python.org>
parents: 38526
diff changeset
251 params, method = xmlrpclib.loads(data)
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
252
38534
b1eb4a674998 Correctly dispatch Faults in loads (patch #1498627)
Georg Brandl <georg@python.org>
parents: 38526
diff changeset
253 # generate response
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
254 if dispatch_method is not None:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
255 response = dispatch_method(method, params)
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
256 else:
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
257 response = self._dispatch(method, params)
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
258 # wrap response in a singleton tuple
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
259 response = (response,)
36121
686306a67e9b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 35982
diff changeset
260 response = xmlrpclib.dumps(response, methodresponse=1,
35982
03ae0b8eb6cb [Patch #1039083] Add 'encoding' parameter to SimpleXMLRPCServer
Andrew M. Kuchling <amk@amk.ca>
parents: 35981
diff changeset
261 allow_none=self.allow_none, encoding=self.encoding)
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
262 except Fault, fault:
36121
686306a67e9b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 35982
diff changeset
263 response = xmlrpclib.dumps(fault, allow_none=self.allow_none,
35982
03ae0b8eb6cb [Patch #1039083] Add 'encoding' parameter to SimpleXMLRPCServer
Andrew M. Kuchling <amk@amk.ca>
parents: 35981
diff changeset
264 encoding=self.encoding)
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
265 except:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
266 # report exception back to server
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
267 response = xmlrpclib.dumps(
35982
03ae0b8eb6cb [Patch #1039083] Add 'encoding' parameter to SimpleXMLRPCServer
Andrew M. Kuchling <amk@amk.ca>
parents: 35981
diff changeset
268 xmlrpclib.Fault(1, "%s:%s" % (sys.exc_type, sys.exc_value)),
03ae0b8eb6cb [Patch #1039083] Add 'encoding' parameter to SimpleXMLRPCServer
Andrew M. Kuchling <amk@amk.ca>
parents: 35981
diff changeset
269 encoding=self.encoding, allow_none=self.allow_none,
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
270 )
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
271
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
272 return response
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
273
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
274 def system_listMethods(self):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
275 """system.listMethods() => ['add', 'subtract', 'multiple']
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
276
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
277 Returns a list of the methods supported by the server."""
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
278
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
279 methods = self.funcs.keys()
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
280 if self.instance is not None:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
281 # Instance can implement _listMethod to return a list of
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
282 # methods
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
283 if hasattr(self.instance, '_listMethods'):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
284 methods = remove_duplicates(
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
285 methods + self.instance._listMethods()
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
286 )
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
287 # if the instance has a _dispatch method then we
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
288 # don't have enough information to provide a list
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
289 # of methods
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
290 elif not hasattr(self.instance, '_dispatch'):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
291 methods = remove_duplicates(
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
292 methods + list_public_methods(self.instance)
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
293 )
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
294 methods.sort()
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
295 return methods
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
296
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
297 def system_methodSignature(self, method_name):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
298 """system.methodSignature('add') => [double, int, int]
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
299
33670
89faacd9ec76 Fix a small typo in the docstring for system_methodSignature .
Brett Cannon <bcannon@gmail.com>
parents: 30838
diff changeset
300 Returns a list describing the signature of the method. In the
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
301 above example, the add method takes two integers as arguments
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
302 and returns a double result.
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
303
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
304 This server does NOT support system.methodSignature."""
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
305
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
306 # See http://xmlrpc.usefulinc.com/doc/sysmethodsig.html
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
307
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
308 return 'signatures not supported'
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
309
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
310 def system_methodHelp(self, method_name):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
311 """system.methodHelp('add') => "Adds two integers together"
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
312
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
313 Returns a string containing documentation for the specified method."""
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
314
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
315 method = None
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
316 if self.funcs.has_key(method_name):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
317 method = self.funcs[method_name]
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
318 elif self.instance is not None:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
319 # Instance can implement _methodHelp to return help for a method
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
320 if hasattr(self.instance, '_methodHelp'):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
321 return self.instance._methodHelp(method_name)
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
322 # if the instance has a _dispatch method then we
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
323 # don't have enough information to provide help
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
324 elif not hasattr(self.instance, '_dispatch'):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
325 try:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
326 method = resolve_dotted_attribute(
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
327 self.instance,
34528
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
328 method_name,
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
329 self.allow_dotted_names
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
330 )
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
331 except AttributeError:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
332 pass
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
333
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
334 # Note that we aren't checking that the method actually
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
335 # be a callable object of some kind
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
336 if method is None:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
337 return ""
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
338 else:
29655
f9b8d4bf08fb fix problems found by pychecker
Neal Norwitz <nnorwitz@gmail.com>
parents: 28912
diff changeset
339 import pydoc
29659
69619542a916 whitespace normalization
Neal Norwitz <nnorwitz@gmail.com>
parents: 29655
diff changeset
340 return pydoc.getdoc(method)
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
341
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
342 def system_multicall(self, call_list):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
343 """system.multicall([{'methodName': 'add', 'params': [2, 2]}, ...]) => \
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
344 [[4], ...]
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
345
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
346 Allows the caller to package multiple XML-RPC calls into a single
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
347 request.
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
348
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
349 See http://www.xmlrpc.com/discuss/msgReader$1208
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
350 """
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
351
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
352 results = []
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
353 for call in call_list:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
354 method_name = call['methodName']
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
355 params = call['params']
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
356
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
357 try:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
358 # XXX A marshalling error in any response will fail the entire
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
359 # multicall. If someone cares they should fix this.
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
360 results.append([self._dispatch(method_name, params)])
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
361 except Fault, fault:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
362 results.append(
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
363 {'faultCode' : fault.faultCode,
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
364 'faultString' : fault.faultString}
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
365 )
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
366 except:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
367 results.append(
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
368 {'faultCode' : 1,
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
369 'faultString' : "%s:%s" % (sys.exc_type, sys.exc_value)}
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
370 )
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
371 return results
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
372
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
373 def _dispatch(self, method, params):
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
374 """Dispatches the XML-RPC method.
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
375
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
376 XML-RPC calls are forwarded to a registered function that
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
377 matches the called XML-RPC method name. If no such function
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
378 exists then the call is forwarded to the registered instance,
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
379 if available.
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
380
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
381 If the registered instance has a _dispatch method then that
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
382 method will be called with the name of the XML-RPC method and
35276
4adbd331d335 Fix all wrong instances of "it's".
Georg Brandl <georg@python.org>
parents: 34528
diff changeset
383 its parameters as a tuple
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
384 e.g. instance._dispatch('add',(2,3))
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
385
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
386 If the registered instance does not have a _dispatch method
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
387 then the instance will be searched to find a matching method
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
388 and, if found, will be called.
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
389
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
390 Methods beginning with an '_' are considered private and will
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
391 not be called.
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
392 """
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
393
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
394 func = None
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
395 try:
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
396 # check to see if a matching function has been registered
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
397 func = self.funcs[method]
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
398 except KeyError:
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
399 if self.instance is not None:
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
400 # check for a _dispatch method
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
401 if hasattr(self.instance, '_dispatch'):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
402 return self.instance._dispatch(method, params)
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
403 else:
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
404 # call instance method directly
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
405 try:
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
406 func = resolve_dotted_attribute(
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
407 self.instance,
34528
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
408 method,
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
409 self.allow_dotted_names
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
410 )
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
411 except AttributeError:
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
412 pass
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
413
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
414 if func is not None:
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
415 return func(*params)
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
416 else:
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
417 raise Exception('method "%s" is not supported' % method)
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
418
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
419 class SimpleXMLRPCRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
420 """Simple XML-RPC request handler class.
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
421
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
422 Handles all HTTP POST requests and attempts to decode them as
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
423 XML-RPC requests.
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
424 """
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
425
38526
f831e8bc6bd3 [Bug #1473048]
Andrew M. Kuchling <amk@amk.ca>
parents: 37886
diff changeset
426 # Class attribute listing the accessible path components;
f831e8bc6bd3 [Bug #1473048]
Andrew M. Kuchling <amk@amk.ca>
parents: 37886
diff changeset
427 # paths not on this list will result in a 404 error.
f831e8bc6bd3 [Bug #1473048]
Andrew M. Kuchling <amk@amk.ca>
parents: 37886
diff changeset
428 rpc_paths = ('/', '/RPC2')
f831e8bc6bd3 [Bug #1473048]
Andrew M. Kuchling <amk@amk.ca>
parents: 37886
diff changeset
429
f831e8bc6bd3 [Bug #1473048]
Andrew M. Kuchling <amk@amk.ca>
parents: 37886
diff changeset
430 def is_rpc_path_valid(self):
f831e8bc6bd3 [Bug #1473048]
Andrew M. Kuchling <amk@amk.ca>
parents: 37886
diff changeset
431 if self.rpc_paths:
f831e8bc6bd3 [Bug #1473048]
Andrew M. Kuchling <amk@amk.ca>
parents: 37886
diff changeset
432 return self.path in self.rpc_paths
f831e8bc6bd3 [Bug #1473048]
Andrew M. Kuchling <amk@amk.ca>
parents: 37886
diff changeset
433 else:
f831e8bc6bd3 [Bug #1473048]
Andrew M. Kuchling <amk@amk.ca>
parents: 37886
diff changeset
434 # If .rpc_paths is empty, just assume all paths are legal
f831e8bc6bd3 [Bug #1473048]
Andrew M. Kuchling <amk@amk.ca>
parents: 37886
diff changeset
435 return True
f831e8bc6bd3 [Bug #1473048]
Andrew M. Kuchling <amk@amk.ca>
parents: 37886
diff changeset
436
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
437 def do_POST(self):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
438 """Handles the HTTP POST request.
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
439
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
440 Attempts to interpret all HTTP POST requests as XML-RPC calls,
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
441 which are forwarded to the server's _dispatch method for handling.
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
442 """
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
443
38526
f831e8bc6bd3 [Bug #1473048]
Andrew M. Kuchling <amk@amk.ca>
parents: 37886
diff changeset
444 # Check that the path is legal
f831e8bc6bd3 [Bug #1473048]
Andrew M. Kuchling <amk@amk.ca>
parents: 37886
diff changeset
445 if not self.is_rpc_path_valid():
f831e8bc6bd3 [Bug #1473048]
Andrew M. Kuchling <amk@amk.ca>
parents: 37886
diff changeset
446 self.report_404()
f831e8bc6bd3 [Bug #1473048]
Andrew M. Kuchling <amk@amk.ca>
parents: 37886
diff changeset
447 return
38537
995ecd231f7c Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 38534
diff changeset
448
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
449 try:
36121
686306a67e9b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 35982
diff changeset
450 # Get arguments by reading body of request.
686306a67e9b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 35982
diff changeset
451 # We read this in chunks to avoid straining
35977
191b59909ded [Bug #792570] Under Windows, socket.read() seems to run into trouble when
Andrew M. Kuchling <amk@amk.ca>
parents: 35976
diff changeset
452 # socket.read(); around the 10 or 15Mb mark, some platforms
191b59909ded [Bug #792570] Under Windows, socket.read() seems to run into trouble when
Andrew M. Kuchling <amk@amk.ca>
parents: 35976
diff changeset
453 # begin to have problems (bug #792570).
191b59909ded [Bug #792570] Under Windows, socket.read() seems to run into trouble when
Andrew M. Kuchling <amk@amk.ca>
parents: 35976
diff changeset
454 max_chunk_size = 10*1024*1024
191b59909ded [Bug #792570] Under Windows, socket.read() seems to run into trouble when
Andrew M. Kuchling <amk@amk.ca>
parents: 35976
diff changeset
455 size_remaining = int(self.headers["content-length"])
191b59909ded [Bug #792570] Under Windows, socket.read() seems to run into trouble when
Andrew M. Kuchling <amk@amk.ca>
parents: 35976
diff changeset
456 L = []
191b59909ded [Bug #792570] Under Windows, socket.read() seems to run into trouble when
Andrew M. Kuchling <amk@amk.ca>
parents: 35976
diff changeset
457 while size_remaining:
191b59909ded [Bug #792570] Under Windows, socket.read() seems to run into trouble when
Andrew M. Kuchling <amk@amk.ca>
parents: 35976
diff changeset
458 chunk_size = min(size_remaining, max_chunk_size)
191b59909ded [Bug #792570] Under Windows, socket.read() seems to run into trouble when
Andrew M. Kuchling <amk@amk.ca>
parents: 35976
diff changeset
459 L.append(self.rfile.read(chunk_size))
191b59909ded [Bug #792570] Under Windows, socket.read() seems to run into trouble when
Andrew M. Kuchling <amk@amk.ca>
parents: 35976
diff changeset
460 size_remaining -= len(L[-1])
191b59909ded [Bug #792570] Under Windows, socket.read() seems to run into trouble when
Andrew M. Kuchling <amk@amk.ca>
parents: 35976
diff changeset
461 data = ''.join(L)
191b59909ded [Bug #792570] Under Windows, socket.read() seems to run into trouble when
Andrew M. Kuchling <amk@amk.ca>
parents: 35976
diff changeset
462
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
463 # In previous versions of SimpleXMLRPCServer, _dispatch
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
464 # could be overridden in this class, instead of in
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
465 # SimpleXMLRPCDispatcher. To maintain backwards compatibility,
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
466 # check to see if a subclass implements _dispatch and dispatch
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
467 # using that method if present.
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
468 response = self.server._marshaled_dispatch(
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
469 data, getattr(self, '_dispatch', None)
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
470 )
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
471 except: # This should only happen if the module is buggy
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
472 # internal error, report as HTTP server error
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
473 self.send_response(500)
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
474 self.end_headers()
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
475 else:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
476 # got a valid XML RPC response
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
477 self.send_response(200)
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
478 self.send_header("Content-type", "text/xml")
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
479 self.send_header("Content-length", str(len(response)))
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
480 self.end_headers()
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
481 self.wfile.write(response)
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
482
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
483 # shut down the connection
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
484 self.wfile.flush()
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
485 self.connection.shutdown(1)
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
486
38526
f831e8bc6bd3 [Bug #1473048]
Andrew M. Kuchling <amk@amk.ca>
parents: 37886
diff changeset
487 def report_404 (self):
f831e8bc6bd3 [Bug #1473048]
Andrew M. Kuchling <amk@amk.ca>
parents: 37886
diff changeset
488 # Report a 404 error
38537
995ecd231f7c Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 38534
diff changeset
489 self.send_response(404)
995ecd231f7c Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 38534
diff changeset
490 response = 'No such page'
995ecd231f7c Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 38534
diff changeset
491 self.send_header("Content-type", "text/plain")
995ecd231f7c Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 38534
diff changeset
492 self.send_header("Content-length", str(len(response)))
995ecd231f7c Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 38534
diff changeset
493 self.end_headers()
995ecd231f7c Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 38534
diff changeset
494 self.wfile.write(response)
995ecd231f7c Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 38534
diff changeset
495 # shut down the connection
995ecd231f7c Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 38534
diff changeset
496 self.wfile.flush()
995ecd231f7c Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 38534
diff changeset
497 self.connection.shutdown(1)
38526
f831e8bc6bd3 [Bug #1473048]
Andrew M. Kuchling <amk@amk.ca>
parents: 37886
diff changeset
498
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
499 def log_request(self, code='-', size='-'):
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
500 """Selectively log an accepted request."""
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
501
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
502 if self.server.logRequests:
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
503 BaseHTTPServer.BaseHTTPRequestHandler.log_request(self, code, size)
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
504
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
505 class SimpleXMLRPCServer(SocketServer.TCPServer,
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
506 SimpleXMLRPCDispatcher):
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
507 """Simple XML-RPC server.
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
508
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
509 Simple XML-RPC server that allows functions and a single instance
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
510 to be installed to handle requests. The default implementation
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
511 attempts to dispatch XML-RPC calls to the functions or instance
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
512 installed in the server. Override the _dispatch method inhereted
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
513 from SimpleXMLRPCDispatcher to change this behavior.
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
514 """
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
515
35976
81c944c3d13a [Bug #1222790] Set reuse-address and close-on-exec flags on the HTTP listening socket
Andrew M. Kuchling <amk@amk.ca>
parents: 35276
diff changeset
516 allow_reuse_address = True
81c944c3d13a [Bug #1222790] Set reuse-address and close-on-exec flags on the HTTP listening socket
Andrew M. Kuchling <amk@amk.ca>
parents: 35276
diff changeset
517
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
518 def __init__(self, addr, requestHandler=SimpleXMLRPCRequestHandler,
35982
03ae0b8eb6cb [Patch #1039083] Add 'encoding' parameter to SimpleXMLRPCServer
Andrew M. Kuchling <amk@amk.ca>
parents: 35981
diff changeset
519 logRequests=True, allow_none=False, encoding=None):
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
520 self.logRequests = logRequests
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
521
35982
03ae0b8eb6cb [Patch #1039083] Add 'encoding' parameter to SimpleXMLRPCServer
Andrew M. Kuchling <amk@amk.ca>
parents: 35981
diff changeset
522 SimpleXMLRPCDispatcher.__init__(self, allow_none, encoding)
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
523 SocketServer.TCPServer.__init__(self, addr, requestHandler)
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
524
36121
686306a67e9b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 35982
diff changeset
525 # [Bug #1222790] If possible, set close-on-exec flag; if a
686306a67e9b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 35982
diff changeset
526 # method spawns a subprocess, the subprocess shouldn't have
35976
81c944c3d13a [Bug #1222790] Set reuse-address and close-on-exec flags on the HTTP listening socket
Andrew M. Kuchling <amk@amk.ca>
parents: 35276
diff changeset
527 # the listening socket open.
37631
399a9a72095f Bug #1469163: SimpleXMLRPCServer unconditionally attempted to import fcntl.
Anthony Baxter <anthonybaxter@gmail.com>
parents: 36121
diff changeset
528 if fcntl is not None and hasattr(fcntl, 'FD_CLOEXEC'):
35976
81c944c3d13a [Bug #1222790] Set reuse-address and close-on-exec flags on the HTTP listening socket
Andrew M. Kuchling <amk@amk.ca>
parents: 35276
diff changeset
529 flags = fcntl.fcntl(self.fileno(), fcntl.F_GETFD)
81c944c3d13a [Bug #1222790] Set reuse-address and close-on-exec flags on the HTTP listening socket
Andrew M. Kuchling <amk@amk.ca>
parents: 35276
diff changeset
530 flags |= fcntl.FD_CLOEXEC
81c944c3d13a [Bug #1222790] Set reuse-address and close-on-exec flags on the HTTP listening socket
Andrew M. Kuchling <amk@amk.ca>
parents: 35276
diff changeset
531 fcntl.fcntl(self.fileno(), fcntl.F_SETFD, flags)
81c944c3d13a [Bug #1222790] Set reuse-address and close-on-exec flags on the HTTP listening socket
Andrew M. Kuchling <amk@amk.ca>
parents: 35276
diff changeset
532
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
533 class CGIXMLRPCRequestHandler(SimpleXMLRPCDispatcher):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
534 """Simple handler for XML-RPC data passed through CGI."""
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
535
35982
03ae0b8eb6cb [Patch #1039083] Add 'encoding' parameter to SimpleXMLRPCServer
Andrew M. Kuchling <amk@amk.ca>
parents: 35981
diff changeset
536 def __init__(self, allow_none=False, encoding=None):
03ae0b8eb6cb [Patch #1039083] Add 'encoding' parameter to SimpleXMLRPCServer
Andrew M. Kuchling <amk@amk.ca>
parents: 35981
diff changeset
537 SimpleXMLRPCDispatcher.__init__(self, allow_none, encoding)
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
538
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
539 def handle_xmlrpc(self, request_text):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
540 """Handle a single XML-RPC request"""
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
541
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
542 response = self._marshaled_dispatch(request_text)
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
543
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
544 print 'Content-Type: text/xml'
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
545 print 'Content-Length: %d' % len(response)
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
546 print
28912
4ef108f8181f Patch #727805: Remove extra line ending from CGI responses.
Martin v. Löwis <martin@v.loewis.de>
parents: 27507
diff changeset
547 sys.stdout.write(response)
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
548
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
549 def handle_get(self):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
550 """Handle a single HTTP GET request.
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
551
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
552 Default implementation indicates an error because
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
553 XML-RPC uses the POST method.
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
554 """
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
555
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
556 code = 400
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
557 message, explain = \
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
558 BaseHTTPServer.BaseHTTPRequestHandler.responses[code]
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
559
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
560 response = BaseHTTPServer.DEFAULT_ERROR_MESSAGE % \
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
561 {
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
562 'code' : code,
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
563 'message' : message,
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
564 'explain' : explain
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
565 }
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
566 print 'Status: %d %s' % (code, message)
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
567 print 'Content-Type: text/html'
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
568 print 'Content-Length: %d' % len(response)
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
569 print
29655
f9b8d4bf08fb fix problems found by pychecker
Neal Norwitz <nnorwitz@gmail.com>
parents: 28912
diff changeset
570 sys.stdout.write(response)
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
571
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
572 def handle_request(self, request_text = None):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
573 """Handle a single XML-RPC request passed through a CGI post method.
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
574
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
575 If no XML data is given then it is read from stdin. The resulting
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
576 XML-RPC response is printed to stdout along with the correct HTTP
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
577 headers.
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
578 """
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
579
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
580 if request_text is None and \
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
581 os.environ.get('REQUEST_METHOD', None) == 'GET':
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
582 self.handle_get()
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
583 else:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
584 # POST data is normally available through stdin
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
585 if request_text is None:
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
586 request_text = sys.stdin.read()
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
587
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
588 self.handle_xmlrpc(request_text)
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
589
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
590 if __name__ == '__main__':
37886
c28f74bed83b Add explanatory message
Andrew M. Kuchling <amk@amk.ca>
parents: 37631
diff changeset
591 print 'Running XML-RPC server on port 8000'
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
592 server = SimpleXMLRPCServer(("localhost", 8000))
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
593 server.register_function(pow)
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
594 server.register_function(lambda x,y: x+y, 'add')
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
595 server.serve_forever()