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

Skip to content

Commit 3fa29f7

Browse files
committed
Closes #13291: NameError in xmlrpc package.
1 parent 2b50a01 commit 3fa29f7

4 files changed

Lines changed: 56 additions & 13 deletions

File tree

Lib/test/test_xmlrpc.py

Lines changed: 49 additions & 9 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,),
@@ -233,6 +224,45 @@ def test_decode(self):
233224
t2 = xmlrpclib._datetime(d)
234225
self.assertEqual(t1, tref)
235226

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

238268
# XXX What should str(Binary(b"\xff")) return? I'm chosing "\xff"
@@ -346,6 +376,10 @@ def get_request(self):
346376
class MyRequestHandler(requestHandler):
347377
rpc_paths = []
348378

379+
class BrokenDispatcher:
380+
def _marshaled_dispatch(self, data, dispatch_method=None, path=None):
381+
raise RuntimeError("broken dispatcher")
382+
349383
serv = MyXMLRPCServer(("localhost", 0), MyRequestHandler,
350384
logRequests=False, bind_and_activate=False)
351385
serv.socket.settimeout(3)
@@ -366,6 +400,7 @@ class MyRequestHandler(requestHandler):
366400
d.register_multicall_functions()
367401
serv.get_dispatcher(paths[0]).register_function(pow)
368402
serv.get_dispatcher(paths[1]).register_function(lambda x,y: x+y, 'add')
403+
serv.add_dispatcher("/is/broken", BrokenDispatcher())
369404
evt.set()
370405

371406
# handle up to 'numrequests' requests
@@ -595,11 +630,16 @@ def test_path1(self):
595630
p = xmlrpclib.ServerProxy(URL+"/foo")
596631
self.assertEqual(p.pow(6,8), 6**8)
597632
self.assertRaises(xmlrpclib.Fault, p.add, 6, 8)
633+
598634
def test_path2(self):
599635
p = xmlrpclib.ServerProxy(URL+"/foo/bar")
600636
self.assertEqual(p.add(6,8), 6+8)
601637
self.assertRaises(xmlrpclib.Fault, p.pow, 6, 8)
602638

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

Lib/xmlrpc/client.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -302,7 +302,7 @@ def make_comparable(self, other):
302302
elif datetime and isinstance(other, datetime.datetime):
303303
s = self.value
304304
o = other.strftime("%Y%m%dT%H:%M:%S")
305-
elif isinstance(other, (str, unicode)):
305+
elif isinstance(other, str):
306306
s = self.value
307307
o = other
308308
elif hasattr(other, "timetuple"):

Lib/xmlrpc/server.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -602,7 +602,7 @@ def __init__(self, addr, requestHandler=SimpleXMLRPCRequestHandler,
602602
encoding, bind_and_activate)
603603
self.dispatchers = {}
604604
self.allow_none = allow_none
605-
self.encoding = encoding
605+
self.encoding = encoding or 'utf-8'
606606

607607
def add_dispatcher(self, path, dispatcher):
608608
self.dispatchers[path] = dispatcher
@@ -620,9 +620,10 @@ def _marshaled_dispatch(self, data, dispatch_method = None, path = None):
620620
# (each dispatcher should have handled their own
621621
# exceptions)
622622
exc_type, exc_value = sys.exc_info()[:2]
623-
response = xmlrpclib.dumps(
624-
xmlrpclib.Fault(1, "%s:%s" % (exc_type, exc_value)),
623+
response = dumps(
624+
Fault(1, "%s:%s" % (exc_type, exc_value)),
625625
encoding=self.encoding, allow_none=self.allow_none)
626+
response = response.encode(self.encoding)
626627
return response
627628

628629
class CGIXMLRPCRequestHandler(SimpleXMLRPCDispatcher):

Misc/NEWS

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ Core and Builtins
6363
Library
6464
-------
6565

66+
- Issue #13291: NameError in xmlrpc package.
67+
6668
- Issue #13258: Use callable() built-in in the standard library.
6769

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

0 commit comments

Comments
 (0)