Конечная точка 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; замена его именем хоста прокси не настраивает нужную защищённую службу.

Похожие статьи