New submission from Malversán <malvers...@gmail.com>:

Currently the BaseEventLoop class in asyncio has explicit checks to raise 
ValueError when creating a connection if the socket argument has a type other 
than SOCK_STREAM:
.create_connection()
.create_server()

This is also applicable for class _UnixSelectorEventLoop:
.create_unix_connection()
.create_unix_server()

But the fact is that it actually supports other socket types, like 
SOCK_SEQPACKET for example.

Currently you can test this by dirty-hacking the socket class "type" property 
to momentarily trick the event loop into thinking that any socket is of 
SOCK_STREAM type.

<code>
# First create an AF_UNIX, SOCK_SEQPACKET socket.
sock = socket.socket(socket.AddressFamily.AF_UNIX, 
socket.SocketKind.SOCK_SEQ_PACKET)
sock.connect(path)

params = { "sock" : sock, "protocol_factory" : lambda: protocol }

# Now do the trick.
hack = (params["sock"].type != socket.SocketKind.SOCK_STREAM)

if hack:
    # Substitute class property getter with fixed value getter.
    socket_property = socket.socket.type
    socket.socket.type = property(lambda self: socket.SocketKind.SOCK_STREAM, 
None, None,)

# Use the socket normally to create connection and run the event loop.
loop = asyncio.new_event_loop()
coroutine = loop.create_unix_connection(**params)    # It also works with 
.create_connection()
transport, protocol = loop.run_until_complete(coroutine)

# Revert the trick.
if hack:
    # Restore class property getter.
    socket.socket.type = socket_property
</code>

As dirty as it looks, this works flawlessy. It just tricks the event loop 
.create_connection() call to bypass the explicit check of using a SOCK_STREAM 
socket. This done, THE EVENT LOOP SUPPORTS SOCK_SEQPACKET PERFECTLY.

This is the solution I'm currently using to communicate an application with a 
local daemon, but I would really prefer to have the SOCK_SEQPACKET support 
allowed into the event loop itself. Having in mind that it simply works with 
other socket types, I find that limiting the use of the event loop with an 
explicit SOCK_STREAM-only check is somehow artificial and unrealistic.

Thanks in advance for your attention.

----------
components: asyncio
messages: 353296
nosy: asvetlov, malversan, yselivanov
priority: normal
severity: normal
status: open
title: Asyncio BaseEventLoop can support socket types other than SOCK_STREAM
type: enhancement
versions: Python 3.5, Python 3.6, Python 3.7, Python 3.8, Python 3.9

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue38285>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to