- 
                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-протокол, если схема взаимодействия такая же, как и с сокетом. 
 -