Развертывание неблокирующего сокета SSL на Python: как определить завершение рукопожатия при завершении работы? - PullRequest
0 голосов
/ 03 ноября 2018

Учитывая неблокирующий сокет ...

import asyncio
import socket

server_sock = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM, proto=socket.IPPROTO_TCP)
server_sock.setblocking(False)
server_sock.bind(('', port))
server_sock.listen(socket.IPPROTO_TCP)

loop = asyncio.get_event_loop()
sock, _ = await loop.sock_accept(server_sock)

... это завернуто в ssl ...

import ssl
ssl_context = ssl.SSLContext(PROTOCOL_TLSv1_2)
ssl_context.load_cert_chain(f'ssl.crt', keyfile=f'ssl.key')
ssl_sock = ssl_context.wrap_socket(sock, server_side=True, do_handshake_on_connect=False)

... и было выполнено установочное рукопожатие do_handshake и цикл ...

while True:
    try:
        ssl_sock.do_handshake()
        break
    except (ssl.SSLWantReadError, ssl.SSLWantWriteError):
        # We could have something more efficient, e.g. doing things
        # with the readers/writers, but it works
        await asyncio.sleep(0)

... а затем вызывается метод unwrap, чтобы инициировать рукопожатие при завершении работы ...

try:
    ssl_sock.unwrap()
except (SSLWantReadError, SSLWantWriteError):
    pass

... тогда как мне ждать завершения рукопожатия при выключении? Так что я могу написать что-то вроде ...

await ssl_shutdown_handshake_complete()

...