annotate Lib/SimpleXMLRPCServer.py @ 80661:94de77bd0b4b 2.7

Issue #16194: document imp.load_dynamic problems when read several extension modules from the same binary object file.
author Andrew Svetlov <andrew.svetlov@gmail.com>
date Thu, 29 Nov 2012 19:51:28 +0200
parents e3fcc1ce09ef
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
75431
e3fcc1ce09ef Use raw string for a docstring that uses a backslash
Éric Araujo <merwok@netwok.org>
parents: 75015
diff changeset
1 r"""Simple XML-RPC Server.
19937
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
54928
ffd7cf5c7285 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52897
diff changeset
109 import re
37631
399a9a72095f Bug #1469163: SimpleXMLRPCServer unconditionally attempted to import fcntl.
Anthony Baxter <anthonybaxter@gmail.com>
parents: 36121
diff changeset
110 try:
399a9a72095f Bug #1469163: SimpleXMLRPCServer unconditionally attempted to import fcntl.
Anthony Baxter <anthonybaxter@gmail.com>
parents: 36121
diff changeset
111 import fcntl
399a9a72095f Bug #1469163: SimpleXMLRPCServer unconditionally attempted to import fcntl.
Anthony Baxter <anthonybaxter@gmail.com>
parents: 36121
diff changeset
112 except ImportError:
399a9a72095f Bug #1469163: SimpleXMLRPCServer unconditionally attempted to import fcntl.
Anthony Baxter <anthonybaxter@gmail.com>
parents: 36121
diff changeset
113 fcntl = None
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
114
34528
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
115 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
116 """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
117
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
118 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
119 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
120
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
121 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
122 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
123 """
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
124
34528
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
125 if allow_dotted_names:
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
126 attrs = attr.split('.')
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
127 else:
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
128 attrs = [attr]
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
129
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
130 for i in attrs:
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
131 if i.startswith('_'):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
132 raise AttributeError(
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
133 'attempt to access private attribute "%s"' % i
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
134 )
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
135 else:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
136 obj = getattr(obj,i)
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
137 return obj
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
138
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
139 def list_public_methods(obj):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
140 """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
141 object, which represent callable attributes"""
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
142
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
143 return [member for member in dir(obj)
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
144 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
145 hasattr(getattr(obj, member), '__call__')]
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
146
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
147 def remove_duplicates(lst):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
148 """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
149
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
150 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
151 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
152 resulting list is not defined.
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
153 """
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
154 u = {}
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
155 for x in lst:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
156 u[x] = 1
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
157
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
158 return u.keys()
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
159
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
160 class SimpleXMLRPCDispatcher:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
161 """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
162
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
163 This class is used to register XML-RPC method handlers
55734
ae00a3a80473 Issue 6654
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55343
diff changeset
164 and then to dispatch them. This class doesn't need to be
ae00a3a80473 Issue 6654
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55343
diff changeset
165 instanced directly when used by SimpleXMLRPCServer but it
65653
ba1c73e16c8b Punctuation fix.
Georg Brandl <georg@python.org>
parents: 55734
diff changeset
166 can be instanced when used by the MultiPathXMLRPCServer.
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
167 """
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
168
52905
8237de632d6f Merged revisions 71268 via svnmerge from
Matthias Klose <doko@ubuntu.com>
parents: 52900
diff changeset
169 def __init__(self, allow_none=False, encoding=None):
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
170 self.funcs = {}
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
171 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
172 self.allow_none = allow_none
35982
03ae0b8eb6cb [Patch #1039083] Add 'encoding' parameter to SimpleXMLRPCServer
Andrew M. Kuchling <amk@amk.ca>
parents: 35981
diff changeset
173 self.encoding = encoding
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
174
34528
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
175 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
176 """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
177
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
178 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
179
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
180 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
181 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
182 its parameters as a tuple
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
183 e.g. instance._dispatch('add',(2,3))
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
184
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
185 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
186 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
187 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
188 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
189 SimpleXMLRPCServer.
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
190
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
191 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
192 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
193
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
194 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
195 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
196 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
197 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
198
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
199 *** SECURITY WARNING: ***
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
200
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
201 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
202 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
203 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
204 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
205
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
206 """
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
207
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
208 self.instance = instance
34528
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
209 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
210
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
211 def register_function(self, function, name = None):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
212 """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
213
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
214 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
215 for the function.
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
216 """
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
217
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
218 if name is None:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
219 name = function.__name__
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
220 self.funcs[name] = function
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
221
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
222 def register_introspection_functions(self):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
223 """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
224 namespace.
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
225
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
226 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
227 """
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
228
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
229 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
230 'system.methodSignature' : self.system_methodSignature,
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
231 'system.methodHelp' : self.system_methodHelp})
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
232
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
233 def register_multicall_functions(self):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
234 """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
235 namespace.
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
236
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
237 see http://www.xmlrpc.com/discuss/msgReader$1208"""
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 self.funcs.update({'system.multicall' : self.system_multicall})
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
240
55734
ae00a3a80473 Issue 6654
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55343
diff changeset
241 def _marshaled_dispatch(self, data, dispatch_method = None, path = None):
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
242 """Dispatches an XML-RPC method from marshalled (XML) data.
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
243
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
244 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
245 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
246 marshalled data. For backwards compatibility, a dispatch
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
247 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
248 SimpleXMLRPCRequestHandler.do_POST) but overriding the
68588
cd8d3c2d3bce #11565: Fix several typos. Patch by Piotr Kasprzyk.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 68256
diff changeset
249 existing method through subclassing is the preferred means
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
250 of changing method dispatch behavior.
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
251 """
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
252
38534
b1eb4a674998 Correctly dispatch Faults in loads (patch #1498627)
Georg Brandl <georg@python.org>
parents: 38526
diff changeset
253 try:
b1eb4a674998 Correctly dispatch Faults in loads (patch #1498627)
Georg Brandl <georg@python.org>
parents: 38526
diff changeset
254 params, method = xmlrpclib.loads(data)
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
255
38534
b1eb4a674998 Correctly dispatch Faults in loads (patch #1498627)
Georg Brandl <georg@python.org>
parents: 38526
diff changeset
256 # generate response
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
257 if dispatch_method is not None:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
258 response = dispatch_method(method, params)
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
259 else:
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
260 response = self._dispatch(method, params)
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
261 # wrap response in a singleton tuple
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
262 response = (response,)
36121
686306a67e9b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 35982
diff changeset
263 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
264 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
265 except Fault, fault:
36121
686306a67e9b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 35982
diff changeset
266 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
267 encoding=self.encoding)
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
268 except:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
269 # 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
270 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
271 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
272 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
273 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
274 )
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 return response
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
277
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
278 def system_listMethods(self):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
279 """system.listMethods() => ['add', 'subtract', 'multiple']
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
280
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
281 Returns a list of the methods supported by the server."""
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
282
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
283 methods = self.funcs.keys()
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
284 if self.instance is not None:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
285 # 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
286 # methods
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
287 if hasattr(self.instance, '_listMethods'):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
288 methods = remove_duplicates(
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
289 methods + self.instance._listMethods()
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
290 )
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
291 # 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
292 # 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
293 # of methods
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
294 elif not hasattr(self.instance, '_dispatch'):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
295 methods = remove_duplicates(
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
296 methods + list_public_methods(self.instance)
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
297 )
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
298 methods.sort()
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
299 return methods
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
300
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
301 def system_methodSignature(self, method_name):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
302 """system.methodSignature('add') => [double, int, int]
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
303
33670
89faacd9ec76 Fix a small typo in the docstring for system_methodSignature .
Brett Cannon <bcannon@gmail.com>
parents: 30838
diff changeset
304 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
305 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
306 and returns a double result.
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 This server does NOT support system.methodSignature."""
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
309
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
310 # See http://xmlrpc.usefulinc.com/doc/sysmethodsig.html
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
311
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
312 return 'signatures not supported'
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
313
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
314 def system_methodHelp(self, method_name):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
315 """system.methodHelp('add') => "Adds two integers together"
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
316
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
317 Returns a string containing documentation for the specified method."""
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
318
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
319 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
320 if method_name in self.funcs:
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
321 method = self.funcs[method_name]
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
322 elif self.instance is not None:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
323 # 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
324 if hasattr(self.instance, '_methodHelp'):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
325 return self.instance._methodHelp(method_name)
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
326 # 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
327 # 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
328 elif not hasattr(self.instance, '_dispatch'):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
329 try:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
330 method = resolve_dotted_attribute(
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
331 self.instance,
34528
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
332 method_name,
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
333 self.allow_dotted_names
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
334 )
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
335 except AttributeError:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
336 pass
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
337
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
338 # 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
339 # be a callable object of some kind
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
340 if method is None:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
341 return ""
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
342 else:
29655
f9b8d4bf08fb fix problems found by pychecker
Neal Norwitz <nnorwitz@gmail.com>
parents: 28912
diff changeset
343 import pydoc
29659
69619542a916 whitespace normalization
Neal Norwitz <nnorwitz@gmail.com>
parents: 29655
diff changeset
344 return pydoc.getdoc(method)
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
345
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
346 def system_multicall(self, call_list):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
347 """system.multicall([{'methodName': 'add', 'params': [2, 2]}, ...]) => \
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
348 [[4], ...]
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
349
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
350 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
351 request.
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 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
354 """
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
355
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
356 results = []
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
357 for call in call_list:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
358 method_name = call['methodName']
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
359 params = call['params']
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
360
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
361 try:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
362 # 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
363 # 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
364 results.append([self._dispatch(method_name, params)])
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
365 except Fault, fault:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
366 results.append(
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
367 {'faultCode' : fault.faultCode,
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
368 'faultString' : fault.faultString}
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
369 )
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
370 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
371 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
372 results.append(
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
373 {'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
374 '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
375 )
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
376 return results
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
377
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
378 def _dispatch(self, method, params):
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
379 """Dispatches the XML-RPC method.
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
380
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
381 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
382 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
383 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
384 if available.
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
385
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
386 If the registered instance has a _dispatch method then that
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
387 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
388 its parameters as a tuple
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
389 e.g. instance._dispatch('add',(2,3))
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
390
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
391 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
392 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
393 and, if found, will be called.
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
394
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
395 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
396 not be called.
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
397 """
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
398
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
399 func = None
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
400 try:
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
401 # 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
402 func = self.funcs[method]
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
403 except KeyError:
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
404 if self.instance is not None:
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
405 # check for a _dispatch method
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
406 if hasattr(self.instance, '_dispatch'):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
407 return self.instance._dispatch(method, params)
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
408 else:
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
409 # call instance method directly
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
410 try:
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
411 func = resolve_dotted_attribute(
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
412 self.instance,
34528
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
413 method,
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
414 self.allow_dotted_names
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
415 )
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
416 except AttributeError:
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
417 pass
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
418
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
419 if func is not None:
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
420 return func(*params)
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
421 else:
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
422 raise Exception('method "%s" is not supported' % method)
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
423
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
424 class SimpleXMLRPCRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
425 """Simple XML-RPC request handler class.
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
426
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
427 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
428 XML-RPC requests.
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
429 """
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
430
38526
f831e8bc6bd3 [Bug #1473048]
Andrew M. Kuchling <amk@amk.ca>
parents: 37886
diff changeset
431 # Class attribute listing the accessible path components;
f831e8bc6bd3 [Bug #1473048]
Andrew M. Kuchling <amk@amk.ca>
parents: 37886
diff changeset
432 # paths not on this list will result in a 404 error.
f831e8bc6bd3 [Bug #1473048]
Andrew M. Kuchling <amk@amk.ca>
parents: 37886
diff changeset
433 rpc_paths = ('/', '/RPC2')
f831e8bc6bd3 [Bug #1473048]
Andrew M. Kuchling <amk@amk.ca>
parents: 37886
diff changeset
434
54928
ffd7cf5c7285 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52897
diff changeset
435 #if not None, encode responses larger than this, if possible
ffd7cf5c7285 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52897
diff changeset
436 encode_threshold = 1400 #a common MTU
ffd7cf5c7285 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52897
diff changeset
437
ffd7cf5c7285 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52897
diff changeset
438 #Override form StreamRequestHandler: full buffering of output
ffd7cf5c7285 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52897
diff changeset
439 #and no Nagle.
ffd7cf5c7285 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52897
diff changeset
440 wbufsize = -1
ffd7cf5c7285 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52897
diff changeset
441 disable_nagle_algorithm = True
ffd7cf5c7285 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52897
diff changeset
442
ffd7cf5c7285 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52897
diff changeset
443 # a re to match a gzip Accept-Encoding
ffd7cf5c7285 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52897
diff changeset
444 aepattern = re.compile(r"""
ffd7cf5c7285 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52897
diff changeset
445 \s* ([^\s;]+) \s* #content-coding
ffd7cf5c7285 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52897
diff changeset
446 (;\s* q \s*=\s* ([0-9\.]+))? #q
ffd7cf5c7285 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52897
diff changeset
447 """, re.VERBOSE | re.IGNORECASE)
ffd7cf5c7285 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52897
diff changeset
448
ffd7cf5c7285 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52897
diff changeset
449 def accept_encodings(self):
ffd7cf5c7285 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52897
diff changeset
450 r = {}
ffd7cf5c7285 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52897
diff changeset
451 ae = self.headers.get("Accept-Encoding", "")
ffd7cf5c7285 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52897
diff changeset
452 for e in ae.split(","):
ffd7cf5c7285 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52897
diff changeset
453 match = self.aepattern.match(e)
ffd7cf5c7285 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52897
diff changeset
454 if match:
ffd7cf5c7285 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52897
diff changeset
455 v = match.group(3)
ffd7cf5c7285 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52897
diff changeset
456 v = float(v) if v else 1.0
ffd7cf5c7285 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52897
diff changeset
457 r[match.group(1)] = v
ffd7cf5c7285 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52897
diff changeset
458 return r
ffd7cf5c7285 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52897
diff changeset
459
38526
f831e8bc6bd3 [Bug #1473048]
Andrew M. Kuchling <amk@amk.ca>
parents: 37886
diff changeset
460 def is_rpc_path_valid(self):
f831e8bc6bd3 [Bug #1473048]
Andrew M. Kuchling <amk@amk.ca>
parents: 37886
diff changeset
461 if self.rpc_paths:
f831e8bc6bd3 [Bug #1473048]
Andrew M. Kuchling <amk@amk.ca>
parents: 37886
diff changeset
462 return self.path in self.rpc_paths
f831e8bc6bd3 [Bug #1473048]
Andrew M. Kuchling <amk@amk.ca>
parents: 37886
diff changeset
463 else:
f831e8bc6bd3 [Bug #1473048]
Andrew M. Kuchling <amk@amk.ca>
parents: 37886
diff changeset
464 # If .rpc_paths is empty, just assume all paths are legal
f831e8bc6bd3 [Bug #1473048]
Andrew M. Kuchling <amk@amk.ca>
parents: 37886
diff changeset
465 return True
f831e8bc6bd3 [Bug #1473048]
Andrew M. Kuchling <amk@amk.ca>
parents: 37886
diff changeset
466
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
467 def do_POST(self):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
468 """Handles the HTTP POST request.
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
469
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
470 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
471 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
472 """
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
473
38526
f831e8bc6bd3 [Bug #1473048]
Andrew M. Kuchling <amk@amk.ca>
parents: 37886
diff changeset
474 # Check that the path is legal
f831e8bc6bd3 [Bug #1473048]
Andrew M. Kuchling <amk@amk.ca>
parents: 37886
diff changeset
475 if not self.is_rpc_path_valid():
f831e8bc6bd3 [Bug #1473048]
Andrew M. Kuchling <amk@amk.ca>
parents: 37886
diff changeset
476 self.report_404()
f831e8bc6bd3 [Bug #1473048]
Andrew M. Kuchling <amk@amk.ca>
parents: 37886
diff changeset
477 return
38537
995ecd231f7c Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 38534
diff changeset
478
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
479 try:
36121
686306a67e9b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 35982
diff changeset
480 # Get arguments by reading body of request.
686306a67e9b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 35982
diff changeset
481 # 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
482 # 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
483 # 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
484 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
485 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
486 L = []
191b59909ded [Bug #792570] Under Windows, socket.read() seems to run into trouble when
Andrew M. Kuchling <amk@amk.ca>
parents: 35976
diff changeset
487 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
488 chunk_size = min(size_remaining, max_chunk_size)
75014
24244a744d01 Issue #14001: CVE-2012-0845: xmlrpc: Fix an endless loop in SimpleXMLRPCServer
Charles-François Natali <neologix@free.fr>
parents: 52905
diff changeset
489 chunk = self.rfile.read(chunk_size)
24244a744d01 Issue #14001: CVE-2012-0845: xmlrpc: Fix an endless loop in SimpleXMLRPCServer
Charles-François Natali <neologix@free.fr>
parents: 52905
diff changeset
490 if not chunk:
24244a744d01 Issue #14001: CVE-2012-0845: xmlrpc: Fix an endless loop in SimpleXMLRPCServer
Charles-François Natali <neologix@free.fr>
parents: 52905
diff changeset
491 break
24244a744d01 Issue #14001: CVE-2012-0845: xmlrpc: Fix an endless loop in SimpleXMLRPCServer
Charles-François Natali <neologix@free.fr>
parents: 52905
diff changeset
492 L.append(chunk)
35977
191b59909ded [Bug #792570] Under Windows, socket.read() seems to run into trouble when
Andrew M. Kuchling <amk@amk.ca>
parents: 35976
diff changeset
493 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
494 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
495
54928
ffd7cf5c7285 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52897
diff changeset
496 data = self.decode_request_content(data)
ffd7cf5c7285 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52897
diff changeset
497 if data is None:
ffd7cf5c7285 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52897
diff changeset
498 return #response has been sent
ffd7cf5c7285 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52897
diff changeset
499
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
500 # In previous versions of SimpleXMLRPCServer, _dispatch
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
501 # 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
502 # SimpleXMLRPCDispatcher. To maintain backwards compatibility,
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
503 # 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
504 # using that method if present.
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
505 response = self.server._marshaled_dispatch(
55734
ae00a3a80473 Issue 6654
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55343
diff changeset
506 data, getattr(self, '_dispatch', None), self.path
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
507 )
42658
bc31dfcf7dfa Added a flag (_send_traceback_header) to the SimpleXMLRPCServer class
Facundo Batista <facundobatista@gmail.com>
parents: 41106
diff changeset
508 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
509 # internal error, report as HTTP server error
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
510 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
511
bc31dfcf7dfa Added a flag (_send_traceback_header) to the SimpleXMLRPCServer class
Facundo Batista <facundobatista@gmail.com>
parents: 41106
diff changeset
512 # 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
513 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
514 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
515 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
516 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
517
54928
ffd7cf5c7285 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52897
diff changeset
518 self.send_header("Content-length", "0")
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
519 self.end_headers()
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
520 else:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
521 # got a valid XML RPC response
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
522 self.send_response(200)
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
523 self.send_header("Content-type", "text/xml")
54928
ffd7cf5c7285 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52897
diff changeset
524 if self.encode_threshold is not None:
ffd7cf5c7285 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52897
diff changeset
525 if len(response) > self.encode_threshold:
ffd7cf5c7285 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52897
diff changeset
526 q = self.accept_encodings().get("gzip", 0)
ffd7cf5c7285 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52897
diff changeset
527 if q:
55343
3a613e00f66d http://bugs.python.org/issue6499
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 54928
diff changeset
528 try:
3a613e00f66d http://bugs.python.org/issue6499
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 54928
diff changeset
529 response = xmlrpclib.gzip_encode(response)
3a613e00f66d http://bugs.python.org/issue6499
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 54928
diff changeset
530 self.send_header("Content-Encoding", "gzip")
3a613e00f66d http://bugs.python.org/issue6499
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 54928
diff changeset
531 except NotImplementedError:
3a613e00f66d http://bugs.python.org/issue6499
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 54928
diff changeset
532 pass
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
533 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
534 self.end_headers()
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
535 self.wfile.write(response)
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
536
54928
ffd7cf5c7285 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52897
diff changeset
537 def decode_request_content(self, data):
ffd7cf5c7285 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52897
diff changeset
538 #support gzip encoding of request
ffd7cf5c7285 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52897
diff changeset
539 encoding = self.headers.get("content-encoding", "identity").lower()
ffd7cf5c7285 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52897
diff changeset
540 if encoding == "identity":
ffd7cf5c7285 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52897
diff changeset
541 return data
ffd7cf5c7285 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52897
diff changeset
542 if encoding == "gzip":
ffd7cf5c7285 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52897
diff changeset
543 try:
ffd7cf5c7285 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52897
diff changeset
544 return xmlrpclib.gzip_decode(data)
55343
3a613e00f66d http://bugs.python.org/issue6499
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 54928
diff changeset
545 except NotImplementedError:
3a613e00f66d http://bugs.python.org/issue6499
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 54928
diff changeset
546 self.send_response(501, "encoding %r not supported" % encoding)
54928
ffd7cf5c7285 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52897
diff changeset
547 except ValueError:
ffd7cf5c7285 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52897
diff changeset
548 self.send_response(400, "error decoding gzip content")
ffd7cf5c7285 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52897
diff changeset
549 else:
ffd7cf5c7285 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52897
diff changeset
550 self.send_response(501, "encoding %r not supported" % encoding)
ffd7cf5c7285 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52897
diff changeset
551 self.send_header("Content-length", "0")
ffd7cf5c7285 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52897
diff changeset
552 self.end_headers()
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
553
38526
f831e8bc6bd3 [Bug #1473048]
Andrew M. Kuchling <amk@amk.ca>
parents: 37886
diff changeset
554 def report_404 (self):
f831e8bc6bd3 [Bug #1473048]
Andrew M. Kuchling <amk@amk.ca>
parents: 37886
diff changeset
555 # Report a 404 error
38537
995ecd231f7c Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 38534
diff changeset
556 self.send_response(404)
995ecd231f7c Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 38534
diff changeset
557 response = 'No such page'
995ecd231f7c Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 38534
diff changeset
558 self.send_header("Content-type", "text/plain")
995ecd231f7c Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 38534
diff changeset
559 self.send_header("Content-length", str(len(response)))
995ecd231f7c Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 38534
diff changeset
560 self.end_headers()
995ecd231f7c Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 38534
diff changeset
561 self.wfile.write(response)
38526
f831e8bc6bd3 [Bug #1473048]
Andrew M. Kuchling <amk@amk.ca>
parents: 37886
diff changeset
562
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
563 def log_request(self, code='-', size='-'):
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
564 """Selectively log an accepted request."""
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
565
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
566 if self.server.logRequests:
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
567 BaseHTTPServer.BaseHTTPRequestHandler.log_request(self, code, size)
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
568
47241
ba1fa511b72d socketserver renaming reversal part 3: move the module into the right
Georg Brandl <georg@python.org>
parents: 46929
diff changeset
569 class SimpleXMLRPCServer(SocketServer.TCPServer,
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
570 SimpleXMLRPCDispatcher):
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
571 """Simple XML-RPC server.
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
572
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
573 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
574 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
575 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
576 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
577 from SimpleXMLRPCDispatcher to change this behavior.
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
578 """
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
579
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
580 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
581
42658
bc31dfcf7dfa Added a flag (_send_traceback_header) to the SimpleXMLRPCServer class
Facundo Batista <facundobatista@gmail.com>
parents: 41106
diff changeset
582 # 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
583 # 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
584 # 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
585 # SimpleXMLRPCRequestHandler.do_POST
bc31dfcf7dfa Added a flag (_send_traceback_header) to the SimpleXMLRPCServer class
Facundo Batista <facundobatista@gmail.com>
parents: 41106
diff changeset
586 _send_traceback_header = False
bc31dfcf7dfa Added a flag (_send_traceback_header) to the SimpleXMLRPCServer class
Facundo Batista <facundobatista@gmail.com>
parents: 41106
diff changeset
587
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
588 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
589 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
590 self.logRequests = logRequests
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
591
35982
03ae0b8eb6cb [Patch #1039083] Add 'encoding' parameter to SimpleXMLRPCServer
Andrew M. Kuchling <amk@amk.ca>
parents: 35981
diff changeset
592 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
593 SocketServer.TCPServer.__init__(self, addr, requestHandler, bind_and_activate)
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
594
36121
686306a67e9b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 35982
diff changeset
595 # [Bug #1222790] If possible, set close-on-exec flag; if a
686306a67e9b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 35982
diff changeset
596 # 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
597 # the listening socket open.
37631
399a9a72095f Bug #1469163: SimpleXMLRPCServer unconditionally attempted to import fcntl.
Anthony Baxter <anthonybaxter@gmail.com>
parents: 36121
diff changeset
598 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
599 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
600 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
601 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
602
55734
ae00a3a80473 Issue 6654
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55343
diff changeset
603 class MultiPathXMLRPCServer(SimpleXMLRPCServer):
ae00a3a80473 Issue 6654
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55343
diff changeset
604 """Multipath XML-RPC Server
ae00a3a80473 Issue 6654
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55343
diff changeset
605 This specialization of SimpleXMLRPCServer allows the user to create
ae00a3a80473 Issue 6654
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55343
diff changeset
606 multiple Dispatcher instances and assign them to different
ae00a3a80473 Issue 6654
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55343
diff changeset
607 HTTP request paths. This makes it possible to run two or more
ae00a3a80473 Issue 6654
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55343
diff changeset
608 'virtual XML-RPC servers' at the same port.
ae00a3a80473 Issue 6654
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55343
diff changeset
609 Make sure that the requestHandler accepts the paths in question.
ae00a3a80473 Issue 6654
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55343
diff changeset
610 """
ae00a3a80473 Issue 6654
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55343
diff changeset
611 def __init__(self, addr, requestHandler=SimpleXMLRPCRequestHandler,
ae00a3a80473 Issue 6654
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55343
diff changeset
612 logRequests=True, allow_none=False, encoding=None, bind_and_activate=True):
ae00a3a80473 Issue 6654
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55343
diff changeset
613
ae00a3a80473 Issue 6654
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55343
diff changeset
614 SimpleXMLRPCServer.__init__(self, addr, requestHandler, logRequests, allow_none,
ae00a3a80473 Issue 6654
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55343
diff changeset
615 encoding, bind_and_activate)
ae00a3a80473 Issue 6654
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55343
diff changeset
616 self.dispatchers = {}
ae00a3a80473 Issue 6654
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55343
diff changeset
617 self.allow_none = allow_none
ae00a3a80473 Issue 6654
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55343
diff changeset
618 self.encoding = encoding
ae00a3a80473 Issue 6654
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55343
diff changeset
619
ae00a3a80473 Issue 6654
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55343
diff changeset
620 def add_dispatcher(self, path, dispatcher):
ae00a3a80473 Issue 6654
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55343
diff changeset
621 self.dispatchers[path] = dispatcher
ae00a3a80473 Issue 6654
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55343
diff changeset
622 return dispatcher
ae00a3a80473 Issue 6654
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55343
diff changeset
623
ae00a3a80473 Issue 6654
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55343
diff changeset
624 def get_dispatcher(self, path):
ae00a3a80473 Issue 6654
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55343
diff changeset
625 return self.dispatchers[path]
ae00a3a80473 Issue 6654
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55343
diff changeset
626
ae00a3a80473 Issue 6654
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55343
diff changeset
627 def _marshaled_dispatch(self, data, dispatch_method = None, path = None):
ae00a3a80473 Issue 6654
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55343
diff changeset
628 try:
ae00a3a80473 Issue 6654
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55343
diff changeset
629 response = self.dispatchers[path]._marshaled_dispatch(
ae00a3a80473 Issue 6654
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55343
diff changeset
630 data, dispatch_method, path)
ae00a3a80473 Issue 6654
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55343
diff changeset
631 except:
ae00a3a80473 Issue 6654
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55343
diff changeset
632 # report low level exception back to server
ae00a3a80473 Issue 6654
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55343
diff changeset
633 # (each dispatcher should have handled their own
ae00a3a80473 Issue 6654
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55343
diff changeset
634 # exceptions)
ae00a3a80473 Issue 6654
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55343
diff changeset
635 exc_type, exc_value = sys.exc_info()[:2]
ae00a3a80473 Issue 6654
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55343
diff changeset
636 response = xmlrpclib.dumps(
ae00a3a80473 Issue 6654
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55343
diff changeset
637 xmlrpclib.Fault(1, "%s:%s" % (exc_type, exc_value)),
ae00a3a80473 Issue 6654
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55343
diff changeset
638 encoding=self.encoding, allow_none=self.allow_none)
ae00a3a80473 Issue 6654
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55343
diff changeset
639 return response
ae00a3a80473 Issue 6654
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55343
diff changeset
640
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
641 class CGIXMLRPCRequestHandler(SimpleXMLRPCDispatcher):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
642 """Simple handler for XML-RPC data passed through CGI."""
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
643
35982
03ae0b8eb6cb [Patch #1039083] Add 'encoding' parameter to SimpleXMLRPCServer
Andrew M. Kuchling <amk@amk.ca>
parents: 35981
diff changeset
644 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
645 SimpleXMLRPCDispatcher.__init__(self, allow_none, encoding)
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
646
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
647 def handle_xmlrpc(self, request_text):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
648 """Handle a single XML-RPC request"""
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
649
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
650 response = self._marshaled_dispatch(request_text)
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
651
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
652 print 'Content-Type: text/xml'
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
653 print 'Content-Length: %d' % len(response)
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
654 print
28912
4ef108f8181f Patch #727805: Remove extra line ending from CGI responses.
Martin v. Löwis <martin@v.loewis.de>
parents: 27507
diff changeset
655 sys.stdout.write(response)
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
656
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
657 def handle_get(self):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
658 """Handle a single HTTP GET request.
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
659
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
660 Default implementation indicates an error because
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
661 XML-RPC uses the POST method.
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
662 """
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
663
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
664 code = 400
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
665 message, explain = \
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
666 BaseHTTPServer.BaseHTTPRequestHandler.responses[code]
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
667
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
668 response = BaseHTTPServer.DEFAULT_ERROR_MESSAGE % \
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
669 {
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
670 'code' : code,
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
671 'message' : message,
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
672 'explain' : explain
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
673 }
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
674 print 'Status: %d %s' % (code, message)
52671
42da7154b270 Fix for issue5040. Adding test for Content-Length
Senthil Kumaran <orsenthil@gmail.com>
parents: 52647
diff changeset
675 print 'Content-Type: %s' % BaseHTTPServer.DEFAULT_ERROR_CONTENT_TYPE
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
676 print 'Content-Length: %d' % len(response)
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
677 print
29655
f9b8d4bf08fb fix problems found by pychecker
Neal Norwitz <nnorwitz@gmail.com>
parents: 28912
diff changeset
678 sys.stdout.write(response)
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
679
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
680 def handle_request(self, request_text = None):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
681 """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
682
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
683 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
684 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
685 headers.
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
686 """
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
687
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
688 if request_text is None and \
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
689 os.environ.get('REQUEST_METHOD', None) == 'GET':
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
690 self.handle_get()
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
691 else:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
692 # POST data is normally available through stdin
52900
4acbbb3e65e2 Merged revisions 70866-70868,70870-70871,70893,70896,70902,70905,70907,70912,70915,70927,70933,70940,70944,70954,70963,70998,71056 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48147
diff changeset
693 try:
4acbbb3e65e2 Merged revisions 70866-70868,70870-70871,70893,70896,70902,70905,70907,70912,70915,70927,70933,70940,70944,70954,70963,70998,71056 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48147
diff changeset
694 length = int(os.environ.get('CONTENT_LENGTH', None))
4acbbb3e65e2 Merged revisions 70866-70868,70870-70871,70893,70896,70902,70905,70907,70912,70915,70927,70933,70940,70944,70954,70963,70998,71056 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48147
diff changeset
695 except (TypeError, ValueError):
4acbbb3e65e2 Merged revisions 70866-70868,70870-70871,70893,70896,70902,70905,70907,70912,70915,70927,70933,70940,70944,70954,70963,70998,71056 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48147
diff changeset
696 length = -1
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
697 if request_text is None:
52900
4acbbb3e65e2 Merged revisions 70866-70868,70870-70871,70893,70896,70902,70905,70907,70912,70915,70927,70933,70940,70944,70954,70963,70998,71056 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48147
diff changeset
698 request_text = sys.stdin.read(length)
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
699
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
700 self.handle_xmlrpc(request_text)
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
701
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
702 if __name__ == '__main__':
37886
c28f74bed83b Add explanatory message
Andrew M. Kuchling <amk@amk.ca>
parents: 37631
diff changeset
703 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
704 server = SimpleXMLRPCServer(("localhost", 8000))
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
705 server.register_function(pow)
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
706 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
707 server.serve_forever()