From fe4ea9cf1ee04f5a60e4ed928d8624b95b031e18 Mon Sep 17 00:00:00 2001 From: Quentin Dawans Date: Mon, 30 Oct 2017 14:43:02 +0100 Subject: [PATCH] bpo-31245: Asyncio unix socket datagram (#3164) --- Doc/library/asyncio-eventloop.rst | 7 ++++--- Lib/asyncio/base_events.py | 6 ++++++ Lib/asyncio/events.py | 4 ++-- Lib/test/test_asyncio/test_base_events.py | 11 +++++++++++ .../Library/2017-08-22-11-05-35.bpo-31245.AniZuz.rst | 1 + 5 files changed, 24 insertions(+), 5 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2017-08-22-11-05-35.bpo-31245.AniZuz.rst diff --git a/Doc/library/asyncio-eventloop.rst b/Doc/library/asyncio-eventloop.rst index ade37390c6..9bc7a40fc7 100644 --- a/Doc/library/asyncio-eventloop.rst +++ b/Doc/library/asyncio-eventloop.rst @@ -341,9 +341,10 @@ Creating connections .. coroutinemethod:: AbstractEventLoop.create_datagram_endpoint(protocol_factory, local_addr=None, remote_addr=None, \*, family=0, proto=0, flags=0, reuse_address=None, reuse_port=None, allow_broadcast=None, sock=None) - Create datagram connection: socket family :py:data:`~socket.AF_INET` or - :py:data:`~socket.AF_INET6` depending on *host* (or *family* if specified), - socket type :py:data:`~socket.SOCK_DGRAM`. *protocol_factory* must be a + Create datagram connection: socket family :py:data:`~socket.AF_INET`, + :py:data:`~socket.AF_INET6` or :py:data:`~socket.AF_UNIX` depending on + *host* (or *family* if specified), socket type + :py:data:`~socket.SOCK_DGRAM`. *protocol_factory* must be a callable returning a :ref:`protocol ` instance. This method is a :ref:`coroutine ` which will try to diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py index 33b8f4887c..2a5a4f9895 100644 --- a/Lib/asyncio/base_events.py +++ b/Lib/asyncio/base_events.py @@ -859,6 +859,12 @@ class BaseEventLoop(events.AbstractEventLoop): if family == 0: raise ValueError('unexpected address family') addr_pairs_info = (((family, proto), (None, None)),) + elif hasattr(socket, 'AF_UNIX') and family == socket.AF_UNIX: + for addr in (local_addr, remote_addr): + if addr is not None and not isistance(addr, str): + raise TypeError('string is expected') + addr_pairs_info = (((family, proto), + (local_addr, remote_addr)), ) else: # join address by (family, protocol) addr_infos = collections.OrderedDict() diff --git a/Lib/asyncio/events.py b/Lib/asyncio/events.py index 0dbd92cf3a..c2663c5062 100644 --- a/Lib/asyncio/events.py +++ b/Lib/asyncio/events.py @@ -378,8 +378,8 @@ class AbstractEventLoop: protocol_factory must be a callable returning a protocol instance. - socket family AF_INET or socket.AF_INET6 depending on host (or - family if specified), socket type SOCK_DGRAM. + socket family AF_INET, socket.AF_INET6 or socket.AF_UNIX depending on + host (or family if specified), socket type SOCK_DGRAM. reuse_address tells the kernel to reuse a local socket in TIME_WAIT state, without waiting for its natural timeout to diff --git a/Lib/test/test_asyncio/test_base_events.py b/Lib/test/test_asyncio/test_base_events.py index 3f1ec65174..a0ce9fa55e 100644 --- a/Lib/test/test_asyncio/test_base_events.py +++ b/Lib/test/test_asyncio/test_base_events.py @@ -1528,6 +1528,17 @@ class BaseEventLoopWithSelectorTests(test_utils.TestCase): self.loop.run_until_complete(protocol.done) self.assertEqual('CLOSED', protocol.state) + @unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'No UNIX Sockets') + def test_create_datagram_endpoint_sock_unix(self): + fut = self.loop.create_datagram_endpoint( + lambda: MyDatagramProto(create_future=True, loop=self.loop), + family=socket.AF_UNIX) + transport, protocol = self.loop.run_until_complete(fut) + assert transport._sock.family == socket.AF_UNIX + transport.close() + self.loop.run_until_complete(protocol.done) + self.assertEqual('CLOSED', protocol.state) + def test_create_datagram_endpoint_sock_sockopts(self): class FakeSock: type = socket.SOCK_DGRAM diff --git a/Misc/NEWS.d/next/Library/2017-08-22-11-05-35.bpo-31245.AniZuz.rst b/Misc/NEWS.d/next/Library/2017-08-22-11-05-35.bpo-31245.AniZuz.rst new file mode 100644 index 0000000000..ce495ea0ba --- /dev/null +++ b/Misc/NEWS.d/next/Library/2017-08-22-11-05-35.bpo-31245.AniZuz.rst @@ -0,0 +1 @@ +Added support for AF_UNIX socket in asyncio `create_datagram_endpoint`. -- 2.40.0