如何在Asyncio中获得非阻塞SSL套接字?

时间:2019-04-03 18:51:39

标签: python-asyncio

因此,我可以轻松地在asyncio中创建一个SSLSocket

# Create a Socket
sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
sock.setblocking(False)

# Connect
await loop.sock_connect(sock, host_address)  # type: ignore

# Create an SSL Context
ssl_context = ssl.create_default_context(cafile=PROXY_CA_BUNDLE)
...

# Wrap the SSL Context Around the Socket
def do_handshake(loop, sock, waiter):
    sock_fd = sock.fileno()
    try:
        sock.do_handshake()
    except ssl.SSLWantReadError:
        loop.remove_reader(sock_fd)
        loop.add_reader(sock_fd, do_handshake,
                        loop, sock, waiter)
        return
    except ssl.SSLWantWriteError:
        loop.remove_writer(sock_fd)
        loop.add_writer(sock_fd, do_handshake,
                        loop, sock, waiter)
        return

    loop.remove_reader(sock_fd)
    loop.remove_writer(sock_fd)
    waiter.set_result(None)

 waiter = loop.create_future()
 do_handshake(loop, sslconn, waiter)
 await waiter

问题是原始套接字库的SSLSocket breaks the non-blocking interface,因此不再与asyncio.sock_sendall之类的其他异步方法兼容。有没有办法包装套接字并让它仍然尊重原始套接字接口?

0 个答案:

没有答案