1 import sys
2 from cherrypy._cpcompat import py3k
3
4 try:
5 from xmlrpclib import DateTime, Fault, ProtocolError, ServerProxy, SafeTransport
6 except ImportError:
7 from xmlrpc.client import DateTime, Fault, ProtocolError, ServerProxy, SafeTransport
8
9 if py3k:
10 HTTPSTransport = SafeTransport
11
12
13 import socket
14 if not hasattr(socket, "ssl"):
15 socket.ssl = True
16 else:
18 """Subclass of SafeTransport to fix sock.recv errors (by using file)."""
19
20 - def request(self, host, handler, request_body, verbose=0):
21
22 h = self.make_connection(host)
23 if verbose:
24 h.set_debuglevel(1)
25
26 self.send_request(h, handler, request_body)
27 self.send_host(h, host)
28 self.send_user_agent(h)
29 self.send_content(h, request_body)
30
31 errcode, errmsg, headers = h.getreply()
32 if errcode != 200:
33 raise ProtocolError(host + handler, errcode, errmsg, headers)
34
35 self.verbose = verbose
36
37
38
39
40
41
42
43
44 return self.parse_response(h.getfile())
45
46 import cherrypy
47
48
50 from cherrypy import _cptools
51
52 class Root:
53 def index(self):
54 return "I'm a standard index!"
55 index.exposed = True
56
57
58 class XmlRpc(_cptools.XMLRPCController):
59
60 def foo(self):
61 return "Hello world!"
62 foo.exposed = True
63
64 def return_single_item_list(self):
65 return [42]
66 return_single_item_list.exposed = True
67
68 def return_string(self):
69 return "here is a string"
70 return_string.exposed = True
71
72 def return_tuple(self):
73 return ('here', 'is', 1, 'tuple')
74 return_tuple.exposed = True
75
76 def return_dict(self):
77 return dict(a=1, b=2, c=3)
78 return_dict.exposed = True
79
80 def return_composite(self):
81 return dict(a=1,z=26), 'hi', ['welcome', 'friend']
82 return_composite.exposed = True
83
84 def return_int(self):
85 return 42
86 return_int.exposed = True
87
88 def return_float(self):
89 return 3.14
90 return_float.exposed = True
91
92 def return_datetime(self):
93 return DateTime((2003, 10, 7, 8, 1, 0, 1, 280, -1))
94 return_datetime.exposed = True
95
96 def return_boolean(self):
97 return True
98 return_boolean.exposed = True
99
100 def test_argument_passing(self, num):
101 return num * 2
102 test_argument_passing.exposed = True
103
104 def test_returning_Fault(self):
105 return Fault(1, "custom Fault response")
106 test_returning_Fault.exposed = True
107
108 root = Root()
109 root.xmlrpc = XmlRpc()
110 cherrypy.tree.mount(root, config={'/': {
111 'request.dispatch': cherrypy.dispatch.XMLRPCDispatcher(),
112 'tools.xmlrpc.allow_none': 0,
113 }})
114
115
116 from cherrypy.test import helper
117
119 setup_server = staticmethod(setup_server)
121
122 scheme = self.scheme
123 if scheme == "https":
124 url = 'https://%s:%s/xmlrpc/' % (self.interface(), self.PORT)
125 proxy = ServerProxy(url, transport=HTTPSTransport())
126 else:
127 url = 'http://%s:%s/xmlrpc/' % (self.interface(), self.PORT)
128 proxy = ServerProxy(url)
129
130
131 self.getPage("/xmlrpc/foo")
132 self.assertBody("Hello world!")
133
134 self.assertEqual(proxy.return_single_item_list(), [42])
135 self.assertNotEqual(proxy.return_single_item_list(), 'one bazillion')
136 self.assertEqual(proxy.return_string(), "here is a string")
137 self.assertEqual(proxy.return_tuple(), list(('here', 'is', 1, 'tuple')))
138 self.assertEqual(proxy.return_dict(), {'a': 1, 'c': 3, 'b': 2})
139 self.assertEqual(proxy.return_composite(),
140 [{'a': 1, 'z': 26}, 'hi', ['welcome', 'friend']])
141 self.assertEqual(proxy.return_int(), 42)
142 self.assertEqual(proxy.return_float(), 3.14)
143 self.assertEqual(proxy.return_datetime(),
144 DateTime((2003, 10, 7, 8, 1, 0, 1, 280, -1)))
145 self.assertEqual(proxy.return_boolean(), True)
146 self.assertEqual(proxy.test_argument_passing(22), 22 * 2)
147
148
149 try:
150 proxy.test_argument_passing({})
151 except Exception:
152 x = sys.exc_info()[1]
153 self.assertEqual(x.__class__, Fault)
154 self.assertEqual(x.faultString, ("unsupported operand type(s) "
155 "for *: 'dict' and 'int'"))
156 else:
157 self.fail("Expected xmlrpclib.Fault")
158
159
160
161 try:
162 proxy.non_method()
163 except Exception:
164 x = sys.exc_info()[1]
165 self.assertEqual(x.__class__, Fault)
166 self.assertEqual(x.faultString, 'method "non_method" is not supported')
167 else:
168 self.fail("Expected xmlrpclib.Fault")
169
170
171 try:
172 proxy.test_returning_Fault()
173 except Exception:
174 x = sys.exc_info()[1]
175 self.assertEqual(x.__class__, Fault)
176 self.assertEqual(x.faultString, ("custom Fault response"))
177 else:
178 self.fail("Expected xmlrpclib.Fault")
179