Подключение Autobahn Twisted WSS через HTTP-прокси
Позвольте connectWS согласовывать конечную точку прокси и последующий TLS назначения вместо открытия прямой конечной точки рядом с фабрикой, учитывающей прокси.
Конечная точка Twisted выполняет TCP-соединение. Фабрика WebSocket, настроенная на согласование прокси, всё равно нуждается в этой конечной точке для подключения к посреднику.
Для существующего приложения Autobahn, использующего стандартный помощник:
from autobahn.twisted.websocket import WebSocketClientFactory, connectWS
from twisted.internet import ssl
factory = WebSocketClientFactory(
'wss://events.example/channel',
proxy={'host': 'proxy.example', 'port': 8080},
)
factory.protocol = ApplicationProtocol
connector = connectWS(
factory,
contextFactory=ssl.optionsForClientTLS('events.example'),
timeout=10,
)
ApplicationProtocol — это существующий класс протокола WebSocket приложения. Держите реактор и очистку соединения в жизненном цикле этого приложения. Для публичной службы WSS, разрешённой через публичного посредника, список HTTP-прокси предоставляет кандидатов для хоста и порта прокси фабрики.
Для фабрики, настроенной на прокси, connectWS соединяет TCP с прокси и сохраняет контекст TLS назначения для последующего защищённого соединения. Сначала он не оборачивает обычное соединение HTTP-прокси в TLS назначения.
Собственная схема из HostnameEndpoint и ClientService должна сохранять то же разделение: сначала подключиться к прокси, затем позволить настроенной фабрике согласовать цель и установить требуемый TLS. Подключение конечной точки напрямую к events.example, когда её фабрика ожидает разговор через прокси, смешивает эти роли.
URL WebSocket остаётся настоящим адресом службы. Его имя хоста также задаёт идентичность TLS; замена его именем хоста прокси не настраивает нужную защищённую службу.