Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 9783b44

Browse files
committed
Merge heads
2 parents cd06a14 + 93dfee1 commit 9783b44

4 files changed

Lines changed: 71 additions & 43 deletions

File tree

Lib/test/test_xmlrpc.py

Lines changed: 53 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -66,15 +66,6 @@ def test_datetime_before_1900(self):
6666
(newdt,), m = xmlrpclib.loads(s, use_datetime=0)
6767
self.assertEqual(newdt, xmlrpclib.DateTime('00010210T11:41:23'))
6868

69-
def test_cmp_datetime_DateTime(self):
70-
now = datetime.datetime.now()
71-
dt = xmlrpclib.DateTime(now.timetuple())
72-
self.assertTrue(dt == now)
73-
self.assertTrue(now == dt)
74-
then = now + datetime.timedelta(seconds=4)
75-
self.assertTrue(then >= dt)
76-
self.assertTrue(dt < then)
77-
7869
def test_bug_1164912 (self):
7970
d = xmlrpclib.DateTime()
8071
((new_d,), dummy) = xmlrpclib.loads(xmlrpclib.dumps((d,),
@@ -149,6 +140,9 @@ def test_get_host_info(self):
149140
('host.tld',
150141
[('Authorization', 'Basic dXNlcg==')], {}))
151142

143+
def test_dump_bytes(self):
144+
self.assertRaises(TypeError, xmlrpclib.dumps, (b"my dog has fleas",))
145+
152146
def test_ssl_presence(self):
153147
try:
154148
import ssl
@@ -186,7 +180,7 @@ def test_dump_fault(self):
186180
self.assertRaises(xmlrpclib.Fault, xmlrpclib.loads, s)
187181

188182
def test_dotted_attribute(self):
189-
# this will raise AttirebuteError because code don't want us to use
183+
# this will raise AttributeError because code don't want us to use
190184
# private methods
191185
self.assertRaises(AttributeError,
192186
xmlrpc.server.resolve_dotted_attribute, str, '__add')
@@ -233,6 +227,45 @@ def test_decode(self):
233227
t2 = xmlrpclib._datetime(d)
234228
self.assertEqual(t1, tref)
235229

230+
def test_comparison(self):
231+
now = datetime.datetime.now()
232+
dtime = xmlrpclib.DateTime(now.timetuple())
233+
234+
# datetime vs. DateTime
235+
self.assertTrue(dtime == now)
236+
self.assertTrue(now == dtime)
237+
then = now + datetime.timedelta(seconds=4)
238+
self.assertTrue(then >= dtime)
239+
self.assertTrue(dtime < then)
240+
241+
# str vs. DateTime
242+
dstr = now.strftime("%Y%m%dT%H:%M:%S")
243+
self.assertTrue(dtime == dstr)
244+
self.assertTrue(dstr == dtime)
245+
dtime_then = xmlrpclib.DateTime(then.timetuple())
246+
self.assertTrue(dtime_then >= dstr)
247+
self.assertTrue(dstr < dtime_then)
248+
249+
# some other types
250+
dbytes = dstr.encode('ascii')
251+
dtuple = now.timetuple()
252+
with self.assertRaises(TypeError):
253+
dtime == 1970
254+
with self.assertRaises(TypeError):
255+
dtime != dbytes
256+
with self.assertRaises(TypeError):
257+
dtime == bytearray(dbytes)
258+
with self.assertRaises(TypeError):
259+
dtime != dtuple
260+
with self.assertRaises(TypeError):
261+
dtime < float(1970)
262+
with self.assertRaises(TypeError):
263+
dtime > dbytes
264+
with self.assertRaises(TypeError):
265+
dtime <= bytearray(dbytes)
266+
with self.assertRaises(TypeError):
267+
dtime >= dtuple
268+
236269
class BinaryTestCase(unittest.TestCase):
237270

238271
# XXX What should str(Binary(b"\xff")) return? I'm chosing "\xff"
@@ -346,6 +379,10 @@ def get_request(self):
346379
class MyRequestHandler(requestHandler):
347380
rpc_paths = []
348381

382+
class BrokenDispatcher:
383+
def _marshaled_dispatch(self, data, dispatch_method=None, path=None):
384+
raise RuntimeError("broken dispatcher")
385+
349386
serv = MyXMLRPCServer(("localhost", 0), MyRequestHandler,
350387
logRequests=False, bind_and_activate=False)
351388
serv.socket.settimeout(3)
@@ -366,6 +403,7 @@ class MyRequestHandler(requestHandler):
366403
d.register_multicall_functions()
367404
serv.get_dispatcher(paths[0]).register_function(pow)
368405
serv.get_dispatcher(paths[1]).register_function(lambda x,y: x+y, 'add')
406+
serv.add_dispatcher("/is/broken", BrokenDispatcher())
369407
evt.set()
370408

371409
# handle up to 'numrequests' requests
@@ -595,11 +633,16 @@ def test_path1(self):
595633
p = xmlrpclib.ServerProxy(URL+"/foo")
596634
self.assertEqual(p.pow(6,8), 6**8)
597635
self.assertRaises(xmlrpclib.Fault, p.add, 6, 8)
636+
598637
def test_path2(self):
599638
p = xmlrpclib.ServerProxy(URL+"/foo/bar")
600639
self.assertEqual(p.add(6,8), 6+8)
601640
self.assertRaises(xmlrpclib.Fault, p.pow, 6, 8)
602641

642+
def test_path3(self):
643+
p = xmlrpclib.ServerProxy(URL+"/is/broken")
644+
self.assertRaises(xmlrpclib.Fault, p.add, 6, 8)
645+
603646
#A test case that verifies that a server using the HTTP/1.1 keep-alive mechanism
604647
#does indeed serve subsequent requests on the same connection
605648
class BaseKeepaliveServerTestCase(BaseServerTestCase):

Lib/xmlrpc/client.py

Lines changed: 8 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -85,11 +85,6 @@
8585
# OF THIS SOFTWARE.
8686
# --------------------------------------------------------------------
8787

88-
#
89-
# things to look into some day:
90-
91-
# TODO: sort out True/False/boolean issues for Python 2.3
92-
9388
"""
9489
An XML-RPC client interface for Python.
9590
@@ -120,8 +115,7 @@
120115
121116
Exported constants:
122117
123-
True
124-
False
118+
(none)
125119
126120
Exported functions:
127121
@@ -133,7 +127,8 @@
133127
name (None if not present).
134128
"""
135129

136-
import re, time, operator
130+
import base64
131+
import time
137132
import http.client
138133
from xml.parsers import expat
139134
import socket
@@ -230,7 +225,7 @@ class ResponseError(Error):
230225
##
231226
# Indicates an XML-RPC fault response package. This exception is
232227
# raised by the unmarshalling layer, if the XML-RPC response contains
233-
# a fault string. This exception can also used as a class, to
228+
# a fault string. This exception can also be used as a class, to
234229
# generate a fault XML-RPC message.
235230
#
236231
# @param faultCode The XML-RPC fault code.
@@ -243,10 +238,7 @@ def __init__(self, faultCode, faultString, **extra):
243238
self.faultCode = faultCode
244239
self.faultString = faultString
245240
def __repr__(self):
246-
return (
247-
"<Fault %s: %s>" %
248-
(self.faultCode, repr(self.faultString))
249-
)
241+
return "<Fault %s: %r>" % (self.faultCode, self.faultString)
250242

251243
# --------------------------------------------------------------------
252244
# Special values
@@ -302,7 +294,7 @@ def make_comparable(self, other):
302294
elif datetime and isinstance(other, datetime.datetime):
303295
s = self.value
304296
o = other.strftime("%Y%m%dT%H:%M:%S")
305-
elif isinstance(other, (str, unicode)):
297+
elif isinstance(other, str):
306298
s = self.value
307299
o = other
308300
elif hasattr(other, "timetuple"):
@@ -352,7 +344,7 @@ def __str__(self):
352344
return self.value
353345

354346
def __repr__(self):
355-
return "<DateTime %s at %x>" % (repr(self.value), id(self))
347+
return "<DateTime %r at %x>" % (self.value, id(self))
356348

357349
def decode(self, data):
358350
self.value = str(data).strip()
@@ -378,9 +370,6 @@ def _datetime_type(data):
378370
#
379371
# @param data An 8-bit string containing arbitrary data.
380372

381-
import base64
382-
import io
383-
384373
class Binary:
385374
"""Wrapper for binary data."""
386375

@@ -514,9 +503,7 @@ def __dump(self, value, write):
514503
f = self.dispatch[type(value)]
515504
except KeyError:
516505
# check if this object can be marshalled as a structure
517-
try:
518-
value.__dict__
519-
except:
506+
if not hasattr(value, '__dict__'):
520507
raise TypeError("cannot marshal %s objects" % type(value))
521508
# check if this class is a sub-class of a basic type,
522509
# because we don't know how to marshal these types
@@ -564,12 +551,6 @@ def dump_double(self, value, write):
564551
write("</double></value>\n")
565552
dispatch[float] = dump_double
566553

567-
def dump_string(self, value, write, escape=escape):
568-
write("<value><string>")
569-
write(escape(value))
570-
write("</string></value>\n")
571-
dispatch[bytes] = dump_string
572-
573554
def dump_unicode(self, value, write, escape=escape):
574555
write("<value><string>")
575556
write(escape(value))
@@ -1198,7 +1179,6 @@ def get_host_info(self, host):
11981179
auth, host = urllib.parse.splituser(host)
11991180

12001181
if auth:
1201-
import base64
12021182
auth = urllib.parse.unquote_to_bytes(auth)
12031183
auth = base64.encodebytes(auth).decode("utf-8")
12041184
auth = "".join(auth.split()) # get rid of whitespace

Lib/xmlrpc/server.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,6 @@ def system_methodHelp(self, method_name):
329329
if method is None:
330330
return ""
331331
else:
332-
import pydoc
333332
return pydoc.getdoc(method)
334333

335334
def system_multicall(self, call_list):
@@ -560,7 +559,7 @@ class SimpleXMLRPCServer(socketserver.TCPServer,
560559
Simple XML-RPC server that allows functions and a single instance
561560
to be installed to handle requests. The default implementation
562561
attempts to dispatch XML-RPC calls to the functions or instance
563-
installed in the server. Override the _dispatch method inhereted
562+
installed in the server. Override the _dispatch method inherited
564563
from SimpleXMLRPCDispatcher to change this behavior.
565564
"""
566565

@@ -602,7 +601,7 @@ def __init__(self, addr, requestHandler=SimpleXMLRPCRequestHandler,
602601
encoding, bind_and_activate)
603602
self.dispatchers = {}
604603
self.allow_none = allow_none
605-
self.encoding = encoding
604+
self.encoding = encoding or 'utf-8'
606605

607606
def add_dispatcher(self, path, dispatcher):
608607
self.dispatchers[path] = dispatcher
@@ -620,9 +619,10 @@ def _marshaled_dispatch(self, data, dispatch_method = None, path = None):
620619
# (each dispatcher should have handled their own
621620
# exceptions)
622621
exc_type, exc_value = sys.exc_info()[:2]
623-
response = xmlrpclib.dumps(
624-
xmlrpclib.Fault(1, "%s:%s" % (exc_type, exc_value)),
622+
response = dumps(
623+
Fault(1, "%s:%s" % (exc_type, exc_value)),
625624
encoding=self.encoding, allow_none=self.allow_none)
625+
response = response.encode(self.encoding)
626626
return response
627627

628628
class CGIXMLRPCRequestHandler(SimpleXMLRPCDispatcher):

Misc/NEWS

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,11 @@ Core and Builtins
6666
Library
6767
-------
6868

69+
- Issue #13293: Better error message when trying to marshal bytes using
70+
xmlrpc.client.
71+
72+
- Issue #13291: NameError in xmlrpc package.
73+
6974
- Issue #13258: Use callable() built-in in the standard library.
7075

7176
- Issue #13273: fix a bug that prevented HTMLParser to properly detect some

0 commit comments

Comments
 (0)