Skip to content

Commit f3acd68

Browse files
CPython developersyouknowone
authored andcommitted
update {test_}xmlrpc from CPython 3.10.5
1 parent 3d27f16 commit f3acd68

File tree

3 files changed

+91
-36
lines changed

3 files changed

+91
-36
lines changed

Lib/test/test_xmlrpc.py

Lines changed: 63 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
from test.support import os_helper
1919
from test.support import socket_helper
2020
from test.support import threading_helper
21+
from test.support import ALWAYS_EQ, LARGEST, SMALLEST
2122

2223
try:
2324
import gzip
@@ -559,14 +560,10 @@ def test_comparison(self):
559560
# some other types
560561
dbytes = dstr.encode('ascii')
561562
dtuple = now.timetuple()
562-
with self.assertRaises(TypeError):
563-
dtime == 1970
564-
with self.assertRaises(TypeError):
565-
dtime != dbytes
566-
with self.assertRaises(TypeError):
567-
dtime == bytearray(dbytes)
568-
with self.assertRaises(TypeError):
569-
dtime != dtuple
563+
self.assertFalse(dtime == 1970)
564+
self.assertTrue(dtime != dbytes)
565+
self.assertFalse(dtime == bytearray(dbytes))
566+
self.assertTrue(dtime != dtuple)
570567
with self.assertRaises(TypeError):
571568
dtime < float(1970)
572569
with self.assertRaises(TypeError):
@@ -576,9 +573,21 @@ def test_comparison(self):
576573
with self.assertRaises(TypeError):
577574
dtime >= dtuple
578575

576+
self.assertTrue(dtime == ALWAYS_EQ)
577+
self.assertFalse(dtime != ALWAYS_EQ)
578+
self.assertTrue(dtime < LARGEST)
579+
self.assertFalse(dtime > LARGEST)
580+
self.assertTrue(dtime <= LARGEST)
581+
self.assertFalse(dtime >= LARGEST)
582+
self.assertFalse(dtime < SMALLEST)
583+
self.assertTrue(dtime > SMALLEST)
584+
self.assertFalse(dtime <= SMALLEST)
585+
self.assertTrue(dtime >= SMALLEST)
586+
587+
579588
class BinaryTestCase(unittest.TestCase):
580589

581-
# XXX What should str(Binary(b"\xff")) return? I'm chosing "\xff"
590+
# XXX What should str(Binary(b"\xff")) return? I'm choosing "\xff"
582591
# for now (i.e. interpreting the binary data as Latin-1-encoded
583592
# text). But this feels very unsatisfactory. Perhaps we should
584593
# only define repr(), and return r"Binary(b'\xff')" instead?
@@ -665,7 +674,7 @@ def _(x, y):
665674
serv.handle_request()
666675
numrequests -= 1
667676

668-
except socket.timeout:
677+
except TimeoutError:
669678
pass
670679
finally:
671680
serv.socket.close()
@@ -715,11 +724,16 @@ def _marshaled_dispatch(self, data, dispatch_method=None, path=None):
715724
#on AF_INET only.
716725
URL = "http://%s:%d"%(ADDR, PORT)
717726
serv.server_activate()
718-
paths = ["/foo", "/foo/bar"]
727+
paths = [
728+
"/foo", "/foo/bar",
729+
"/foo?k=v", "/foo#frag", "/foo?k=v#frag",
730+
"", "/", "/RPC2", "?k=v", "#frag",
731+
]
719732
for path in paths:
720733
d = serv.add_dispatcher(path, xmlrpc.server.SimpleXMLRPCDispatcher())
721734
d.register_introspection_functions()
722735
d.register_multicall_functions()
736+
d.register_function(lambda p=path: p, 'test')
723737
serv.get_dispatcher(paths[0]).register_function(pow)
724738
serv.get_dispatcher(paths[1]).register_function(lambda x,y: x+y, 'add')
725739
serv.add_dispatcher("/is/broken", BrokenDispatcher())
@@ -730,7 +744,7 @@ def _marshaled_dispatch(self, data, dispatch_method=None, path=None):
730744
serv.handle_request()
731745
numrequests -= 1
732746

733-
except socket.timeout:
747+
except TimeoutError:
734748
pass
735749
finally:
736750
serv.socket.close()
@@ -1073,6 +1087,39 @@ def test_path3(self):
10731087
p = xmlrpclib.ServerProxy(URL+"/is/broken")
10741088
self.assertRaises(xmlrpclib.Fault, p.add, 6, 8)
10751089

1090+
def test_invalid_path(self):
1091+
p = xmlrpclib.ServerProxy(URL+"/invalid")
1092+
self.assertRaises(xmlrpclib.Fault, p.add, 6, 8)
1093+
1094+
def test_path_query_fragment(self):
1095+
p = xmlrpclib.ServerProxy(URL+"/foo?k=v#frag")
1096+
self.assertEqual(p.test(), "/foo?k=v#frag")
1097+
1098+
def test_path_fragment(self):
1099+
p = xmlrpclib.ServerProxy(URL+"/foo#frag")
1100+
self.assertEqual(p.test(), "/foo#frag")
1101+
1102+
def test_path_query(self):
1103+
p = xmlrpclib.ServerProxy(URL+"/foo?k=v")
1104+
self.assertEqual(p.test(), "/foo?k=v")
1105+
1106+
def test_empty_path(self):
1107+
p = xmlrpclib.ServerProxy(URL)
1108+
self.assertEqual(p.test(), "/RPC2")
1109+
1110+
def test_root_path(self):
1111+
p = xmlrpclib.ServerProxy(URL + "/")
1112+
self.assertEqual(p.test(), "/")
1113+
1114+
def test_empty_path_query(self):
1115+
p = xmlrpclib.ServerProxy(URL + "?k=v")
1116+
self.assertEqual(p.test(), "?k=v")
1117+
1118+
def test_empty_path_fragment(self):
1119+
p = xmlrpclib.ServerProxy(URL + "#frag")
1120+
self.assertEqual(p.test(), "#frag")
1121+
1122+
10761123
#A test case that verifies that a server using the HTTP/1.1 keep-alive mechanism
10771124
#does indeed serve subsequent requests on the same connection
10781125
class BaseKeepaliveServerTestCase(BaseServerTestCase):
@@ -1544,16 +1591,10 @@ def test_xmlrpcserver_has_use_builtin_types_flag(self):
15441591
self.assertTrue(server.use_builtin_types)
15451592

15461593

1547-
@threading_helper.reap_threads
1548-
def test_main():
1549-
support.run_unittest(XMLRPCTestCase, HelperTestCase, DateTimeTestCase,
1550-
BinaryTestCase, FaultTestCase, UseBuiltinTypesTestCase,
1551-
SimpleServerTestCase, SimpleServerEncodingTestCase,
1552-
KeepaliveServerTestCase1, KeepaliveServerTestCase2,
1553-
GzipServerTestCase, GzipUtilTestCase, HeadersServerTestCase,
1554-
MultiPathServerTestCase, ServerProxyTestCase, FailingServerTestCase,
1555-
CGIHandlerTestCase, SimpleXMLRPCDispatcherTestCase)
1594+
def setUpModule():
1595+
thread_info = threading_helper.threading_setup()
1596+
unittest.addModuleCleanup(threading_helper.threading_cleanup, *thread_info)
15561597

15571598

15581599
if __name__ == "__main__":
1559-
test_main()
1600+
unittest.main()

Lib/xmlrpc/client.py

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -265,16 +265,22 @@ def __repr__(self):
265265

266266
# Issue #13305: different format codes across platforms
267267
_day0 = datetime(1, 1, 1)
268-
if _day0.strftime('%Y') == '0001': # Mac OS X
268+
def _try(fmt):
269+
try:
270+
return _day0.strftime(fmt) == '0001'
271+
except ValueError:
272+
return False
273+
if _try('%Y'): # Mac OS X
269274
def _iso8601_format(value):
270275
return value.strftime("%Y%m%dT%H:%M:%S")
271-
elif _day0.strftime('%4Y') == '0001': # Linux
276+
elif _try('%4Y'): # Linux
272277
def _iso8601_format(value):
273278
return value.strftime("%4Y%m%dT%H:%M:%S")
274279
else:
275280
def _iso8601_format(value):
276281
return value.strftime("%Y%m%dT%H:%M:%S").zfill(17)
277282
del _day0
283+
del _try
278284

279285

280286
def _strftime(value):
@@ -314,31 +320,38 @@ def make_comparable(self, other):
314320
s = self.timetuple()
315321
o = other.timetuple()
316322
else:
317-
otype = (hasattr(other, "__class__")
318-
and other.__class__.__name__
319-
or type(other))
320-
raise TypeError("Can't compare %s and %s" %
321-
(self.__class__.__name__, otype))
323+
s = self
324+
o = NotImplemented
322325
return s, o
323326

324327
def __lt__(self, other):
325328
s, o = self.make_comparable(other)
329+
if o is NotImplemented:
330+
return NotImplemented
326331
return s < o
327332

328333
def __le__(self, other):
329334
s, o = self.make_comparable(other)
335+
if o is NotImplemented:
336+
return NotImplemented
330337
return s <= o
331338

332339
def __gt__(self, other):
333340
s, o = self.make_comparable(other)
341+
if o is NotImplemented:
342+
return NotImplemented
334343
return s > o
335344

336345
def __ge__(self, other):
337346
s, o = self.make_comparable(other)
347+
if o is NotImplemented:
348+
return NotImplemented
338349
return s >= o
339350

340351
def __eq__(self, other):
341352
s, o = self.make_comparable(other)
353+
if o is NotImplemented:
354+
return NotImplemented
342355
return s == o
343356

344357
def timetuple(self):
@@ -436,7 +449,7 @@ def __init__(self, target):
436449
target.xml(encoding, None)
437450

438451
def feed(self, data):
439-
self._parser.Parse(data, 0)
452+
self._parser.Parse(data, False)
440453

441454
def close(self):
442455
try:
@@ -1415,15 +1428,16 @@ def __init__(self, uri, transport=None, encoding=None, verbose=False,
14151428
# establish a "logical" server connection
14161429

14171430
# get the url
1418-
type, uri = urllib.parse._splittype(uri)
1419-
if type not in ("http", "https"):
1431+
p = urllib.parse.urlsplit(uri)
1432+
if p.scheme not in ("http", "https"):
14201433
raise OSError("unsupported XML-RPC protocol")
1421-
self.__host, self.__handler = urllib.parse._splithost(uri)
1434+
self.__host = p.netloc
1435+
self.__handler = urllib.parse.urlunsplit(["", "", *p[2:]])
14221436
if not self.__handler:
14231437
self.__handler = "/RPC2"
14241438

14251439
if transport is None:
1426-
if type == "https":
1440+
if p.scheme == "https":
14271441
handler = SafeTransport
14281442
extra_kwargs = {"context": context}
14291443
else:

Lib/xmlrpc/server.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -732,7 +732,7 @@ def markup(self, text, escape=None, funcs={}, classes={}, methods={}):
732732
# hyperlinking of arbitrary strings being used as method
733733
# names. Only methods with names consisting of word characters
734734
# and '.'s are hyperlinked.
735-
pattern = re.compile(r'\b((http|ftp)://\S+[\w/]|'
735+
pattern = re.compile(r'\b((http|https|ftp)://\S+[\w/]|'
736736
r'RFC[- ]?(\d+)|'
737737
r'PEP[- ]?(\d+)|'
738738
r'(self\.)?((?:\w|\.)+))\b')
@@ -750,7 +750,7 @@ def markup(self, text, escape=None, funcs={}, classes={}, methods={}):
750750
url = 'http://www.rfc-editor.org/rfc/rfc%d.txt' % int(rfc)
751751
results.append('<a href="%s">%s</a>' % (url, escape(all)))
752752
elif pep:
753-
url = 'http://www.python.org/dev/peps/pep-%04d/' % int(pep)
753+
url = 'https://www.python.org/dev/peps/pep-%04d/' % int(pep)
754754
results.append('<a href="%s">%s</a>' % (url, escape(all)))
755755
elif text[end:end+1] == '(':
756756
results.append(self.namelink(name, methods, funcs, classes))

0 commit comments

Comments
 (0)