annotate Lib/xmlrpc/server.py @ 87690:66c1c9f32567 default tip

Add use_weakref option to functools.lru_cache The use_weakref option makes lru_cache create weak references to the function arguments when creating the cache key, which prevents them from staying in the memory forever even after all other references to them are gone. This is a proof of concept for http://bugs.python.org/issue19859
author Radomir Dopieralski <devel@sheep.art.pl>
date Tue, 03 Dec 2013 16:02:48 +0100
parents ef889c3d5dc6
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
75422
8ce8006dfc42 Use raw string for a docstring that uses a backslash
Éric Araujo <merwok@netwok.org>
parents: 75017
diff changeset
1 r"""XML-RPC Servers.
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
47288
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
11 The Doc* classes can be used to create XML-RPC servers that
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
12 serve pydoc-style documentation in response to HTTP
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
13 GET requests. This documentation is dynamically generated
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
14 based on the functions and methods registered with the
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
15 server.
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
16
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
17 A list of possible usage patterns follows:
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
18
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
19 1. Install functions:
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
20
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
21 server = SimpleXMLRPCServer(("localhost", 8000))
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
22 server.register_function(pow)
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
23 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
24 server.serve_forever()
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
25
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
26 2. Install an instance:
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
27
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
28 class MyFuncs:
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
29 def __init__(self):
41480
99027c2b3fd2 Remove functions in string module that are also string methods. Also remove:
Neal Norwitz <nnorwitz@gmail.com>
parents: 40775
diff changeset
30 # make all of the sys functions available through sys.func_name
99027c2b3fd2 Remove functions in string module that are also string methods. Also remove:
Neal Norwitz <nnorwitz@gmail.com>
parents: 40775
diff changeset
31 import sys
99027c2b3fd2 Remove functions in string module that are also string methods. Also remove:
Neal Norwitz <nnorwitz@gmail.com>
parents: 40775
diff changeset
32 self.sys = sys
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
33 def _listMethods(self):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
34 # implement this method so that system.listMethods
41480
99027c2b3fd2 Remove functions in string module that are also string methods. Also remove:
Neal Norwitz <nnorwitz@gmail.com>
parents: 40775
diff changeset
35 # knows to advertise the sys methods
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
36 return list_public_methods(self) + \
41480
99027c2b3fd2 Remove functions in string module that are also string methods. Also remove:
Neal Norwitz <nnorwitz@gmail.com>
parents: 40775
diff changeset
37 ['sys.' + method for method in list_public_methods(self.sys)]
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
38 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
39 def add(self, x, y) : return x + y
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
40
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
41 server = SimpleXMLRPCServer(("localhost", 8000))
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
42 server.register_introspection_functions()
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
43 server.register_instance(MyFuncs())
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
44 server.serve_forever()
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
45
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
46 3. Install an instance with custom dispatch method:
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
47
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
48 class Math:
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
49 def _listMethods(self):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
50 # 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
51 # to work
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
52 return ['add', 'pow']
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
53 def _methodHelp(self, method):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
54 # 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
55 # to work
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
56 if method == 'add':
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
57 return "add(2,3) => 5"
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
58 elif method == 'pow':
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
59 return "pow(x, y[, z]) => number"
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
60 else:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
61 # By convention, return empty
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
62 # string if no help is available
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
63 return ""
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
64 def _dispatch(self, method, params):
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
65 if method == 'pow':
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
66 return pow(*params)
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
67 elif method == 'add':
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
68 return params[0] + params[1]
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
69 else:
65834
41d5d3d7da21 Merged revisions 86051 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 60630
diff changeset
70 raise ValueError('bad method')
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
71
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
72 server = SimpleXMLRPCServer(("localhost", 8000))
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
73 server.register_introspection_functions()
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
74 server.register_instance(Math())
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
75 server.serve_forever()
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
76
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
77 4. Subclass SimpleXMLRPCServer:
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
78
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
79 class MathServer(SimpleXMLRPCServer):
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
80 def _dispatch(self, method, params):
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
81 try:
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
82 # 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
83 # callable through XML-RPC to prevent potential security
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
84 # problems
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
85 func = getattr(self, 'export_' + method)
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
86 except AttributeError:
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
87 raise Exception('method "%s" is not supported' % method)
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
88 else:
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
89 return func(*params)
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
90
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
91 def export_add(self, x, y):
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
92 return x + y
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
93
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
94 server = MathServer(("localhost", 8000))
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
95 server.serve_forever()
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
96
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
97 5. CGI script:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
98
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
99 server = CGIXMLRPCRequestHandler()
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
100 server.register_function(pow)
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
101 server.handle_request()
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
102 """
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
103
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
104 # Written by Brian Quinlan (brian@sweetapp.com).
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
105 # Based on code written by Fredrik Lundh.
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
106
55028
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
107 from xmlrpc.client import Fault, dumps, loads, gzip_encode, gzip_decode
47318
e1fcc3881cb6 Create http package. #2883.
Georg Brandl <georg@python.org>
parents: 47288
diff changeset
108 from http.server import BaseHTTPRequestHandler
e1fcc3881cb6 Create http package. #2883.
Georg Brandl <georg@python.org>
parents: 47288
diff changeset
109 import http.server
46933
aca5c1d1c569 Renamed the SocketServer module to 'socketserver'.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 44234
diff changeset
110 import socketserver
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
111 import sys
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 37042
diff changeset
112 import os
47288
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
113 import re
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
114 import pydoc
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
115 import inspect
42678
af6a7190cabc Merged revisions 57152-57220 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42670
diff changeset
116 import traceback
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 37042
diff changeset
117 try:
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 37042
diff changeset
118 import fcntl
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 37042
diff changeset
119 except ImportError:
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 37042
diff changeset
120 fcntl = None
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
121
34528
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
122 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
123 """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
124
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
125 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
126 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
127
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
128 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
129 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
130 """
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
131
34528
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
132 if allow_dotted_names:
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
133 attrs = attr.split('.')
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
134 else:
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
135 attrs = [attr]
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
136
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
137 for i in attrs:
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
138 if i.startswith('_'):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
139 raise AttributeError(
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
140 'attempt to access private attribute "%s"' % i
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
141 )
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
142 else:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
143 obj = getattr(obj,i)
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
144 return obj
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
145
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
146 def list_public_methods(obj):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
147 """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
148 object, which represent callable attributes"""
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 return [member for member in dir(obj)
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
151 if not member.startswith('_') and
73165
8e57b5d8f58f Closes #13258: Use callable() built-in in the standard library.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 68586
diff changeset
152 callable(getattr(obj, member))]
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
153
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
154 class SimpleXMLRPCDispatcher:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
155 """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
156
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
157 This class is used to register XML-RPC method handlers
57751
7eb050c0e654 Merged revisions 74558 via svnmerge from
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55997
diff changeset
158 and then to dispatch them. This class doesn't need to be
7eb050c0e654 Merged revisions 74558 via svnmerge from
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55997
diff changeset
159 instanced directly when used by SimpleXMLRPCServer but it
7eb050c0e654 Merged revisions 74558 via svnmerge from
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55997
diff changeset
160 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
161 """
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
162
73907
b3c1a504ebc1 Closes #2979: add parameter 'use_builtin_types' to the SimpleXMLRPCServer.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 73219
diff changeset
163 def __init__(self, allow_none=False, encoding=None,
b3c1a504ebc1 Closes #2979: add parameter 'use_builtin_types' to the SimpleXMLRPCServer.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 73219
diff changeset
164 use_builtin_types=False):
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
165 self.funcs = {}
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
166 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
167 self.allow_none = allow_none
52668
cef8b8259ac9 Fix for issue5040. Adding support for unicode message passing and tests for unicode message and test for Content-Length.
Senthil Kumaran <orsenthil@gmail.com>
parents: 52648
diff changeset
168 self.encoding = encoding or 'utf-8'
73907
b3c1a504ebc1 Closes #2979: add parameter 'use_builtin_types' to the SimpleXMLRPCServer.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 73219
diff changeset
169 self.use_builtin_types = use_builtin_types
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
170
34528
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
171 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
172 """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
173
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
174 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
175
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
176 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
177 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
178 its parameters as a tuple
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
179 e.g. instance._dispatch('add',(2,3))
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
180
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
181 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
182 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
183 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
184 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
185 SimpleXMLRPCServer.
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
186
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
187 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
188 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
189
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
190 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
191 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
192 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
193 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
194
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
195 *** SECURITY WARNING: ***
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
196
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
197 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
198 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
199 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
200 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
201
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
202 """
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
203
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
204 self.instance = instance
34528
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
205 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
206
56002
fa91270b6087 Merged revisions 74821,74828-74831,74833,74835 via svnmerge from
Georg Brandl <georg@python.org>
parents: 52950
diff changeset
207 def register_function(self, function, name=None):
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
208 """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
209
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
210 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
211 for the function.
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
212 """
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
213
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
214 if name is None:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
215 name = function.__name__
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
216 self.funcs[name] = function
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
217
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
218 def register_introspection_functions(self):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
219 """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
220 namespace.
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 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
223 """
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
224
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
225 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
226 'system.methodSignature' : self.system_methodSignature,
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
227 'system.methodHelp' : self.system_methodHelp})
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
228
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
229 def register_multicall_functions(self):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
230 """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
231 namespace.
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 see http://www.xmlrpc.com/discuss/msgReader$1208"""
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
234
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
235 self.funcs.update({'system.multicall' : self.system_multicall})
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
236
57751
7eb050c0e654 Merged revisions 74558 via svnmerge from
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55997
diff changeset
237 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
238 """Dispatches an XML-RPC method from marshalled (XML) data.
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
239
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
240 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
241 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
242 marshalled data. For backwards compatibility, a dispatch
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
243 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
244 SimpleXMLRPCRequestHandler.do_POST) but overriding the
68585
bf94b6a73fc8 #11565: Fix several typos. Patch by Piotr Kasprzyk.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65834
diff changeset
245 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
246 of changing method dispatch behavior.
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
247 """
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
248
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 37904
diff changeset
249 try:
73907
b3c1a504ebc1 Closes #2979: add parameter 'use_builtin_types' to the SimpleXMLRPCServer.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 73219
diff changeset
250 params, method = loads(data, use_builtin_types=self.use_builtin_types)
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
251
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 37904
diff changeset
252 # generate response
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
253 if dispatch_method is not None:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
254 response = dispatch_method(method, params)
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
255 else:
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
256 response = self._dispatch(method, params)
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
257 # wrap response in a singleton tuple
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
258 response = (response,)
47288
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
259 response = dumps(response, methodresponse=1,
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
260 allow_none=self.allow_none, encoding=self.encoding)
40587
6b18a095c2e7 SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents: 40450
diff changeset
261 except Fault as fault:
47288
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
262 response = dumps(fault, allow_none=self.allow_none,
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
263 encoding=self.encoding)
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
264 except:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
265 # report exception back to server
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39575
diff changeset
266 exc_type, exc_value, exc_tb = sys.exc_info()
47288
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
267 response = dumps(
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
268 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
269 encoding=self.encoding, allow_none=self.allow_none,
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
270 )
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
271
52668
cef8b8259ac9 Fix for issue5040. Adding support for unicode message passing and tests for unicode message and test for Content-Length.
Senthil Kumaran <orsenthil@gmail.com>
parents: 52648
diff changeset
272 return response.encode(self.encoding)
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
273
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
274 def system_listMethods(self):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
275 """system.listMethods() => ['add', 'subtract', 'multiple']
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
276
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
277 Returns a list of the methods supported by the server."""
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
278
42670
7e5eff87d664 Fix xmlrpc unittest. While it now passes on Linux, it still fails
Hye-Shik Chang <hyeshik@gmail.com>
parents: 41824
diff changeset
279 methods = set(self.funcs.keys())
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
280 if self.instance is not None:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
281 # Instance can implement _listMethod to return a list of
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
282 # methods
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
283 if hasattr(self.instance, '_listMethods'):
42670
7e5eff87d664 Fix xmlrpc unittest. While it now passes on Linux, it still fails
Hye-Shik Chang <hyeshik@gmail.com>
parents: 41824
diff changeset
284 methods |= set(self.instance._listMethods())
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
285 # 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
286 # 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
287 # of methods
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
288 elif not hasattr(self.instance, '_dispatch'):
42670
7e5eff87d664 Fix xmlrpc unittest. While it now passes on Linux, it still fails
Hye-Shik Chang <hyeshik@gmail.com>
parents: 41824
diff changeset
289 methods |= set(list_public_methods(self.instance))
7e5eff87d664 Fix xmlrpc unittest. While it now passes on Linux, it still fails
Hye-Shik Chang <hyeshik@gmail.com>
parents: 41824
diff changeset
290 return sorted(methods)
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
291
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
292 def system_methodSignature(self, method_name):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
293 """system.methodSignature('add') => [double, int, int]
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
294
33670
89faacd9ec76 Fix a small typo in the docstring for system_methodSignature .
Brett Cannon <bcannon@gmail.com>
parents: 30838
diff changeset
295 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
296 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
297 and returns a double result.
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
298
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
299 This server does NOT support system.methodSignature."""
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
300
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
301 # See http://xmlrpc.usefulinc.com/doc/sysmethodsig.html
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
302
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
303 return 'signatures not supported'
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
304
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
305 def system_methodHelp(self, method_name):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
306 """system.methodHelp('add') => "Adds two integers together"
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 Returns a string containing documentation for the specified method."""
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
309
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
310 method = None
39575
63237fcefd99 Get rid of dict.has_key(). Boy this has a lot of repercussions!
Guido van Rossum <guido@python.org>
parents: 38669
diff changeset
311 if method_name in self.funcs:
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
312 method = self.funcs[method_name]
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
313 elif self.instance is not None:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
314 # 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
315 if hasattr(self.instance, '_methodHelp'):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
316 return self.instance._methodHelp(method_name)
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
317 # 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
318 # 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
319 elif not hasattr(self.instance, '_dispatch'):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
320 try:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
321 method = resolve_dotted_attribute(
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
322 self.instance,
34528
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
323 method_name,
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
324 self.allow_dotted_names
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
325 )
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
326 except AttributeError:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
327 pass
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
328
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
329 # 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
330 # be a callable object of some kind
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
331 if method is None:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
332 return ""
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
333 else:
29659
69619542a916 whitespace normalization
Neal Norwitz <nnorwitz@gmail.com>
parents: 29655
diff changeset
334 return pydoc.getdoc(method)
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
335
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
336 def system_multicall(self, call_list):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
337 """system.multicall([{'methodName': 'add', 'params': [2, 2]}, ...]) => \
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
338 [[4], ...]
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
339
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
340 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
341 request.
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
342
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
343 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
344 """
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
345
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
346 results = []
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
347 for call in call_list:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
348 method_name = call['methodName']
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
349 params = call['params']
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
350
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
351 try:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
352 # 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
353 # 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
354 results.append([self._dispatch(method_name, params)])
40587
6b18a095c2e7 SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents: 40450
diff changeset
355 except Fault as fault:
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
356 results.append(
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
357 {'faultCode' : fault.faultCode,
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
358 'faultString' : fault.faultString}
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
359 )
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
360 except:
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39575
diff changeset
361 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
362 results.append(
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
363 {'faultCode' : 1,
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39575
diff changeset
364 '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
365 )
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
366 return results
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
367
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
368 def _dispatch(self, method, params):
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
369 """Dispatches the XML-RPC method.
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
370
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
371 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
372 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
373 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
374 if available.
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
375
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
376 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
377 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
378 its parameters as a tuple
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
379 e.g. instance._dispatch('add',(2,3))
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
380
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
381 If the registered instance does not have a _dispatch method
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
382 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
383 and, if found, will be called.
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
384
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
385 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
386 not be called.
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
387 """
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
388
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
389 func = None
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
390 try:
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
391 # 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
392 func = self.funcs[method]
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
393 except KeyError:
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
394 if self.instance is not None:
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
395 # check for a _dispatch method
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
396 if hasattr(self.instance, '_dispatch'):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
397 return self.instance._dispatch(method, params)
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
398 else:
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
399 # call instance method directly
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
400 try:
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
401 func = resolve_dotted_attribute(
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
402 self.instance,
34528
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
403 method,
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
404 self.allow_dotted_names
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
405 )
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
406 except AttributeError:
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
407 pass
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
408
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
409 if func is not None:
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
410 return func(*params)
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
411 else:
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
412 raise Exception('method "%s" is not supported' % method)
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
413
47318
e1fcc3881cb6 Create http package. #2883.
Georg Brandl <georg@python.org>
parents: 47288
diff changeset
414 class SimpleXMLRPCRequestHandler(BaseHTTPRequestHandler):
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
415 """Simple XML-RPC request handler class.
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
416
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
417 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
418 XML-RPC requests.
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
419 """
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
420
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 37904
diff changeset
421 # Class attribute listing the accessible path components;
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 37904
diff changeset
422 # paths not on this list will result in a 404 error.
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 37904
diff changeset
423 rpc_paths = ('/', '/RPC2')
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 37904
diff changeset
424
55028
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
425 #if not None, encode responses larger than this, if possible
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
426 encode_threshold = 1400 #a common MTU
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
427
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
428 #Override form StreamRequestHandler: full buffering of output
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
429 #and no Nagle.
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
430 wbufsize = -1
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
431 disable_nagle_algorithm = True
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
432
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
433 # a re to match a gzip Accept-Encoding
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
434 aepattern = re.compile(r"""
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
435 \s* ([^\s;]+) \s* #content-coding
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
436 (;\s* q \s*=\s* ([0-9\.]+))? #q
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
437 """, re.VERBOSE | re.IGNORECASE)
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
438
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
439 def accept_encodings(self):
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
440 r = {}
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
441 ae = self.headers.get("Accept-Encoding", "")
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
442 for e in ae.split(","):
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
443 match = self.aepattern.match(e)
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
444 if match:
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
445 v = match.group(3)
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
446 v = float(v) if v else 1.0
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
447 r[match.group(1)] = v
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
448 return r
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
449
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 37904
diff changeset
450 def is_rpc_path_valid(self):
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 37904
diff changeset
451 if self.rpc_paths:
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 37904
diff changeset
452 return self.path in self.rpc_paths
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 37904
diff changeset
453 else:
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 37904
diff changeset
454 # If .rpc_paths is empty, just assume all paths are legal
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 37904
diff changeset
455 return True
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 37904
diff changeset
456
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
457 def do_POST(self):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
458 """Handles the HTTP POST request.
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
459
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
460 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
461 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
462 """
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
463
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 37904
diff changeset
464 # Check that the path is legal
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 37904
diff changeset
465 if not self.is_rpc_path_valid():
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 37904
diff changeset
466 self.report_404()
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 37904
diff changeset
467 return
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 37904
diff changeset
468
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
469 try:
36121
686306a67e9b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 35982
diff changeset
470 # Get arguments by reading body of request.
686306a67e9b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 35982
diff changeset
471 # 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
472 # 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
473 # 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
474 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
475 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
476 L = []
191b59909ded [Bug #792570] Under Windows, socket.read() seems to run into trouble when
Andrew M. Kuchling <amk@amk.ca>
parents: 35976
diff changeset
477 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
478 chunk_size = min(size_remaining, max_chunk_size)
75016
4dd5a94fd3e3 Issue #14001: CVE-2012-0845: xmlrpc: Fix an endless loop in SimpleXMLRPCServer
Charles-François Natali <neologix@free.fr>
parents: 68585
diff changeset
479 chunk = self.rfile.read(chunk_size)
4dd5a94fd3e3 Issue #14001: CVE-2012-0845: xmlrpc: Fix an endless loop in SimpleXMLRPCServer
Charles-François Natali <neologix@free.fr>
parents: 68585
diff changeset
480 if not chunk:
4dd5a94fd3e3 Issue #14001: CVE-2012-0845: xmlrpc: Fix an endless loop in SimpleXMLRPCServer
Charles-François Natali <neologix@free.fr>
parents: 68585
diff changeset
481 break
4dd5a94fd3e3 Issue #14001: CVE-2012-0845: xmlrpc: Fix an endless loop in SimpleXMLRPCServer
Charles-François Natali <neologix@free.fr>
parents: 68585
diff changeset
482 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
483 size_remaining -= len(L[-1])
42670
7e5eff87d664 Fix xmlrpc unittest. While it now passes on Linux, it still fails
Hye-Shik Chang <hyeshik@gmail.com>
parents: 41824
diff changeset
484 data = b''.join(L)
35977
191b59909ded [Bug #792570] Under Windows, socket.read() seems to run into trouble when
Andrew M. Kuchling <amk@amk.ca>
parents: 35976
diff changeset
485
55028
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
486 data = self.decode_request_content(data)
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
487 if data is None:
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
488 return #response has been sent
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
489
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
490 # In previous versions of SimpleXMLRPCServer, _dispatch
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
491 # 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
492 # SimpleXMLRPCDispatcher. To maintain backwards compatibility,
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
493 # 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
494 # using that method if present.
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
495 response = self.server._marshaled_dispatch(
57751
7eb050c0e654 Merged revisions 74558 via svnmerge from
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55997
diff changeset
496 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
497 )
42678
af6a7190cabc Merged revisions 57152-57220 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42670
diff changeset
498 except Exception as 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
499 # internal error, report as HTTP server error
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
500 self.send_response(500)
42678
af6a7190cabc Merged revisions 57152-57220 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42670
diff changeset
501
af6a7190cabc Merged revisions 57152-57220 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42670
diff changeset
502 # Send information about the exception if requested
af6a7190cabc Merged revisions 57152-57220 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42670
diff changeset
503 if hasattr(self.server, '_send_traceback_header') and \
af6a7190cabc Merged revisions 57152-57220 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42670
diff changeset
504 self.server._send_traceback_header:
af6a7190cabc Merged revisions 57152-57220 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42670
diff changeset
505 self.send_header("X-exception", str(e))
60630
44a7507f6db5 Merged revisions 80112 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 56002
diff changeset
506 trace = traceback.format_exc()
44a7507f6db5 Merged revisions 80112 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 56002
diff changeset
507 trace = str(trace.encode('ASCII', 'backslashreplace'), 'ASCII')
44a7507f6db5 Merged revisions 80112 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 56002
diff changeset
508 self.send_header("X-traceback", trace)
42678
af6a7190cabc Merged revisions 57152-57220 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42670
diff changeset
509
55028
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
510 self.send_header("Content-length", "0")
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
511 self.end_headers()
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
512 else:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
513 self.send_response(200)
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
514 self.send_header("Content-type", "text/xml")
55028
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
515 if self.encode_threshold is not None:
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
516 if len(response) > self.encode_threshold:
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
517 q = self.accept_encodings().get("gzip", 0)
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
518 if q:
55344
e62957a0ee14 porting revision 74098 from trunk:
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55028
diff changeset
519 try:
e62957a0ee14 porting revision 74098 from trunk:
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55028
diff changeset
520 response = gzip_encode(response)
e62957a0ee14 porting revision 74098 from trunk:
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55028
diff changeset
521 self.send_header("Content-Encoding", "gzip")
e62957a0ee14 porting revision 74098 from trunk:
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55028
diff changeset
522 except NotImplementedError:
e62957a0ee14 porting revision 74098 from trunk:
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55028
diff changeset
523 pass
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
524 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
525 self.end_headers()
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
526 self.wfile.write(response)
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
527
55028
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
528 def decode_request_content(self, data):
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
529 #support gzip encoding of request
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
530 encoding = self.headers.get("content-encoding", "identity").lower()
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
531 if encoding == "identity":
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
532 return data
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
533 if encoding == "gzip":
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
534 try:
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
535 return gzip_decode(data)
55344
e62957a0ee14 porting revision 74098 from trunk:
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55028
diff changeset
536 except NotImplementedError:
e62957a0ee14 porting revision 74098 from trunk:
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55028
diff changeset
537 self.send_response(501, "encoding %r not supported" % encoding)
55028
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
538 except ValueError:
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
539 self.send_response(400, "error decoding gzip content")
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
540 else:
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
541 self.send_response(501, "encoding %r not supported" % encoding)
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
542 self.send_header("Content-length", "0")
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
543 self.end_headers()
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
544
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 37904
diff changeset
545 def report_404 (self):
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 37904
diff changeset
546 # Report a 404 error
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 37904
diff changeset
547 self.send_response(404)
44234
a5c4739121e1 Fixed two of the three failing xml rpc tests
Christian Heimes <christian@cheimes.de>
parents: 43954
diff changeset
548 response = b'No such page'
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 37904
diff changeset
549 self.send_header("Content-type", "text/plain")
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 37904
diff changeset
550 self.send_header("Content-length", str(len(response)))
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 37904
diff changeset
551 self.end_headers()
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 37904
diff changeset
552 self.wfile.write(response)
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 37904
diff changeset
553
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
554 def log_request(self, code='-', size='-'):
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
555 """Selectively log an accepted request."""
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
556
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
557 if self.server.logRequests:
47318
e1fcc3881cb6 Create http package. #2883.
Georg Brandl <georg@python.org>
parents: 47288
diff changeset
558 BaseHTTPRequestHandler.log_request(self, code, size)
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
559
46933
aca5c1d1c569 Renamed the SocketServer module to 'socketserver'.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 44234
diff changeset
560 class SimpleXMLRPCServer(socketserver.TCPServer,
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
561 SimpleXMLRPCDispatcher):
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
562 """Simple XML-RPC server.
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
563
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
564 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
565 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
566 attempts to dispatch XML-RPC calls to the functions or instance
73214
e88e7ef6b53d Cleanup xmlrpc: remove obsolete comments, unused imports. Add test for bytes marshalling.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 73213
diff changeset
567 installed in the server. Override the _dispatch method inherited
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
568 from SimpleXMLRPCDispatcher to change this behavior.
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
569 """
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
570
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
571 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
572
42678
af6a7190cabc Merged revisions 57152-57220 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42670
diff changeset
573 # Warning: this is for debugging purposes only! Never set this to True in
af6a7190cabc Merged revisions 57152-57220 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42670
diff changeset
574 # production code, as will be sending out sensitive information (exception
af6a7190cabc Merged revisions 57152-57220 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42670
diff changeset
575 # and stack trace details) when exceptions are raised inside
af6a7190cabc Merged revisions 57152-57220 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42670
diff changeset
576 # SimpleXMLRPCRequestHandler.do_POST
af6a7190cabc Merged revisions 57152-57220 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42670
diff changeset
577 _send_traceback_header = False
af6a7190cabc Merged revisions 57152-57220 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42670
diff changeset
578
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
579 def __init__(self, addr, requestHandler=SimpleXMLRPCRequestHandler,
73907
b3c1a504ebc1 Closes #2979: add parameter 'use_builtin_types' to the SimpleXMLRPCServer.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 73219
diff changeset
580 logRequests=True, allow_none=False, encoding=None,
b3c1a504ebc1 Closes #2979: add parameter 'use_builtin_types' to the SimpleXMLRPCServer.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 73219
diff changeset
581 bind_and_activate=True, use_builtin_types=False):
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
582 self.logRequests = logRequests
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
583
73907
b3c1a504ebc1 Closes #2979: add parameter 'use_builtin_types' to the SimpleXMLRPCServer.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 73219
diff changeset
584 SimpleXMLRPCDispatcher.__init__(self, allow_none, encoding, use_builtin_types)
46933
aca5c1d1c569 Renamed the SocketServer module to 'socketserver'.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 44234
diff changeset
585 socketserver.TCPServer.__init__(self, addr, requestHandler, bind_and_activate)
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
586
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
587
57751
7eb050c0e654 Merged revisions 74558 via svnmerge from
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55997
diff changeset
588 class MultiPathXMLRPCServer(SimpleXMLRPCServer):
7eb050c0e654 Merged revisions 74558 via svnmerge from
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55997
diff changeset
589 """Multipath XML-RPC Server
7eb050c0e654 Merged revisions 74558 via svnmerge from
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55997
diff changeset
590 This specialization of SimpleXMLRPCServer allows the user to create
7eb050c0e654 Merged revisions 74558 via svnmerge from
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55997
diff changeset
591 multiple Dispatcher instances and assign them to different
7eb050c0e654 Merged revisions 74558 via svnmerge from
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55997
diff changeset
592 HTTP request paths. This makes it possible to run two or more
7eb050c0e654 Merged revisions 74558 via svnmerge from
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55997
diff changeset
593 'virtual XML-RPC servers' at the same port.
7eb050c0e654 Merged revisions 74558 via svnmerge from
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55997
diff changeset
594 Make sure that the requestHandler accepts the paths in question.
7eb050c0e654 Merged revisions 74558 via svnmerge from
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55997
diff changeset
595 """
7eb050c0e654 Merged revisions 74558 via svnmerge from
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55997
diff changeset
596 def __init__(self, addr, requestHandler=SimpleXMLRPCRequestHandler,
73907
b3c1a504ebc1 Closes #2979: add parameter 'use_builtin_types' to the SimpleXMLRPCServer.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 73219
diff changeset
597 logRequests=True, allow_none=False, encoding=None,
b3c1a504ebc1 Closes #2979: add parameter 'use_builtin_types' to the SimpleXMLRPCServer.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 73219
diff changeset
598 bind_and_activate=True, use_builtin_types=False):
57751
7eb050c0e654 Merged revisions 74558 via svnmerge from
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55997
diff changeset
599
7eb050c0e654 Merged revisions 74558 via svnmerge from
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55997
diff changeset
600 SimpleXMLRPCServer.__init__(self, addr, requestHandler, logRequests, allow_none,
73907
b3c1a504ebc1 Closes #2979: add parameter 'use_builtin_types' to the SimpleXMLRPCServer.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 73219
diff changeset
601 encoding, bind_and_activate, use_builtin_types)
57751
7eb050c0e654 Merged revisions 74558 via svnmerge from
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55997
diff changeset
602 self.dispatchers = {}
7eb050c0e654 Merged revisions 74558 via svnmerge from
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55997
diff changeset
603 self.allow_none = allow_none
73213
f3d454b20b35 Closes #13291: NameError in xmlrpc package.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 73165
diff changeset
604 self.encoding = encoding or 'utf-8'
57751
7eb050c0e654 Merged revisions 74558 via svnmerge from
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55997
diff changeset
605
7eb050c0e654 Merged revisions 74558 via svnmerge from
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55997
diff changeset
606 def add_dispatcher(self, path, dispatcher):
7eb050c0e654 Merged revisions 74558 via svnmerge from
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55997
diff changeset
607 self.dispatchers[path] = dispatcher
7eb050c0e654 Merged revisions 74558 via svnmerge from
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55997
diff changeset
608 return dispatcher
7eb050c0e654 Merged revisions 74558 via svnmerge from
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55997
diff changeset
609
7eb050c0e654 Merged revisions 74558 via svnmerge from
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55997
diff changeset
610 def get_dispatcher(self, path):
7eb050c0e654 Merged revisions 74558 via svnmerge from
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55997
diff changeset
611 return self.dispatchers[path]
7eb050c0e654 Merged revisions 74558 via svnmerge from
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55997
diff changeset
612
7eb050c0e654 Merged revisions 74558 via svnmerge from
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55997
diff changeset
613 def _marshaled_dispatch(self, data, dispatch_method = None, path = None):
7eb050c0e654 Merged revisions 74558 via svnmerge from
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55997
diff changeset
614 try:
7eb050c0e654 Merged revisions 74558 via svnmerge from
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55997
diff changeset
615 response = self.dispatchers[path]._marshaled_dispatch(
7eb050c0e654 Merged revisions 74558 via svnmerge from
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55997
diff changeset
616 data, dispatch_method, path)
7eb050c0e654 Merged revisions 74558 via svnmerge from
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55997
diff changeset
617 except:
7eb050c0e654 Merged revisions 74558 via svnmerge from
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55997
diff changeset
618 # report low level exception back to server
7eb050c0e654 Merged revisions 74558 via svnmerge from
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55997
diff changeset
619 # (each dispatcher should have handled their own
7eb050c0e654 Merged revisions 74558 via svnmerge from
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55997
diff changeset
620 # exceptions)
7eb050c0e654 Merged revisions 74558 via svnmerge from
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55997
diff changeset
621 exc_type, exc_value = sys.exc_info()[:2]
73213
f3d454b20b35 Closes #13291: NameError in xmlrpc package.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 73165
diff changeset
622 response = dumps(
f3d454b20b35 Closes #13291: NameError in xmlrpc package.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 73165
diff changeset
623 Fault(1, "%s:%s" % (exc_type, exc_value)),
57751
7eb050c0e654 Merged revisions 74558 via svnmerge from
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55997
diff changeset
624 encoding=self.encoding, allow_none=self.allow_none)
73213
f3d454b20b35 Closes #13291: NameError in xmlrpc package.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 73165
diff changeset
625 response = response.encode(self.encoding)
57751
7eb050c0e654 Merged revisions 74558 via svnmerge from
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55997
diff changeset
626 return response
7eb050c0e654 Merged revisions 74558 via svnmerge from
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55997
diff changeset
627
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
628 class CGIXMLRPCRequestHandler(SimpleXMLRPCDispatcher):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
629 """Simple handler for XML-RPC data passed through CGI."""
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
630
73907
b3c1a504ebc1 Closes #2979: add parameter 'use_builtin_types' to the SimpleXMLRPCServer.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 73219
diff changeset
631 def __init__(self, allow_none=False, encoding=None, use_builtin_types=False):
b3c1a504ebc1 Closes #2979: add parameter 'use_builtin_types' to the SimpleXMLRPCServer.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 73219
diff changeset
632 SimpleXMLRPCDispatcher.__init__(self, allow_none, encoding, use_builtin_types)
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
633
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
634 def handle_xmlrpc(self, request_text):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
635 """Handle a single XML-RPC request"""
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
636
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
637 response = self._marshaled_dispatch(request_text)
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
638
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
639 print('Content-Type: text/xml')
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
640 print('Content-Length: %d' % len(response))
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
641 print()
52668
cef8b8259ac9 Fix for issue5040. Adding support for unicode message passing and tests for unicode message and test for Content-Length.
Senthil Kumaran <orsenthil@gmail.com>
parents: 52648
diff changeset
642 sys.stdout.flush()
cef8b8259ac9 Fix for issue5040. Adding support for unicode message passing and tests for unicode message and test for Content-Length.
Senthil Kumaran <orsenthil@gmail.com>
parents: 52648
diff changeset
643 sys.stdout.buffer.write(response)
cef8b8259ac9 Fix for issue5040. Adding support for unicode message passing and tests for unicode message and test for Content-Length.
Senthil Kumaran <orsenthil@gmail.com>
parents: 52648
diff changeset
644 sys.stdout.buffer.flush()
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
645
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
646 def handle_get(self):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
647 """Handle a single HTTP GET request.
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
648
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
649 Default implementation indicates an error because
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
650 XML-RPC uses the POST method.
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
651 """
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
652
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
653 code = 400
47318
e1fcc3881cb6 Create http package. #2883.
Georg Brandl <georg@python.org>
parents: 47288
diff changeset
654 message, explain = BaseHTTPRequestHandler.responses[code]
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
655
47318
e1fcc3881cb6 Create http package. #2883.
Georg Brandl <georg@python.org>
parents: 47288
diff changeset
656 response = http.server.DEFAULT_ERROR_MESSAGE % \
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
657 {
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
658 'code' : code,
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
659 'message' : message,
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
660 'explain' : explain
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
661 }
52668
cef8b8259ac9 Fix for issue5040. Adding support for unicode message passing and tests for unicode message and test for Content-Length.
Senthil Kumaran <orsenthil@gmail.com>
parents: 52648
diff changeset
662 response = response.encode('utf-8')
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
663 print('Status: %d %s' % (code, message))
52668
cef8b8259ac9 Fix for issue5040. Adding support for unicode message passing and tests for unicode message and test for Content-Length.
Senthil Kumaran <orsenthil@gmail.com>
parents: 52648
diff changeset
664 print('Content-Type: %s' % http.server.DEFAULT_ERROR_CONTENT_TYPE)
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
665 print('Content-Length: %d' % len(response))
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
666 print()
52668
cef8b8259ac9 Fix for issue5040. Adding support for unicode message passing and tests for unicode message and test for Content-Length.
Senthil Kumaran <orsenthil@gmail.com>
parents: 52648
diff changeset
667 sys.stdout.flush()
cef8b8259ac9 Fix for issue5040. Adding support for unicode message passing and tests for unicode message and test for Content-Length.
Senthil Kumaran <orsenthil@gmail.com>
parents: 52648
diff changeset
668 sys.stdout.buffer.write(response)
cef8b8259ac9 Fix for issue5040. Adding support for unicode message passing and tests for unicode message and test for Content-Length.
Senthil Kumaran <orsenthil@gmail.com>
parents: 52648
diff changeset
669 sys.stdout.buffer.flush()
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
670
56002
fa91270b6087 Merged revisions 74821,74828-74831,74833,74835 via svnmerge from
Georg Brandl <georg@python.org>
parents: 52950
diff changeset
671 def handle_request(self, request_text=None):
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
672 """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
673
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
674 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
675 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
676 headers.
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
677 """
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
678
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
679 if request_text is None and \
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
680 os.environ.get('REQUEST_METHOD', None) == 'GET':
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
681 self.handle_get()
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
682 else:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
683 # POST data is normally available through stdin
52638
acfc18cdcdfb Merged revisions 70940 via svnmerge
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
684 try:
acfc18cdcdfb Merged revisions 70940 via svnmerge
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
685 length = int(os.environ.get('CONTENT_LENGTH', None))
52648
abf6dad7d64f #5636: fix next -> __next__ in csv reader docs.
Georg Brandl <georg@python.org>
parents: 52638
diff changeset
686 except (ValueError, TypeError):
52638
acfc18cdcdfb Merged revisions 70940 via svnmerge
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
687 length = -1
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
688 if request_text is None:
52638
acfc18cdcdfb Merged revisions 70940 via svnmerge
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
689 request_text = sys.stdin.read(length)
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
690
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
691 self.handle_xmlrpc(request_text)
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
692
47288
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
693
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
694 # -----------------------------------------------------------------------------
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
695 # Self documenting XML-RPC Server.
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
696
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
697 class ServerHTMLDoc(pydoc.HTMLDoc):
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
698 """Class used to generate pydoc HTML document for a server"""
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
699
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
700 def markup(self, text, escape=None, funcs={}, classes={}, methods={}):
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
701 """Mark up some plain text, given a context of symbols to look for.
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
702 Each context dictionary maps object names to anchor names."""
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
703 escape = escape or self.escape
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
704 results = []
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
705 here = 0
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
706
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
707 # XXX Note that this regular expression does not allow for the
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
708 # hyperlinking of arbitrary strings being used as method
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
709 # names. Only methods with names consisting of word characters
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
710 # and '.'s are hyperlinked.
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
711 pattern = re.compile(r'\b((http|ftp)://\S+[\w/]|'
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
712 r'RFC[- ]?(\d+)|'
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
713 r'PEP[- ]?(\d+)|'
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
714 r'(self\.)?((?:\w|\.)+))\b')
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
715 while 1:
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
716 match = pattern.search(text, here)
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
717 if not match: break
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
718 start, end = match.span()
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
719 results.append(escape(text[here:start]))
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
720
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
721 all, scheme, rfc, pep, selfdot, name = match.groups()
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
722 if scheme:
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
723 url = escape(all).replace('"', '&quot;')
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
724 results.append('<a href="%s">%s</a>' % (url, url))
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
725 elif rfc:
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
726 url = 'http://www.rfc-editor.org/rfc/rfc%d.txt' % int(rfc)
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
727 results.append('<a href="%s">%s</a>' % (url, escape(all)))
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
728 elif pep:
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
729 url = 'http://www.python.org/dev/peps/pep-%04d/' % int(pep)
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
730 results.append('<a href="%s">%s</a>' % (url, escape(all)))
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
731 elif text[end:end+1] == '(':
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
732 results.append(self.namelink(name, methods, funcs, classes))
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
733 elif selfdot:
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
734 results.append('self.<strong>%s</strong>' % name)
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
735 else:
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
736 results.append(self.namelink(name, classes))
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
737 here = end
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
738 results.append(escape(text[here:]))
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
739 return ''.join(results)
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
740
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
741 def docroutine(self, object, name, mod=None,
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
742 funcs={}, classes={}, methods={}, cl=None):
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
743 """Produce HTML documentation for a function or method object."""
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
744
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
745 anchor = (cl and cl.__name__ or '') + '-' + name
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
746 note = ''
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
747
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
748 title = '<a name="%s"><strong>%s</strong></a>' % (
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
749 self.escape(anchor), self.escape(name))
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
750
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
751 if inspect.ismethod(object):
85096
bc49e82ee013 #8112: Update the documenting xmlrpc server to use getfullargspec.
R David Murray <rdmurray@bitdance.com>
parents: 75429
diff changeset
752 args = inspect.getfullargspec(object)
47288
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
753 # exclude the argument bound to the instance, it will be
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
754 # confusing to the non-Python user
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
755 argspec = inspect.formatargspec (
85096
bc49e82ee013 #8112: Update the documenting xmlrpc server to use getfullargspec.
R David Murray <rdmurray@bitdance.com>
parents: 75429
diff changeset
756 args.args[1:],
bc49e82ee013 #8112: Update the documenting xmlrpc server to use getfullargspec.
R David Murray <rdmurray@bitdance.com>
parents: 75429
diff changeset
757 args.varargs,
bc49e82ee013 #8112: Update the documenting xmlrpc server to use getfullargspec.
R David Murray <rdmurray@bitdance.com>
parents: 75429
diff changeset
758 args.varkw,
bc49e82ee013 #8112: Update the documenting xmlrpc server to use getfullargspec.
R David Murray <rdmurray@bitdance.com>
parents: 75429
diff changeset
759 args.defaults,
bc49e82ee013 #8112: Update the documenting xmlrpc server to use getfullargspec.
R David Murray <rdmurray@bitdance.com>
parents: 75429
diff changeset
760 annotations=args.annotations,
47288
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
761 formatvalue=self.formatvalue
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
762 )
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
763 elif inspect.isfunction(object):
85096
bc49e82ee013 #8112: Update the documenting xmlrpc server to use getfullargspec.
R David Murray <rdmurray@bitdance.com>
parents: 75429
diff changeset
764 args = inspect.getfullargspec(object)
47288
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
765 argspec = inspect.formatargspec(
85096
bc49e82ee013 #8112: Update the documenting xmlrpc server to use getfullargspec.
R David Murray <rdmurray@bitdance.com>
parents: 75429
diff changeset
766 args.args, args.varargs, args.varkw, args.defaults,
bc49e82ee013 #8112: Update the documenting xmlrpc server to use getfullargspec.
R David Murray <rdmurray@bitdance.com>
parents: 75429
diff changeset
767 annotations=args.annotations,
bc49e82ee013 #8112: Update the documenting xmlrpc server to use getfullargspec.
R David Murray <rdmurray@bitdance.com>
parents: 75429
diff changeset
768 formatvalue=self.formatvalue)
47288
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
769 else:
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
770 argspec = '(...)'
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
771
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
772 if isinstance(object, tuple):
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
773 argspec = object[0] or argspec
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
774 docstring = object[1] or ""
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
775 else:
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
776 docstring = pydoc.getdoc(object)
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
777
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
778 decl = title + argspec + (note and self.grey(
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
779 '<font face="helvetica, arial">%s</font>' % note))
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
780
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
781 doc = self.markup(
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
782 docstring, self.preformat, funcs, classes, methods)
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
783 doc = doc and '<dd><tt>%s</tt></dd>' % doc
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
784 return '<dl><dt>%s</dt>%s</dl>\n' % (decl, doc)
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
785
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
786 def docserver(self, server_name, package_documentation, methods):
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
787 """Produce HTML documentation for an XML-RPC server."""
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
788
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
789 fdict = {}
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
790 for key, value in methods.items():
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
791 fdict[key] = '#-' + key
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
792 fdict[value] = fdict[key]
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
793
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
794 server_name = self.escape(server_name)
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
795 head = '<big><big><strong>%s</strong></big></big>' % server_name
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
796 result = self.heading(head, '#ffffff', '#7799ee')
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
797
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
798 doc = self.markup(package_documentation, self.preformat, fdict)
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
799 doc = doc and '<tt>%s</tt>' % doc
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
800 result = result + '<p>%s</p>\n' % doc
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
801
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
802 contents = []
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
803 method_items = sorted(methods.items())
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
804 for key, value in method_items:
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
805 contents.append(self.docroutine(value, key, funcs=fdict))
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
806 result = result + self.bigsection(
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
807 'Methods', '#ffffff', '#eeaa77', ''.join(contents))
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
808
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
809 return result
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
810
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
811 class XMLRPCDocGenerator:
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
812 """Generates documentation for an XML-RPC server.
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
813
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
814 This class is designed as mix-in and should not
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
815 be constructed directly.
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
816 """
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
817
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
818 def __init__(self):
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
819 # setup variables used for HTML documentation
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
820 self.server_name = 'XML-RPC Server Documentation'
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
821 self.server_documentation = \
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
822 "This server exports the following methods through the XML-RPC "\
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
823 "protocol."
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
824 self.server_title = 'XML-RPC Server Documentation'
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
825
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
826 def set_server_title(self, server_title):
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
827 """Set the HTML title of the generated server documentation"""
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
828
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
829 self.server_title = server_title
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
830
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
831 def set_server_name(self, server_name):
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
832 """Set the name of the generated HTML server documentation"""
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
833
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
834 self.server_name = server_name
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
835
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
836 def set_server_documentation(self, server_documentation):
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
837 """Set the documentation string for the entire server."""
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
838
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
839 self.server_documentation = server_documentation
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
840
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
841 def generate_html_documentation(self):
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
842 """generate_html_documentation() => html documentation for the server
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
843
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
844 Generates HTML documentation for the server using introspection for
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
845 installed functions and instances that do not implement the
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
846 _dispatch method. Alternatively, instances can choose to implement
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
847 the _get_method_argstring(method_name) method to provide the
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
848 argument string used in the documentation and the
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
849 _methodHelp(method_name) method to provide the help text used
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
850 in the documentation."""
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
851
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
852 methods = {}
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
853
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
854 for method_name in self.system_listMethods():
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
855 if method_name in self.funcs:
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
856 method = self.funcs[method_name]
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
857 elif self.instance is not None:
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
858 method_info = [None, None] # argspec, documentation
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
859 if hasattr(self.instance, '_get_method_argstring'):
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
860 method_info[0] = self.instance._get_method_argstring(method_name)
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
861 if hasattr(self.instance, '_methodHelp'):
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
862 method_info[1] = self.instance._methodHelp(method_name)
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
863
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
864 method_info = tuple(method_info)
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
865 if method_info != (None, None):
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
866 method = method_info
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
867 elif not hasattr(self.instance, '_dispatch'):
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
868 try:
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
869 method = resolve_dotted_attribute(
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
870 self.instance,
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
871 method_name
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
872 )
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
873 except AttributeError:
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
874 method = method_info
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
875 else:
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
876 method = method_info
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
877 else:
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
878 assert 0, "Could not find method in self.functions and no "\
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
879 "instance installed"
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
880
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
881 methods[method_name] = method
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
882
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
883 documenter = ServerHTMLDoc()
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
884 documentation = documenter.docserver(
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
885 self.server_name,
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
886 self.server_documentation,
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
887 methods
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
888 )
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
889
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
890 return documenter.page(self.server_title, documentation)
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
891
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
892 class DocXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
893 """XML-RPC and documentation request handler class.
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
894
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
895 Handles all HTTP POST requests and attempts to decode them as
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
896 XML-RPC requests.
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
897
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
898 Handles all HTTP GET requests and interprets them as requests
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
899 for documentation.
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
900 """
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
901
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
902 def do_GET(self):
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
903 """Handles the HTTP GET request.
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
904
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
905 Interpret all HTTP GET requests as requests for server
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
906 documentation.
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
907 """
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
908 # Check that the path is legal
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
909 if not self.is_rpc_path_valid():
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
910 self.report_404()
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
911 return
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
912
52668
cef8b8259ac9 Fix for issue5040. Adding support for unicode message passing and tests for unicode message and test for Content-Length.
Senthil Kumaran <orsenthil@gmail.com>
parents: 52648
diff changeset
913 response = self.server.generate_html_documentation().encode('utf-8')
47288
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
914 self.send_response(200)
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
915 self.send_header("Content-type", "text/html")
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
916 self.send_header("Content-length", str(len(response)))
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
917 self.end_headers()
52668
cef8b8259ac9 Fix for issue5040. Adding support for unicode message passing and tests for unicode message and test for Content-Length.
Senthil Kumaran <orsenthil@gmail.com>
parents: 52648
diff changeset
918 self.wfile.write(response)
47288
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
919
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
920 class DocXMLRPCServer( SimpleXMLRPCServer,
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
921 XMLRPCDocGenerator):
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
922 """XML-RPC and HTML documentation server.
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
923
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
924 Adds the ability to serve server documentation to the capabilities
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
925 of SimpleXMLRPCServer.
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
926 """
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
927
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
928 def __init__(self, addr, requestHandler=DocXMLRPCRequestHandler,
56002
fa91270b6087 Merged revisions 74821,74828-74831,74833,74835 via svnmerge from
Georg Brandl <georg@python.org>
parents: 52950
diff changeset
929 logRequests=True, allow_none=False, encoding=None,
73907
b3c1a504ebc1 Closes #2979: add parameter 'use_builtin_types' to the SimpleXMLRPCServer.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 73219
diff changeset
930 bind_and_activate=True, use_builtin_types=False):
47288
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
931 SimpleXMLRPCServer.__init__(self, addr, requestHandler, logRequests,
73907
b3c1a504ebc1 Closes #2979: add parameter 'use_builtin_types' to the SimpleXMLRPCServer.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 73219
diff changeset
932 allow_none, encoding, bind_and_activate,
b3c1a504ebc1 Closes #2979: add parameter 'use_builtin_types' to the SimpleXMLRPCServer.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 73219
diff changeset
933 use_builtin_types)
47288
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
934 XMLRPCDocGenerator.__init__(self)
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
935
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
936 class DocCGIXMLRPCRequestHandler( CGIXMLRPCRequestHandler,
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
937 XMLRPCDocGenerator):
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
938 """Handler for XML-RPC data and documentation requests passed through
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
939 CGI"""
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
940
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
941 def handle_get(self):
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
942 """Handles the HTTP GET request.
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
943
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
944 Interpret all HTTP GET requests as requests for server
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
945 documentation.
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
946 """
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
947
52668
cef8b8259ac9 Fix for issue5040. Adding support for unicode message passing and tests for unicode message and test for Content-Length.
Senthil Kumaran <orsenthil@gmail.com>
parents: 52648
diff changeset
948 response = self.generate_html_documentation().encode('utf-8')
47288
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
949
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
950 print('Content-Type: text/html')
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
951 print('Content-Length: %d' % len(response))
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
952 print()
52668
cef8b8259ac9 Fix for issue5040. Adding support for unicode message passing and tests for unicode message and test for Content-Length.
Senthil Kumaran <orsenthil@gmail.com>
parents: 52648
diff changeset
953 sys.stdout.flush()
cef8b8259ac9 Fix for issue5040. Adding support for unicode message passing and tests for unicode message and test for Content-Length.
Senthil Kumaran <orsenthil@gmail.com>
parents: 52648
diff changeset
954 sys.stdout.buffer.write(response)
cef8b8259ac9 Fix for issue5040. Adding support for unicode message passing and tests for unicode message and test for Content-Length.
Senthil Kumaran <orsenthil@gmail.com>
parents: 52648
diff changeset
955 sys.stdout.buffer.flush()
47288
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
956
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
957 def __init__(self):
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
958 CGIXMLRPCRequestHandler.__init__(self)
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
959 XMLRPCDocGenerator.__init__(self)
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
960
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
961
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
962 if __name__ == '__main__':
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
963 server = SimpleXMLRPCServer(("localhost", 8000))
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
964 server.register_function(pow)
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
965 server.register_function(lambda x,y: x+y, 'add')
73219
197d703fb23e Fix User-Agent for the xmlrpc.client, and catch KeyboardInterrupt for the standalone xmlrpc.server.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 73214
diff changeset
966 print('Serving XML-RPC on localhost port 8000')
197d703fb23e Fix User-Agent for the xmlrpc.client, and catch KeyboardInterrupt for the standalone xmlrpc.server.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 73214
diff changeset
967 try:
197d703fb23e Fix User-Agent for the xmlrpc.client, and catch KeyboardInterrupt for the standalone xmlrpc.server.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 73214
diff changeset
968 server.serve_forever()
197d703fb23e Fix User-Agent for the xmlrpc.client, and catch KeyboardInterrupt for the standalone xmlrpc.server.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 73214
diff changeset
969 except KeyboardInterrupt:
197d703fb23e Fix User-Agent for the xmlrpc.client, and catch KeyboardInterrupt for the standalone xmlrpc.server.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 73214
diff changeset
970 print("\nKeyboard interrupt received, exiting.")
197d703fb23e Fix User-Agent for the xmlrpc.client, and catch KeyboardInterrupt for the standalone xmlrpc.server.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 73214
diff changeset
971 server.server_close()
197d703fb23e Fix User-Agent for the xmlrpc.client, and catch KeyboardInterrupt for the standalone xmlrpc.server.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 73214
diff changeset
972 sys.exit(0)