annotate Lib/SimpleXMLRPCServer.py @ 51330:ca423008fa4a legacy-trunk

#5144: document that PySys_SetArgv prepends the script directory (or the empty string) to sys.path.
author Georg Brandl <georg@python.org>
date Thu, 05 Feb 2009 10:37:07 +0000
parents 986cbdaf154f
children 4acbbb3e65e2 76235580aa3d
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
47241
ba1fa511b72d socketserver renaming reversal part 3: move the module into the right
Georg Brandl <georg@python.org>
parents: 46929
diff changeset
104 import SocketServer
19937
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
42658
bc31dfcf7dfa Added a flag (_send_traceback_header) to the SimpleXMLRPCServer class
Facundo Batista <facundobatista@gmail.com>
parents: 41106
diff changeset
108 import traceback
37631
399a9a72095f Bug #1469163: SimpleXMLRPCServer unconditionally attempted to import fcntl.
Anthony Baxter <anthonybaxter@gmail.com>
parents: 36121
diff changeset
109 try:
399a9a72095f Bug #1469163: SimpleXMLRPCServer unconditionally attempted to import fcntl.
Anthony Baxter <anthonybaxter@gmail.com>
parents: 36121
diff changeset
110 import fcntl
399a9a72095f Bug #1469163: SimpleXMLRPCServer unconditionally attempted to import fcntl.
Anthony Baxter <anthonybaxter@gmail.com>
parents: 36121
diff changeset
111 except ImportError:
399a9a72095f Bug #1469163: SimpleXMLRPCServer unconditionally attempted to import fcntl.
Anthony Baxter <anthonybaxter@gmail.com>
parents: 36121
diff changeset
112 fcntl = None
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
113
34528
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
114 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
115 """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
116
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
117 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
118 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
119
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
120 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
121 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
122 """
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
123
34528
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
124 if allow_dotted_names:
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
125 attrs = attr.split('.')
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
126 else:
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
127 attrs = [attr]
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
128
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
129 for i in attrs:
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
130 if i.startswith('_'):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
131 raise AttributeError(
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
132 'attempt to access private attribute "%s"' % i
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
133 )
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
134 else:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
135 obj = getattr(obj,i)
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
136 return obj
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
137
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
138 def list_public_methods(obj):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
139 """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
140 object, which represent callable attributes"""
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
141
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
142 return [member for member in dir(obj)
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
143 if not member.startswith('_') and
48147
986cbdaf154f Remove a dict.has_key() and callable() usage in SimpleXMLRPCServer as triggered
Brett Cannon <bcannon@gmail.com>
parents: 47241
diff changeset
144 hasattr(getattr(obj, member), '__call__')]
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
145
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
146 def remove_duplicates(lst):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
147 """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
148
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
149 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
150 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
151 resulting list is not defined.
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
152 """
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
153 u = {}
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
154 for x in lst:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
155 u[x] = 1
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
156
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
157 return u.keys()
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
158
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
159 class SimpleXMLRPCDispatcher:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
160 """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
161
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
162 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
163 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
164 reason to instantiate this class directly.
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
165 """
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
166
35982
03ae0b8eb6cb [Patch #1039083] Add 'encoding' parameter to SimpleXMLRPCServer
Andrew M. Kuchling <amk@amk.ca>
parents: 35981
diff changeset
167 def __init__(self, allow_none, encoding):
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
168 self.funcs = {}
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
169 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
170 self.allow_none = allow_none
35982
03ae0b8eb6cb [Patch #1039083] Add 'encoding' parameter to SimpleXMLRPCServer
Andrew M. Kuchling <amk@amk.ca>
parents: 35981
diff changeset
171 self.encoding = encoding
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
172
34528
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
173 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
174 """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
175
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
176 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
177
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
178 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
179 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
180 its parameters as a tuple
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
181 e.g. instance._dispatch('add',(2,3))
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
182
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
183 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
184 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
185 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
186 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
187 SimpleXMLRPCServer.
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
188
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
189 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
190 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
191
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
192 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
193 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
194 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
195 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
196
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
197 *** SECURITY WARNING: ***
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
198
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
199 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
200 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
201 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
202 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
203
27249
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
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
206 self.instance = instance
34528
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
207 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
208
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
209 def register_function(self, function, name = None):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
210 """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
211
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
212 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
213 for the function.
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
214 """
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
215
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
216 if name is None:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
217 name = function.__name__
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
218 self.funcs[name] = function
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
219
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
220 def register_introspection_functions(self):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
221 """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
222 namespace.
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
223
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
224 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
225 """
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
226
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
227 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
228 'system.methodSignature' : self.system_methodSignature,
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
229 'system.methodHelp' : self.system_methodHelp})
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
230
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
231 def register_multicall_functions(self):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
232 """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
233 namespace.
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
234
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
235 see http://www.xmlrpc.com/discuss/msgReader$1208"""
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
236
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
237 self.funcs.update({'system.multicall' : self.system_multicall})
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
238
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
239 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
240 """Dispatches an XML-RPC method from marshalled (XML) data.
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
241
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
242 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
243 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
244 marshalled data. For backwards compatibility, a dispatch
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
245 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
246 SimpleXMLRPCRequestHandler.do_POST) but overriding the
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
247 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
248 of changing method dispatch behavior.
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
249 """
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
250
38534
b1eb4a674998 Correctly dispatch Faults in loads (patch #1498627)
Georg Brandl <georg@python.org>
parents: 38526
diff changeset
251 try:
b1eb4a674998 Correctly dispatch Faults in loads (patch #1498627)
Georg Brandl <georg@python.org>
parents: 38526
diff changeset
252 params, method = xmlrpclib.loads(data)
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
253
38534
b1eb4a674998 Correctly dispatch Faults in loads (patch #1498627)
Georg Brandl <georg@python.org>
parents: 38526
diff changeset
254 # generate response
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
255 if dispatch_method is not None:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
256 response = dispatch_method(method, params)
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
257 else:
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
258 response = self._dispatch(method, params)
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
259 # wrap response in a singleton tuple
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
260 response = (response,)
36121
686306a67e9b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 35982
diff changeset
261 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
262 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
263 except Fault, fault:
36121
686306a67e9b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 35982
diff changeset
264 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
265 encoding=self.encoding)
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
266 except:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
267 # report exception back to server
39766
71ac796a018c [Bug #1525469] SimpleXMLRPCServer still uses the sys.exc_{value,type} module-level globals instead of calling sys.exc_info(). Reported by Russell Warren
Andrew M. Kuchling <amk@amk.ca>
parents: 38537
diff changeset
268 exc_type, exc_value, exc_tb = sys.exc_info()
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
269 response = xmlrpclib.dumps(
39766
71ac796a018c [Bug #1525469] SimpleXMLRPCServer still uses the sys.exc_{value,type} module-level globals instead of calling sys.exc_info(). Reported by Russell Warren
Andrew M. Kuchling <amk@amk.ca>
parents: 38537
diff changeset
270 xmlrpclib.Fault(1, "%s:%s" % (exc_type, exc_value)),
35982
03ae0b8eb6cb [Patch #1039083] Add 'encoding' parameter to SimpleXMLRPCServer
Andrew M. Kuchling <amk@amk.ca>
parents: 35981
diff changeset
271 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
272 )
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 return response
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
275
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
276 def system_listMethods(self):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
277 """system.listMethods() => ['add', 'subtract', 'multiple']
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
278
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
279 Returns a list of the methods supported by the server."""
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
280
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
281 methods = self.funcs.keys()
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
282 if self.instance is not None:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
283 # 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
284 # methods
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
285 if hasattr(self.instance, '_listMethods'):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
286 methods = remove_duplicates(
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
287 methods + self.instance._listMethods()
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
288 )
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
289 # 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
290 # 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
291 # of methods
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
292 elif not hasattr(self.instance, '_dispatch'):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
293 methods = remove_duplicates(
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
294 methods + list_public_methods(self.instance)
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
295 )
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
296 methods.sort()
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
297 return methods
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
298
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
299 def system_methodSignature(self, method_name):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
300 """system.methodSignature('add') => [double, int, int]
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
301
33670
89faacd9ec76 Fix a small typo in the docstring for system_methodSignature .
Brett Cannon <bcannon@gmail.com>
parents: 30838
diff changeset
302 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
303 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
304 and returns a double result.
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 This server does NOT support system.methodSignature."""
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
307
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
308 # See http://xmlrpc.usefulinc.com/doc/sysmethodsig.html
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
309
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
310 return 'signatures not supported'
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
311
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
312 def system_methodHelp(self, method_name):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
313 """system.methodHelp('add') => "Adds two integers together"
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
314
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
315 Returns a string containing documentation for the specified method."""
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
316
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
317 method = None
48147
986cbdaf154f Remove a dict.has_key() and callable() usage in SimpleXMLRPCServer as triggered
Brett Cannon <bcannon@gmail.com>
parents: 47241
diff changeset
318 if method_name in self.funcs:
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
319 method = self.funcs[method_name]
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
320 elif self.instance is not None:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
321 # 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
322 if hasattr(self.instance, '_methodHelp'):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
323 return self.instance._methodHelp(method_name)
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
324 # 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
325 # 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
326 elif not hasattr(self.instance, '_dispatch'):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
327 try:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
328 method = resolve_dotted_attribute(
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
329 self.instance,
34528
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
330 method_name,
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
331 self.allow_dotted_names
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
332 )
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
333 except AttributeError:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
334 pass
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
335
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
336 # 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
337 # be a callable object of some kind
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
338 if method is None:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
339 return ""
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
340 else:
29655
f9b8d4bf08fb fix problems found by pychecker
Neal Norwitz <nnorwitz@gmail.com>
parents: 28912
diff changeset
341 import pydoc
29659
69619542a916 whitespace normalization
Neal Norwitz <nnorwitz@gmail.com>
parents: 29655
diff changeset
342 return pydoc.getdoc(method)
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
343
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
344 def system_multicall(self, call_list):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
345 """system.multicall([{'methodName': 'add', 'params': [2, 2]}, ...]) => \
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
346 [[4], ...]
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
347
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
348 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
349 request.
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 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
352 """
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
353
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
354 results = []
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
355 for call in call_list:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
356 method_name = call['methodName']
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
357 params = call['params']
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
358
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
359 try:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
360 # 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
361 # 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
362 results.append([self._dispatch(method_name, params)])
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
363 except Fault, fault:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
364 results.append(
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
365 {'faultCode' : fault.faultCode,
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
366 'faultString' : fault.faultString}
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
367 )
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
368 except:
39766
71ac796a018c [Bug #1525469] SimpleXMLRPCServer still uses the sys.exc_{value,type} module-level globals instead of calling sys.exc_info(). Reported by Russell Warren
Andrew M. Kuchling <amk@amk.ca>
parents: 38537
diff changeset
369 exc_type, exc_value, exc_tb = sys.exc_info()
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
370 results.append(
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
371 {'faultCode' : 1,
39766
71ac796a018c [Bug #1525469] SimpleXMLRPCServer still uses the sys.exc_{value,type} module-level globals instead of calling sys.exc_info(). Reported by Russell Warren
Andrew M. Kuchling <amk@amk.ca>
parents: 38537
diff changeset
372 'faultString' : "%s:%s" % (exc_type, exc_value)}
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
373 )
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
374 return results
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
375
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
376 def _dispatch(self, method, params):
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
377 """Dispatches the XML-RPC method.
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
378
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
379 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
380 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
381 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
382 if available.
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
383
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
384 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
385 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
386 its parameters as a tuple
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
387 e.g. instance._dispatch('add',(2,3))
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
388
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
389 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
390 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
391 and, if found, will be called.
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 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
394 not be called.
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
395 """
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
396
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
397 func = None
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
398 try:
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
399 # 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
400 func = self.funcs[method]
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
401 except KeyError:
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
402 if self.instance is not None:
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
403 # check for a _dispatch method
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
404 if hasattr(self.instance, '_dispatch'):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
405 return self.instance._dispatch(method, params)
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
406 else:
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
407 # call instance method directly
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
408 try:
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
409 func = resolve_dotted_attribute(
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
410 self.instance,
34528
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
411 method,
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
412 self.allow_dotted_names
19937
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 except AttributeError:
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
415 pass
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
416
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
417 if func is not None:
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
418 return func(*params)
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
419 else:
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
420 raise Exception('method "%s" is not supported' % method)
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
421
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
422 class SimpleXMLRPCRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
423 """Simple XML-RPC request handler class.
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
424
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
425 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
426 XML-RPC requests.
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
427 """
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
428
38526
f831e8bc6bd3 [Bug #1473048]
Andrew M. Kuchling <amk@amk.ca>
parents: 37886
diff changeset
429 # Class attribute listing the accessible path components;
f831e8bc6bd3 [Bug #1473048]
Andrew M. Kuchling <amk@amk.ca>
parents: 37886
diff changeset
430 # paths not on this list will result in a 404 error.
f831e8bc6bd3 [Bug #1473048]
Andrew M. Kuchling <amk@amk.ca>
parents: 37886
diff changeset
431 rpc_paths = ('/', '/RPC2')
f831e8bc6bd3 [Bug #1473048]
Andrew M. Kuchling <amk@amk.ca>
parents: 37886
diff changeset
432
f831e8bc6bd3 [Bug #1473048]
Andrew M. Kuchling <amk@amk.ca>
parents: 37886
diff changeset
433 def is_rpc_path_valid(self):
f831e8bc6bd3 [Bug #1473048]
Andrew M. Kuchling <amk@amk.ca>
parents: 37886
diff changeset
434 if self.rpc_paths:
f831e8bc6bd3 [Bug #1473048]
Andrew M. Kuchling <amk@amk.ca>
parents: 37886
diff changeset
435 return self.path in self.rpc_paths
f831e8bc6bd3 [Bug #1473048]
Andrew M. Kuchling <amk@amk.ca>
parents: 37886
diff changeset
436 else:
f831e8bc6bd3 [Bug #1473048]
Andrew M. Kuchling <amk@amk.ca>
parents: 37886
diff changeset
437 # If .rpc_paths is empty, just assume all paths are legal
f831e8bc6bd3 [Bug #1473048]
Andrew M. Kuchling <amk@amk.ca>
parents: 37886
diff changeset
438 return True
f831e8bc6bd3 [Bug #1473048]
Andrew M. Kuchling <amk@amk.ca>
parents: 37886
diff changeset
439
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
440 def do_POST(self):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
441 """Handles the HTTP POST request.
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
442
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
443 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
444 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
445 """
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
446
38526
f831e8bc6bd3 [Bug #1473048]
Andrew M. Kuchling <amk@amk.ca>
parents: 37886
diff changeset
447 # Check that the path is legal
f831e8bc6bd3 [Bug #1473048]
Andrew M. Kuchling <amk@amk.ca>
parents: 37886
diff changeset
448 if not self.is_rpc_path_valid():
f831e8bc6bd3 [Bug #1473048]
Andrew M. Kuchling <amk@amk.ca>
parents: 37886
diff changeset
449 self.report_404()
f831e8bc6bd3 [Bug #1473048]
Andrew M. Kuchling <amk@amk.ca>
parents: 37886
diff changeset
450 return
38537
995ecd231f7c Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 38534
diff changeset
451
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
452 try:
36121
686306a67e9b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 35982
diff changeset
453 # Get arguments by reading body of request.
686306a67e9b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 35982
diff changeset
454 # 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
455 # 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
456 # 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
457 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
458 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
459 L = []
191b59909ded [Bug #792570] Under Windows, socket.read() seems to run into trouble when
Andrew M. Kuchling <amk@amk.ca>
parents: 35976
diff changeset
460 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
461 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
462 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
463 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
464 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
465
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
466 # In previous versions of SimpleXMLRPCServer, _dispatch
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
467 # 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
468 # SimpleXMLRPCDispatcher. To maintain backwards compatibility,
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
469 # 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
470 # using that method if present.
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
471 response = self.server._marshaled_dispatch(
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
472 data, getattr(self, '_dispatch', None)
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
473 )
42658
bc31dfcf7dfa Added a flag (_send_traceback_header) to the SimpleXMLRPCServer class
Facundo Batista <facundobatista@gmail.com>
parents: 41106
diff changeset
474 except Exception, e: # This should only happen if the module is buggy
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
475 # internal error, report as HTTP server error
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
476 self.send_response(500)
42658
bc31dfcf7dfa Added a flag (_send_traceback_header) to the SimpleXMLRPCServer class
Facundo Batista <facundobatista@gmail.com>
parents: 41106
diff changeset
477
bc31dfcf7dfa Added a flag (_send_traceback_header) to the SimpleXMLRPCServer class
Facundo Batista <facundobatista@gmail.com>
parents: 41106
diff changeset
478 # Send information about the exception if requested
bc31dfcf7dfa Added a flag (_send_traceback_header) to the SimpleXMLRPCServer class
Facundo Batista <facundobatista@gmail.com>
parents: 41106
diff changeset
479 if hasattr(self.server, '_send_traceback_header') and \
bc31dfcf7dfa Added a flag (_send_traceback_header) to the SimpleXMLRPCServer class
Facundo Batista <facundobatista@gmail.com>
parents: 41106
diff changeset
480 self.server._send_traceback_header:
bc31dfcf7dfa Added a flag (_send_traceback_header) to the SimpleXMLRPCServer class
Facundo Batista <facundobatista@gmail.com>
parents: 41106
diff changeset
481 self.send_header("X-exception", str(e))
bc31dfcf7dfa Added a flag (_send_traceback_header) to the SimpleXMLRPCServer class
Facundo Batista <facundobatista@gmail.com>
parents: 41106
diff changeset
482 self.send_header("X-traceback", traceback.format_exc())
bc31dfcf7dfa Added a flag (_send_traceback_header) to the SimpleXMLRPCServer class
Facundo Batista <facundobatista@gmail.com>
parents: 41106
diff changeset
483
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
484 self.end_headers()
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
485 else:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
486 # got a valid XML RPC response
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
487 self.send_response(200)
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
488 self.send_header("Content-type", "text/xml")
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
489 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
490 self.end_headers()
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
491 self.wfile.write(response)
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
492
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
493 # shut down the connection
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
494 self.wfile.flush()
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
495 self.connection.shutdown(1)
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
496
38526
f831e8bc6bd3 [Bug #1473048]
Andrew M. Kuchling <amk@amk.ca>
parents: 37886
diff changeset
497 def report_404 (self):
f831e8bc6bd3 [Bug #1473048]
Andrew M. Kuchling <amk@amk.ca>
parents: 37886
diff changeset
498 # Report a 404 error
38537
995ecd231f7c Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 38534
diff changeset
499 self.send_response(404)
995ecd231f7c Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 38534
diff changeset
500 response = 'No such page'
995ecd231f7c Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 38534
diff changeset
501 self.send_header("Content-type", "text/plain")
995ecd231f7c Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 38534
diff changeset
502 self.send_header("Content-length", str(len(response)))
995ecd231f7c Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 38534
diff changeset
503 self.end_headers()
995ecd231f7c Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 38534
diff changeset
504 self.wfile.write(response)
995ecd231f7c Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 38534
diff changeset
505 # shut down the connection
995ecd231f7c Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 38534
diff changeset
506 self.wfile.flush()
995ecd231f7c Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 38534
diff changeset
507 self.connection.shutdown(1)
38526
f831e8bc6bd3 [Bug #1473048]
Andrew M. Kuchling <amk@amk.ca>
parents: 37886
diff changeset
508
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
509 def log_request(self, code='-', size='-'):
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
510 """Selectively log an accepted request."""
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
511
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
512 if self.server.logRequests:
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
513 BaseHTTPServer.BaseHTTPRequestHandler.log_request(self, code, size)
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
514
47241
ba1fa511b72d socketserver renaming reversal part 3: move the module into the right
Georg Brandl <georg@python.org>
parents: 46929
diff changeset
515 class SimpleXMLRPCServer(SocketServer.TCPServer,
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
516 SimpleXMLRPCDispatcher):
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
517 """Simple XML-RPC server.
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
518
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
519 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
520 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
521 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
522 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
523 from SimpleXMLRPCDispatcher to change this behavior.
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
524 """
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
525
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
526 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
527
42658
bc31dfcf7dfa Added a flag (_send_traceback_header) to the SimpleXMLRPCServer class
Facundo Batista <facundobatista@gmail.com>
parents: 41106
diff changeset
528 # Warning: this is for debugging purposes only! Never set this to True in
bc31dfcf7dfa Added a flag (_send_traceback_header) to the SimpleXMLRPCServer class
Facundo Batista <facundobatista@gmail.com>
parents: 41106
diff changeset
529 # production code, as will be sending out sensitive information (exception
bc31dfcf7dfa Added a flag (_send_traceback_header) to the SimpleXMLRPCServer class
Facundo Batista <facundobatista@gmail.com>
parents: 41106
diff changeset
530 # and stack trace details) when exceptions are raised inside
bc31dfcf7dfa Added a flag (_send_traceback_header) to the SimpleXMLRPCServer class
Facundo Batista <facundobatista@gmail.com>
parents: 41106
diff changeset
531 # SimpleXMLRPCRequestHandler.do_POST
bc31dfcf7dfa Added a flag (_send_traceback_header) to the SimpleXMLRPCServer class
Facundo Batista <facundobatista@gmail.com>
parents: 41106
diff changeset
532 _send_traceback_header = False
bc31dfcf7dfa Added a flag (_send_traceback_header) to the SimpleXMLRPCServer class
Facundo Batista <facundobatista@gmail.com>
parents: 41106
diff changeset
533
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
534 def __init__(self, addr, requestHandler=SimpleXMLRPCRequestHandler,
41106
101a1ab573db Patch #1599845: Add an option to disable the implicit calls to server_bind() and server_activate() in the constructors for TCPServer, SimpleXMLRPCServer and DocXMLRPCServer.
Collin Winter <collinw@gmail.com>
parents: 39766
diff changeset
535 logRequests=True, allow_none=False, encoding=None, bind_and_activate=True):
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
536 self.logRequests = logRequests
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
537
35982
03ae0b8eb6cb [Patch #1039083] Add 'encoding' parameter to SimpleXMLRPCServer
Andrew M. Kuchling <amk@amk.ca>
parents: 35981
diff changeset
538 SimpleXMLRPCDispatcher.__init__(self, allow_none, encoding)
47241
ba1fa511b72d socketserver renaming reversal part 3: move the module into the right
Georg Brandl <georg@python.org>
parents: 46929
diff changeset
539 SocketServer.TCPServer.__init__(self, addr, requestHandler, bind_and_activate)
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
540
36121
686306a67e9b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 35982
diff changeset
541 # [Bug #1222790] If possible, set close-on-exec flag; if a
686306a67e9b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 35982
diff changeset
542 # 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
543 # the listening socket open.
37631
399a9a72095f Bug #1469163: SimpleXMLRPCServer unconditionally attempted to import fcntl.
Anthony Baxter <anthonybaxter@gmail.com>
parents: 36121
diff changeset
544 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
545 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
546 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
547 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
548
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
549 class CGIXMLRPCRequestHandler(SimpleXMLRPCDispatcher):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
550 """Simple handler for XML-RPC data passed through CGI."""
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
551
35982
03ae0b8eb6cb [Patch #1039083] Add 'encoding' parameter to SimpleXMLRPCServer
Andrew M. Kuchling <amk@amk.ca>
parents: 35981
diff changeset
552 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
553 SimpleXMLRPCDispatcher.__init__(self, allow_none, encoding)
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
554
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
555 def handle_xmlrpc(self, request_text):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
556 """Handle a single XML-RPC request"""
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
557
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
558 response = self._marshaled_dispatch(request_text)
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 print 'Content-Type: text/xml'
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
561 print 'Content-Length: %d' % len(response)
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
562 print
28912
4ef108f8181f Patch #727805: Remove extra line ending from CGI responses.
Martin v. Löwis <martin@v.loewis.de>
parents: 27507
diff changeset
563 sys.stdout.write(response)
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
564
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
565 def handle_get(self):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
566 """Handle a single HTTP GET request.
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
567
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
568 Default implementation indicates an error because
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
569 XML-RPC uses the POST method.
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
570 """
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
571
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
572 code = 400
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
573 message, explain = \
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
574 BaseHTTPServer.BaseHTTPRequestHandler.responses[code]
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
575
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
576 response = BaseHTTPServer.DEFAULT_ERROR_MESSAGE % \
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
577 {
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
578 'code' : code,
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
579 'message' : message,
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
580 'explain' : explain
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
581 }
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
582 print 'Status: %d %s' % (code, message)
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
583 print 'Content-Type: text/html'
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
584 print 'Content-Length: %d' % len(response)
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
585 print
29655
f9b8d4bf08fb fix problems found by pychecker
Neal Norwitz <nnorwitz@gmail.com>
parents: 28912
diff changeset
586 sys.stdout.write(response)
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
587
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
588 def handle_request(self, request_text = None):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
589 """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
590
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
591 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
592 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
593 headers.
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
594 """
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
595
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
596 if request_text is None and \
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
597 os.environ.get('REQUEST_METHOD', None) == 'GET':
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
598 self.handle_get()
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
599 else:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
600 # POST data is normally available through stdin
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
601 if request_text is None:
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
602 request_text = sys.stdin.read()
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
603
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
604 self.handle_xmlrpc(request_text)
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
605
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
606 if __name__ == '__main__':
37886
c28f74bed83b Add explanatory message
Andrew M. Kuchling <amk@amk.ca>
parents: 37631
diff changeset
607 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
608 server = SimpleXMLRPCServer(("localhost", 8000))
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
609 server.register_function(pow)
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
610 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
611 server.serve_forever()