annotate Lib/xmlrpc/server.py @ 78069:a8aa77458e12 3.2

Add c_size_t and c_ssize_t to the ctypes summary table.
author Antoine Pitrou <solipsis@pitrou.net>
date Thu, 12 Jul 2012 20:31:50 +0200
parents 8ce8006dfc42
children 561532103d74
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
52950
153917c001be Merged revisions 71268 via svnmerge from
Matthias Klose <doko@ubuntu.com>
parents: 52668
diff changeset
163 def __init__(self, allow_none=False, encoding=None):
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
164 self.funcs = {}
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
165 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
166 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
167 self.encoding = encoding or 'utf-8'
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
168
34528
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
169 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
170 """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
171
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
172 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
173
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
174 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
175 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
176 its parameters as a tuple
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
177 e.g. instance._dispatch('add',(2,3))
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
178
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
179 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
180 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
181 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
182 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
183 SimpleXMLRPCServer.
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
184
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
185 If 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
186 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
187
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
188 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
189 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
190 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
191 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
192
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
193 *** SECURITY WARNING: ***
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 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
196 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
197 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
198 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
199
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
200 """
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
201
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
202 self.instance = instance
34528
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
203 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
204
56002
fa91270b6087 Merged revisions 74821,74828-74831,74833,74835 via svnmerge from
Georg Brandl <georg@python.org>
parents: 52950
diff changeset
205 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
206 """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
207
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
208 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
209 for the function.
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
210 """
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
211
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
212 if name is None:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
213 name = function.__name__
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
214 self.funcs[name] = function
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
215
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
216 def register_introspection_functions(self):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
217 """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
218 namespace.
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
219
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
220 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
221 """
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
222
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
223 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
224 'system.methodSignature' : self.system_methodSignature,
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
225 'system.methodHelp' : self.system_methodHelp})
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
226
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
227 def register_multicall_functions(self):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
228 """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
229 namespace.
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
230
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
231 see http://www.xmlrpc.com/discuss/msgReader$1208"""
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
232
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
233 self.funcs.update({'system.multicall' : self.system_multicall})
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
234
57751
7eb050c0e654 Merged revisions 74558 via svnmerge from
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55997
diff changeset
235 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
236 """Dispatches an XML-RPC method from marshalled (XML) data.
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
237
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
238 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
239 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
240 marshalled data. For backwards compatibility, a dispatch
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
241 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
242 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
243 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
244 of changing method dispatch behavior.
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
245 """
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
246
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 37904
diff changeset
247 try:
47288
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
248 params, method = loads(data)
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
249
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 37904
diff changeset
250 # generate response
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
251 if dispatch_method is not None:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
252 response = dispatch_method(method, params)
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
253 else:
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
254 response = self._dispatch(method, params)
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
255 # wrap response in a singleton tuple
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
256 response = (response,)
47288
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
257 response = dumps(response, methodresponse=1,
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
258 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
259 except Fault as fault:
47288
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
260 response = dumps(fault, allow_none=self.allow_none,
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
261 encoding=self.encoding)
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
262 except:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
263 # 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
264 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
265 response = dumps(
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
266 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
267 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
268 )
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
269
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
270 return response.encode(self.encoding)
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
271
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
272 def system_listMethods(self):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
273 """system.listMethods() => ['add', 'subtract', 'multiple']
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
274
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
275 Returns a list of the methods supported by the server."""
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
276
42670
7e5eff87d664 Fix xmlrpc unittest. While it now passes on Linux, it still fails
Hye-Shik Chang <hyeshik@gmail.com>
parents: 41824
diff changeset
277 methods = set(self.funcs.keys())
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
278 if self.instance is not None:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
279 # 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
280 # methods
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
281 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
282 methods |= set(self.instance._listMethods())
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
283 # 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
284 # 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
285 # of methods
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
286 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
287 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
288 return sorted(methods)
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
289
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
290 def system_methodSignature(self, method_name):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
291 """system.methodSignature('add') => [double, int, int]
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
292
33670
89faacd9ec76 Fix a small typo in the docstring for system_methodSignature .
Brett Cannon <bcannon@gmail.com>
parents: 30838
diff changeset
293 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
294 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
295 and returns a double result.
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
296
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
297 This server does NOT support system.methodSignature."""
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 # See http://xmlrpc.usefulinc.com/doc/sysmethodsig.html
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
300
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
301 return 'signatures not supported'
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
302
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
303 def system_methodHelp(self, method_name):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
304 """system.methodHelp('add') => "Adds two integers together"
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
305
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
306 Returns a string containing documentation for the specified method."""
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
307
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
308 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
309 if method_name in self.funcs:
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
310 method = self.funcs[method_name]
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
311 elif self.instance is not None:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
312 # 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
313 if hasattr(self.instance, '_methodHelp'):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
314 return self.instance._methodHelp(method_name)
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
315 # 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
316 # 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
317 elif not hasattr(self.instance, '_dispatch'):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
318 try:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
319 method = resolve_dotted_attribute(
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
320 self.instance,
34528
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
321 method_name,
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
322 self.allow_dotted_names
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
323 )
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
324 except AttributeError:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
325 pass
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
326
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
327 # 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
328 # be a callable object of some kind
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
329 if method is None:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
330 return ""
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
331 else:
29659
69619542a916 whitespace normalization
Neal Norwitz <nnorwitz@gmail.com>
parents: 29655
diff changeset
332 return pydoc.getdoc(method)
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
333
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
334 def system_multicall(self, call_list):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
335 """system.multicall([{'methodName': 'add', 'params': [2, 2]}, ...]) => \
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
336 [[4], ...]
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
337
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
338 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
339 request.
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
340
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
341 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
342 """
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
343
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
344 results = []
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
345 for call in call_list:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
346 method_name = call['methodName']
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
347 params = call['params']
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
348
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
349 try:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
350 # 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
351 # 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
352 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
353 except Fault as fault:
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
354 results.append(
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
355 {'faultCode' : fault.faultCode,
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
356 'faultString' : fault.faultString}
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
357 )
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
358 except:
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39575
diff changeset
359 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
360 results.append(
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
361 {'faultCode' : 1,
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39575
diff changeset
362 '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
363 )
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
364 return results
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
365
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
366 def _dispatch(self, method, params):
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
367 """Dispatches the XML-RPC method.
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
368
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
369 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
370 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
371 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
372 if available.
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
373
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
374 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
375 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
376 its parameters as a tuple
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
377 e.g. instance._dispatch('add',(2,3))
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
378
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
379 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
380 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
381 and, if found, will be called.
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
382
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
383 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
384 not be called.
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
385 """
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
386
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
387 func = None
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
388 try:
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
389 # 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
390 func = self.funcs[method]
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
391 except KeyError:
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
392 if self.instance is not None:
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
393 # check for a _dispatch method
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
394 if hasattr(self.instance, '_dispatch'):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
395 return self.instance._dispatch(method, params)
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
396 else:
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
397 # call instance method directly
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
398 try:
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
399 func = resolve_dotted_attribute(
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
400 self.instance,
34528
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
401 method,
1c072615e5b8 Security fix PSF-2005-001 for SimpleXMLRPCServer.py.
Guido van Rossum <guido@python.org>
parents: 33670
diff changeset
402 self.allow_dotted_names
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
403 )
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
404 except AttributeError:
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
405 pass
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
406
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
407 if func is not None:
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
408 return func(*params)
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
409 else:
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
410 raise Exception('method "%s" is not supported' % method)
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
411
47318
e1fcc3881cb6 Create http package. #2883.
Georg Brandl <georg@python.org>
parents: 47288
diff changeset
412 class SimpleXMLRPCRequestHandler(BaseHTTPRequestHandler):
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
413 """Simple XML-RPC request handler class.
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
414
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
415 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
416 XML-RPC requests.
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
417 """
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
418
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 37904
diff changeset
419 # 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
420 # 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
421 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
422
55028
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
423 #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
424 encode_threshold = 1400 #a common MTU
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
425
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
426 #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
427 #and no Nagle.
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
428 wbufsize = -1
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
429 disable_nagle_algorithm = True
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
430
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
431 # 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
432 aepattern = re.compile(r"""
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
433 \s* ([^\s;]+) \s* #content-coding
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
434 (;\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
435 """, re.VERBOSE | re.IGNORECASE)
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
436
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
437 def accept_encodings(self):
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
438 r = {}
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
439 ae = self.headers.get("Accept-Encoding", "")
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
440 for e in ae.split(","):
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
441 match = self.aepattern.match(e)
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
442 if match:
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
443 v = match.group(3)
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
444 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
445 r[match.group(1)] = v
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
446 return r
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
447
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 37904
diff changeset
448 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
449 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
450 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
451 else:
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 37904
diff changeset
452 # 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
453 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
454
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
455 def do_POST(self):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
456 """Handles the HTTP POST request.
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
457
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
458 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
459 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
460 """
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
461
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 37904
diff changeset
462 # 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
463 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
464 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
465 return
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 37904
diff changeset
466
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
467 try:
36121
686306a67e9b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 35982
diff changeset
468 # Get arguments by reading body of request.
686306a67e9b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 35982
diff changeset
469 # 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
470 # 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
471 # 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
472 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
473 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
474 L = []
191b59909ded [Bug #792570] Under Windows, socket.read() seems to run into trouble when
Andrew M. Kuchling <amk@amk.ca>
parents: 35976
diff changeset
475 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
476 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
477 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
478 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
479 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
480 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
481 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
482 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
483
55028
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
484 data = self.decode_request_content(data)
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
485 if data is None:
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
486 return #response has been sent
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
487
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
488 # In previous versions of SimpleXMLRPCServer, _dispatch
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
489 # 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
490 # SimpleXMLRPCDispatcher. To maintain backwards compatibility,
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
491 # 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
492 # using that method if present.
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
493 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
494 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
495 )
42678
af6a7190cabc Merged revisions 57152-57220 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42670
diff changeset
496 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
497 # internal error, report as HTTP server error
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
498 self.send_response(500)
42678
af6a7190cabc Merged revisions 57152-57220 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42670
diff changeset
499
af6a7190cabc Merged revisions 57152-57220 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42670
diff changeset
500 # 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
501 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
502 self.server._send_traceback_header:
af6a7190cabc Merged revisions 57152-57220 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42670
diff changeset
503 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
504 trace = traceback.format_exc()
44a7507f6db5 Merged revisions 80112 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 56002
diff changeset
505 trace = str(trace.encode('ASCII', 'backslashreplace'), 'ASCII')
44a7507f6db5 Merged revisions 80112 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 56002
diff changeset
506 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
507
55028
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
508 self.send_header("Content-length", "0")
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
509 self.end_headers()
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
510 else:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
511 self.send_response(200)
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
512 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
513 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
514 if len(response) > self.encode_threshold:
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
515 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
516 if q:
55344
e62957a0ee14 porting revision 74098 from trunk:
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55028
diff changeset
517 try:
e62957a0ee14 porting revision 74098 from trunk:
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55028
diff changeset
518 response = gzip_encode(response)
e62957a0ee14 porting revision 74098 from trunk:
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55028
diff changeset
519 self.send_header("Content-Encoding", "gzip")
e62957a0ee14 porting revision 74098 from trunk:
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55028
diff changeset
520 except NotImplementedError:
e62957a0ee14 porting revision 74098 from trunk:
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55028
diff changeset
521 pass
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
522 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
523 self.end_headers()
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
524 self.wfile.write(response)
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
525
55028
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
526 def decode_request_content(self, data):
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
527 #support gzip encoding of request
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
528 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
529 if encoding == "identity":
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
530 return data
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
531 if encoding == "gzip":
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
532 try:
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
533 return gzip_decode(data)
55344
e62957a0ee14 porting revision 74098 from trunk:
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55028
diff changeset
534 except NotImplementedError:
e62957a0ee14 porting revision 74098 from trunk:
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55028
diff changeset
535 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
536 except ValueError:
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
537 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
538 else:
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
539 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
540 self.send_header("Content-length", "0")
366c8a4e5a46 http://bugs.python.org/issue6267
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 52950
diff changeset
541 self.end_headers()
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
542
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 37904
diff changeset
543 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
544 # 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
545 self.send_response(404)
44234
a5c4739121e1 Fixed two of the three failing xml rpc tests
Christian Heimes <christian@cheimes.de>
parents: 43954
diff changeset
546 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
547 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
548 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
549 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
550 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
551
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
552 def log_request(self, code='-', size='-'):
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
553 """Selectively log an accepted request."""
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
554
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
555 if self.server.logRequests:
47318
e1fcc3881cb6 Create http package. #2883.
Georg Brandl <georg@python.org>
parents: 47288
diff changeset
556 BaseHTTPRequestHandler.log_request(self, code, size)
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
557
46933
aca5c1d1c569 Renamed the SocketServer module to 'socketserver'.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 44234
diff changeset
558 class SimpleXMLRPCServer(socketserver.TCPServer,
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
559 SimpleXMLRPCDispatcher):
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
560 """Simple XML-RPC server.
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
561
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
562 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
563 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
564 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
565 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
566 from SimpleXMLRPCDispatcher to change this behavior.
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
567 """
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
568
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
569 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
570
42678
af6a7190cabc Merged revisions 57152-57220 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42670
diff changeset
571 # 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
572 # 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
573 # 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
574 # SimpleXMLRPCRequestHandler.do_POST
af6a7190cabc Merged revisions 57152-57220 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42670
diff changeset
575 _send_traceback_header = False
af6a7190cabc Merged revisions 57152-57220 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42670
diff changeset
576
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
577 def __init__(self, addr, requestHandler=SimpleXMLRPCRequestHandler,
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41480
diff changeset
578 logRequests=True, allow_none=False, encoding=None, bind_and_activate=True):
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
579 self.logRequests = logRequests
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
580
35982
03ae0b8eb6cb [Patch #1039083] Add 'encoding' parameter to SimpleXMLRPCServer
Andrew M. Kuchling <amk@amk.ca>
parents: 35981
diff changeset
581 SimpleXMLRPCDispatcher.__init__(self, allow_none, encoding)
46933
aca5c1d1c569 Renamed the SocketServer module to 'socketserver'.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 44234
diff changeset
582 socketserver.TCPServer.__init__(self, addr, requestHandler, bind_and_activate)
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
583
36121
686306a67e9b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 35982
diff changeset
584 # [Bug #1222790] If possible, set close-on-exec flag; if a
686306a67e9b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 35982
diff changeset
585 # method spawns a subprocess, the subprocess shouldn't have
35976
81c944c3d13a [Bug #1222790] Set reuse-address and close-on-exec flags on the HTTP listening socket
Andrew M. Kuchling <amk@amk.ca>
parents: 35276
diff changeset
586 # the listening socket open.
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
587 if fcntl is not None and hasattr(fcntl, 'FD_CLOEXEC'):
35976
81c944c3d13a [Bug #1222790] Set reuse-address and close-on-exec flags on the HTTP listening socket
Andrew M. Kuchling <amk@amk.ca>
parents: 35276
diff changeset
588 flags = fcntl.fcntl(self.fileno(), fcntl.F_GETFD)
81c944c3d13a [Bug #1222790] Set reuse-address and close-on-exec flags on the HTTP listening socket
Andrew M. Kuchling <amk@amk.ca>
parents: 35276
diff changeset
589 flags |= fcntl.FD_CLOEXEC
81c944c3d13a [Bug #1222790] Set reuse-address and close-on-exec flags on the HTTP listening socket
Andrew M. Kuchling <amk@amk.ca>
parents: 35276
diff changeset
590 fcntl.fcntl(self.fileno(), fcntl.F_SETFD, flags)
81c944c3d13a [Bug #1222790] Set reuse-address and close-on-exec flags on the HTTP listening socket
Andrew M. Kuchling <amk@amk.ca>
parents: 35276
diff changeset
591
57751
7eb050c0e654 Merged revisions 74558 via svnmerge from
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55997
diff changeset
592 class MultiPathXMLRPCServer(SimpleXMLRPCServer):
7eb050c0e654 Merged revisions 74558 via svnmerge from
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55997
diff changeset
593 """Multipath XML-RPC Server
7eb050c0e654 Merged revisions 74558 via svnmerge from
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55997
diff changeset
594 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
595 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
596 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
597 '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
598 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
599 """
7eb050c0e654 Merged revisions 74558 via svnmerge from
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55997
diff changeset
600 def __init__(self, addr, requestHandler=SimpleXMLRPCRequestHandler,
7eb050c0e654 Merged revisions 74558 via svnmerge from
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55997
diff changeset
601 logRequests=True, allow_none=False, encoding=None, bind_and_activate=True):
7eb050c0e654 Merged revisions 74558 via svnmerge from
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55997
diff changeset
602
7eb050c0e654 Merged revisions 74558 via svnmerge from
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55997
diff changeset
603 SimpleXMLRPCServer.__init__(self, addr, requestHandler, logRequests, allow_none,
7eb050c0e654 Merged revisions 74558 via svnmerge from
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55997
diff changeset
604 encoding, bind_and_activate)
7eb050c0e654 Merged revisions 74558 via svnmerge from
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55997
diff changeset
605 self.dispatchers = {}
7eb050c0e654 Merged revisions 74558 via svnmerge from
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55997
diff changeset
606 self.allow_none = allow_none
73213
f3d454b20b35 Closes #13291: NameError in xmlrpc package.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 73165
diff changeset
607 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
608
7eb050c0e654 Merged revisions 74558 via svnmerge from
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55997
diff changeset
609 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
610 self.dispatchers[path] = dispatcher
7eb050c0e654 Merged revisions 74558 via svnmerge from
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55997
diff changeset
611 return dispatcher
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 get_dispatcher(self, path):
7eb050c0e654 Merged revisions 74558 via svnmerge from
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55997
diff changeset
614 return self.dispatchers[path]
7eb050c0e654 Merged revisions 74558 via svnmerge from
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55997
diff changeset
615
7eb050c0e654 Merged revisions 74558 via svnmerge from
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55997
diff changeset
616 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
617 try:
7eb050c0e654 Merged revisions 74558 via svnmerge from
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55997
diff changeset
618 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
619 data, dispatch_method, path)
7eb050c0e654 Merged revisions 74558 via svnmerge from
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55997
diff changeset
620 except:
7eb050c0e654 Merged revisions 74558 via svnmerge from
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55997
diff changeset
621 # 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
622 # (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
623 # exceptions)
7eb050c0e654 Merged revisions 74558 via svnmerge from
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55997
diff changeset
624 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
625 response = dumps(
f3d454b20b35 Closes #13291: NameError in xmlrpc package.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 73165
diff changeset
626 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
627 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
628 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
629 return response
7eb050c0e654 Merged revisions 74558 via svnmerge from
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 55997
diff changeset
630
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
631 class CGIXMLRPCRequestHandler(SimpleXMLRPCDispatcher):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
632 """Simple handler for XML-RPC data passed through CGI."""
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
633
35982
03ae0b8eb6cb [Patch #1039083] Add 'encoding' parameter to SimpleXMLRPCServer
Andrew M. Kuchling <amk@amk.ca>
parents: 35981
diff changeset
634 def __init__(self, allow_none=False, encoding=None):
03ae0b8eb6cb [Patch #1039083] Add 'encoding' parameter to SimpleXMLRPCServer
Andrew M. Kuchling <amk@amk.ca>
parents: 35981
diff changeset
635 SimpleXMLRPCDispatcher.__init__(self, allow_none, encoding)
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
636
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
637 def handle_xmlrpc(self, request_text):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
638 """Handle a single XML-RPC request"""
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
639
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
640 response = self._marshaled_dispatch(request_text)
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
641
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
642 print('Content-Type: text/xml')
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
643 print('Content-Length: %d' % len(response))
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
644 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
645 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
646 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
647 sys.stdout.buffer.flush()
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 def handle_get(self):
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
650 """Handle a single HTTP GET request.
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
651
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
652 Default implementation indicates an error because
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
653 XML-RPC uses the POST method.
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
654 """
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
655
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
656 code = 400
47318
e1fcc3881cb6 Create http package. #2883.
Georg Brandl <georg@python.org>
parents: 47288
diff changeset
657 message, explain = BaseHTTPRequestHandler.responses[code]
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
658
47318
e1fcc3881cb6 Create http package. #2883.
Georg Brandl <georg@python.org>
parents: 47288
diff changeset
659 response = http.server.DEFAULT_ERROR_MESSAGE % \
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
660 {
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
661 'code' : code,
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
662 'message' : message,
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
663 'explain' : explain
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
664 }
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
665 response = response.encode('utf-8')
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
666 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
667 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
668 print('Content-Length: %d' % len(response))
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
669 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
670 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
671 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
672 sys.stdout.buffer.flush()
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
673
56002
fa91270b6087 Merged revisions 74821,74828-74831,74833,74835 via svnmerge from
Georg Brandl <georg@python.org>
parents: 52950
diff changeset
674 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
675 """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
676
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
677 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
678 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
679 headers.
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
680 """
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
681
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
682 if request_text is None and \
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
683 os.environ.get('REQUEST_METHOD', None) == 'GET':
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
684 self.handle_get()
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
685 else:
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
686 # POST data is normally available through stdin
52638
acfc18cdcdfb Merged revisions 70940 via svnmerge
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
687 try:
acfc18cdcdfb Merged revisions 70940 via svnmerge
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
688 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
689 except (ValueError, TypeError):
52638
acfc18cdcdfb Merged revisions 70940 via svnmerge
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
690 length = -1
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
691 if request_text is None:
52638
acfc18cdcdfb Merged revisions 70940 via svnmerge
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
692 request_text = sys.stdin.read(length)
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
693
27249
7c34e5bf2e22 Patch #473586: Implement CGIXMLRPCRequestHandler.
Martin v. Löwis <martin@v.loewis.de>
parents: 20174
diff changeset
694 self.handle_xmlrpc(request_text)
27507
d9d57f5f98cd Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 27249
diff changeset
695
47288
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 # -----------------------------------------------------------------------------
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
698 # Self documenting XML-RPC 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 class ServerHTMLDoc(pydoc.HTMLDoc):
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
701 """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
702
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
703 def markup(self, text, escape=None, funcs={}, classes={}, methods={}):
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
704 """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
705 Each context dictionary maps object names to anchor names."""
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
706 escape = escape or self.escape
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
707 results = []
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
708 here = 0
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
709
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
710 # 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
711 # hyperlinking of arbitrary strings being used as method
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
712 # names. Only methods with names consisting of word characters
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
713 # and '.'s are hyperlinked.
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
714 pattern = re.compile(r'\b((http|ftp)://\S+[\w/]|'
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
715 r'RFC[- ]?(\d+)|'
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
716 r'PEP[- ]?(\d+)|'
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
717 r'(self\.)?((?:\w|\.)+))\b')
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
718 while 1:
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
719 match = pattern.search(text, here)
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
720 if not match: break
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
721 start, end = match.span()
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
722 results.append(escape(text[here:start]))
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
723
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
724 all, scheme, rfc, pep, selfdot, name = match.groups()
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
725 if scheme:
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
726 url = escape(all).replace('"', '&quot;')
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
727 results.append('<a href="%s">%s</a>' % (url, url))
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
728 elif rfc:
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
729 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
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 pep:
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
732 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
733 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
734 elif text[end:end+1] == '(':
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
735 results.append(self.namelink(name, methods, funcs, classes))
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
736 elif selfdot:
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
737 results.append('self.<strong>%s</strong>' % name)
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
738 else:
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
739 results.append(self.namelink(name, classes))
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
740 here = end
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
741 results.append(escape(text[here:]))
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
742 return ''.join(results)
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
743
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
744 def docroutine(self, object, name, mod=None,
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
745 funcs={}, classes={}, methods={}, cl=None):
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
746 """Produce HTML documentation for a function or method object."""
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 anchor = (cl and cl.__name__ or '') + '-' + name
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
749 note = ''
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 title = '<a name="%s"><strong>%s</strong></a>' % (
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
752 self.escape(anchor), self.escape(name))
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
753
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
754 if inspect.ismethod(object):
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
755 args, varargs, varkw, defaults = inspect.getargspec(object)
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
756 # 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
757 # confusing to the non-Python user
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
758 argspec = inspect.formatargspec (
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
759 args[1:],
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
760 varargs,
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
761 varkw,
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
762 defaults,
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
763 formatvalue=self.formatvalue
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
764 )
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
765 elif inspect.isfunction(object):
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
766 args, varargs, varkw, defaults = inspect.getargspec(object)
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
767 argspec = inspect.formatargspec(
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
768 args, varargs, varkw, defaults, formatvalue=self.formatvalue)
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,
47288
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
930 bind_and_activate=True):
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
931 SimpleXMLRPCServer.__init__(self, addr, requestHandler, logRequests,
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
932 allow_none, encoding, bind_and_activate)
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
933 XMLRPCDocGenerator.__init__(self)
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
934
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
935 class DocCGIXMLRPCRequestHandler( CGIXMLRPCRequestHandler,
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
936 XMLRPCDocGenerator):
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
937 """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
938 CGI"""
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
939
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
940 def handle_get(self):
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
941 """Handles the HTTP GET request.
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
942
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
943 Interpret all HTTP GET requests as requests for server
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
944 documentation.
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
945 """
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
946
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
947 response = self.generate_html_documentation().encode('utf-8')
47288
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
948
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
949 print('Content-Type: text/html')
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
950 print('Content-Length: %d' % len(response))
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
951 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
952 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
953 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
954 sys.stdout.buffer.flush()
47288
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
955
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
956 def __init__(self):
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
957 CGIXMLRPCRequestHandler.__init__(self)
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
958 XMLRPCDocGenerator.__init__(self)
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
959
346a99df5889 Create xmlrpc package. Issue #2886.
Georg Brandl <georg@python.org>
parents: 46933
diff changeset
960
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
961 if __name__ == '__main__':
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
962 print('Running XML-RPC server on port 8000')
19937
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
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')
896f2d1e2f46 Brian Quinlan's XML-RPC server framework.
Fredrik Lundh <fredrik@pythonware.com>
parents:
diff changeset
966 server.serve_forever()