From 8fb94893e4a870ed3533e80c4bc2f1ebf1cfa9e7 Mon Sep 17 00:00:00 2001 From: Thomas Grainger Date: Tue, 22 Feb 2022 20:35:57 +0000 Subject: [PATCH] bpo-46827: pass sock.type to getaddrinfo in sock_connect (GH-31499) Co-authored-by: Thomas Grainger Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com> Co-authored-by: Andrew Svetlov --- Lib/asyncio/selector_events.py | 4 +++- Lib/test/test_asyncio/test_selector_events.py | 18 ++++++++++++++++++ .../2022-02-22-15-08-30.bpo-46827.hvj38S.rst | 1 + 3 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2022-02-22-15-08-30.bpo-46827.hvj38S.rst diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py index ebb5cbec03e..c3c2ec12a77 100644 --- a/Lib/asyncio/selector_events.py +++ b/Lib/asyncio/selector_events.py @@ -498,7 +498,9 @@ class BaseSelectorEventLoop(base_events.BaseEventLoop): 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 9c46018c941..d9d30fc25b5 100644 --- a/Lib/test/test_asyncio/test_selector_events.py +++ b/Lib/test/test_asyncio/test_selector_events.py @@ -151,6 +151,24 @@ class BaseSelectorEventLoopTests(test_utils.TestCase): 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 00000000000..259686ab1dd --- /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.