Skip to content
This repository was archived by the owner on Nov 23, 2017. It is now read-only.

Commit dc3b2af

Browse files
committed
Make loop TCP APIs accept only TCP streaming sockets
1 parent 07ac834 commit dc3b2af

File tree

2 files changed

+19
-4
lines changed

2 files changed

+19
-4
lines changed

asyncio/base_events.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -771,9 +771,13 @@ def create_connection(self, protocol_factory, host=None, port=None, *,
771771
raise OSError('Multiple exceptions: {}'.format(
772772
', '.join(str(exc) for exc in exceptions)))
773773

774-
elif sock is None:
775-
raise ValueError(
776-
'host and port was not specified and no sock specified')
774+
else:
775+
if sock is None:
776+
raise ValueError(
777+
'host and port was not specified and no sock specified')
778+
if sock.family not in {socket.AF_INET, socket.AF_INET6}:
779+
raise ValueError(
780+
'A TCP Stream Socket was expected, got {!r}'.format(sock))
777781

778782
transport, protocol = yield from self._create_connection_transport(
779783
sock, protocol_factory, ssl, server_hostname)
@@ -1027,6 +1031,9 @@ def create_server(self, protocol_factory, host=None, port=None,
10271031
else:
10281032
if sock is None:
10291033
raise ValueError('Neither host/port nor sock were specified')
1034+
if sock.family not in {socket.AF_INET, socket.AF_INET6}:
1035+
raise ValueError(
1036+
'A TCP Stream Socket was expected, got {!r}'.format(sock))
10301037
sockets = [sock]
10311038

10321039
server = Server(self, sockets)
@@ -1048,6 +1055,9 @@ def connect_accepted_socket(self, protocol_factory, sock, *, ssl=None):
10481055
This method is a coroutine. When completed, the coroutine
10491056
returns a (transport, protocol) pair.
10501057
"""
1058+
if sock.family not in {socket.AF_INET, socket.AF_INET6}:
1059+
raise ValueError(
1060+
'A TCP Stream Socket was expected, got {!r}'.format(sock))
10511061
transport, protocol = yield from self._create_connection_transport(
10521062
sock, protocol_factory, ssl, '', server_side=True)
10531063
if self._debug:

tests/test_events.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1377,6 +1377,11 @@ def datagram_received(self, data, addr):
13771377
server.transport.close()
13781378

13791379
def test_create_datagram_endpoint_sock(self):
1380+
if (sys.platform == 'win32' and
1381+
isinstance(self.loop, proactor_events.BaseProactorEventLoop)):
1382+
raise unittest.SkipTest(
1383+
'UCP not supported with proactor event loops')
1384+
13801385
sock = None
13811386
local_address = ('127.0.0.1', 0)
13821387
infos = self.loop.run_until_complete(
@@ -1394,7 +1399,7 @@ def test_create_datagram_endpoint_sock(self):
13941399
else:
13951400
assert False, 'Can not create socket.'
13961401

1397-
f = self.loop.create_connection(
1402+
f = self.loop.create_datagram_endpoint(
13981403
lambda: MyDatagramProto(loop=self.loop), sock=sock)
13991404
tr, pr = self.loop.run_until_complete(f)
14001405
self.assertIsInstance(tr, asyncio.Transport)

0 commit comments

Comments
 (0)