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