[Python-checkins] bpo-46827: pass sock.type to getaddrinfo in sock_connect (GH-31499)
asvetlov
webhook-mailer at python.org
Tue Feb 22 15:36:26 EST 2022
https://github.com/python/cpython/commit/8fb94893e4a870ed3533e80c4bc2f1ebf1cfa9e7
commit: 8fb94893e4a870ed3533e80c4bc2f1ebf1cfa9e7
branch: main
author: Thomas Grainger <tagrain at gmail.com>
committer: asvetlov <andrew.svetlov at gmail.com>
date: 2022-02-22T22:35:57+02:00
summary:
bpo-46827: pass sock.type to getaddrinfo in sock_connect (GH-31499)
Co-authored-by: Thomas Grainger <tagrain at gmail.com>
Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com>
Co-authored-by: Andrew Svetlov <andrew.svetlov at gmail.com>
files:
A Misc/NEWS.d/next/Library/2022-02-22-15-08-30.bpo-46827.hvj38S.rst
M Lib/asyncio/selector_events.py
M Lib/test/test_asyncio/test_selector_events.py
diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py
index ebb5cbec03e4b..c3c2ec12a7787 100644
--- a/Lib/asyncio/selector_events.py
+++ b/Lib/asyncio/selector_events.py
@@ -498,7 +498,9 @@ async def sock_connect(self, sock, address):
if not hasattr(socket, 'AF_UNIX') or sock.family != socket.AF_UNIX:
resolved = await self._ensure_resolved(
- address, family=sock.family, proto=sock.proto, loop=self)
+ address, family=sock.family, type=sock.type, proto=sock.proto,
+ loop=self,
+ )
_, _, _, _, address = resolved[0]
fut = self.create_future()
diff --git a/Lib/test/test_asyncio/test_selector_events.py b/Lib/test/test_asyncio/test_selector_events.py
index 9c46018c9414b..d9d30fc25b513 100644
--- a/Lib/test/test_asyncio/test_selector_events.py
+++ b/Lib/test/test_asyncio/test_selector_events.py
@@ -151,6 +151,24 @@ def test_write_to_self_exception(self):
self.loop._csock.send.side_effect = RuntimeError()
self.assertRaises(RuntimeError, self.loop._write_to_self)
+ @mock.patch('socket.getaddrinfo')
+ def test_sock_connect_resolve_using_socket_params(self, m_gai):
+ addr = ('need-resolution.com', 8080)
+ for sock_type in [socket.SOCK_STREAM, socket.SOCK_DGRAM]:
+ with self.subTest(sock_type):
+ sock = test_utils.mock_nonblocking_socket(type=sock_type)
+
+ m_gai.side_effect = \
+ lambda *args: [(None, None, None, None, ('127.0.0.1', 0))]
+
+ con = self.loop.create_task(self.loop.sock_connect(sock, addr))
+ self.loop.run_until_complete(con)
+ m_gai.assert_called_with(
+ addr[0], addr[1], sock.family, sock.type, sock.proto, 0)
+
+ self.loop.run_until_complete(con)
+ sock.connect.assert_called_with(('127.0.0.1', 0))
+
def test_add_reader(self):
self.loop._selector.get_key.side_effect = KeyError
cb = lambda: True
diff --git a/Misc/NEWS.d/next/Library/2022-02-22-15-08-30.bpo-46827.hvj38S.rst b/Misc/NEWS.d/next/Library/2022-02-22-15-08-30.bpo-46827.hvj38S.rst
new file mode 100644
index 0000000000000..259686ab1ddda
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2022-02-22-15-08-30.bpo-46827.hvj38S.rst
@@ -0,0 +1 @@
+Support UDP sockets in :meth:`asyncio.loop.sock_connect` for selector-based event loops. Patch by Thomas Grainger.
More information about the Python-checkins
mailing list