-
Notifications
You must be signed in to change notification settings - Fork 1
Description
поток [ <-> ] протокол (SSL)[ <-> ] транспорт (socket)
| ^
+......................................+
дополнительное владение через ссылку
[переместить SSL из транспорта в протокол мы не можем - старый сокет перестаёт работать]
[сейчас поток может сменить транспорт не более одного раза]
[при замене класса мы сообщаем об этом все четырём сторонам избегая рекурсии с вызывающей стороны]
[для обратной совместимости проверяем, является ли принятый класс потомком старого и если да, передаём ему обёртки]
Задача - завершить работу протокола, забрав транспорт.
1 Добавить shutdown_tls в loop
2 Написать поточную обёртку поверх
I cannot connect the loose ends in the code to get how to shutdown and whether a socket can be taken before a final shutdown
self._sslobj.unwrap() закопан внутри SSLProtocol и необходимо архитектурно грамотно вытащить значение за пределы класса не прорубая
окна.
=========================
Разбираюсь:
- кто поверх кого (транспорт или протокол)
- TCP, UDP и тем более TLS (в реализации Питоновского пакета ssl это сокет) - это внутренняя деталь транспорта.
С точки зрения пользователя существует только поточное и пакетное взаимодействие в один или несколько потоков.
Несколько потоков - это, например, процессы, владеющие stdin и stdout. Вот только это дело не протокола (каждый
поток - это обычный pipe), а loop.subprocess_*, возвращающего кортеж из трёх потоков - кто взаимодействует с буферами, а кто с протоколами
- какова роль протокола, если буферизацию определяет ресурс, оборачиваемый классом транспорта, а способ получения
данных - очередь сообщений (poll vs proactor)
У нас есть транспорты и протоколы.
Ответы:
Создание (т. е. кто в принципе в курсе):
-
транспорт:
- loop.connect_read_pipe, loop.connect_write_pipe
- loop.create_connection, loop.create_unix_connection, loop.create_server, loop.sendfile
- loop.create_datagram_endpoint
- loop.subprocess_shell, loop.subprocess_exec
-
протоколы:
-
не задокументировано, то есть пользователю не видно
-
встречаются в имени параметра protocol_factory функций цикла
-
гипотеза: протокол позволяет прозрачно заменить нижележащий сокет; но ради этого там
масса слабосвязанной лапши, крутящейс вокруг внутренних переменных. -
asyncio.stream.start_server вызывает loop.create_server с фабрикой следующего вида:
def factory():
reader = StreamReader(limit=limit, loop=loop)
protocol = StreamReaderProtocol(reader, client_connected_cb,
loop=loop)
return protocol
return await loop.create_server(factory, host, port, **kwds) -
то есть протокол смотри на пользователя, а транспорт - на низкоуровневый поток ввода-вывода.
Зачем тогда TLS-протокол, если схема взаимодействия такая же, как и с сокетом.
-