[Python-checkins] bpo-31245: Asyncio unix socket datagram (#3164)

Yury Selivanov webhook-mailer at python.org
Mon Oct 30 09:43:09 EDT 2017


https://github.com/python/cpython/commit/fe4ea9cf1ee04f5a60e4ed928d8624b95b031e18
commit: fe4ea9cf1ee04f5a60e4ed928d8624b95b031e18
branch: master
author: Quentin Dawans <github at ovv.wtf>
committer: Yury Selivanov <yury at magic.io>
date: 2017-10-30T09:43:02-04:00
summary:

bpo-31245: Asyncio unix socket datagram (#3164)

files:
A Misc/NEWS.d/next/Library/2017-08-22-11-05-35.bpo-31245.AniZuz.rst
M Doc/library/asyncio-eventloop.rst
M Lib/asyncio/base_events.py
M Lib/asyncio/events.py
M Lib/test/test_asyncio/test_base_events.py

diff --git a/Doc/library/asyncio-eventloop.rst b/Doc/library/asyncio-eventloop.rst
index ade37390c63..9bc7a40fc71 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 <asyncio-protocol>` instance.
 
    This method is a :ref:`coroutine <coroutine>` which will try to
diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py
index 33b8f4887c6..2a5a4f98952 100644
--- a/Lib/asyncio/base_events.py
+++ b/Lib/asyncio/base_events.py
@@ -859,6 +859,12 @@ def create_datagram_endpoint(self, protocol_factory,
                 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 0dbd92cf3a3..c2663c5062d 100644
--- a/Lib/asyncio/events.py
+++ b/Lib/asyncio/events.py
@@ -378,8 +378,8 @@ def create_datagram_endpoint(self, protocol_factory,
 
         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 3f1ec651742..a0ce9fa55e0 100644
--- a/Lib/test/test_asyncio/test_base_events.py
+++ b/Lib/test/test_asyncio/test_base_events.py
@@ -1528,6 +1528,17 @@ def test_create_datagram_endpoint_sock(self):
         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 00000000000..ce495ea0ba3
--- /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`.



More information about the Python-checkins mailing list