]> granicus.if.org Git - python/commitdiff
bpo-31245: Asyncio unix socket datagram (#3164)
authorQuentin Dawans <github@ovv.wtf>
Mon, 30 Oct 2017 13:43:02 +0000 (14:43 +0100)
committerYury Selivanov <yury@magic.io>
Mon, 30 Oct 2017 13:43:02 +0000 (09:43 -0400)
Doc/library/asyncio-eventloop.rst
Lib/asyncio/base_events.py
Lib/asyncio/events.py
Lib/test/test_asyncio/test_base_events.py
Misc/NEWS.d/next/Library/2017-08-22-11-05-35.bpo-31245.AniZuz.rst [new file with mode: 0644]

index ade37390c63388c7f5df06dd8fdab6735b11125e..9bc7a40fc71bea9597e632e48dc7bbbca59aaa59 100644 (file)
@@ -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
index 33b8f4887c6a64e1674ce69340305b5cec6170a0..2a5a4f98952be8f91ed3b7c9ecd4fb9d9f666a52 100644 (file)
@@ -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()
index 0dbd92cf3a38083b6a1b9cbbd531d84c17c0dc31..c2663c5062dedd3d9ca1c431bd9f38194dd71869 100644 (file)
@@ -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
index 3f1ec651742e4374d547c3f20a98c3b262340de7..a0ce9fa55e06afca9c67db4a62dd1c43b35e2131 100644 (file)
@@ -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 (file)
index 0000000..ce495ea
--- /dev/null
@@ -0,0 +1 @@
+Added support for AF_UNIX socket in asyncio `create_datagram_endpoint`.