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 协议类。请把 reactor 与连接清理留在该应用自身的生命周期里。对于经公共中间服务器获准使用的公共 WSS 服务,HTTP 代理列表 可为工厂的代理主机和端口提供候选。

对于已配置代理的工厂,connectWS 会让 TCP 连接到代理,并为后续的安全连接保留目的地 TLS 上下文。它一开始不会用目的地 TLS 包裹普通的 HTTP 代理连接。

自定义的 HostnameEndpoint 与 ClientService 组合必须保持同样的分工:先连接代理,再让已配置的工厂 协商目标 并建立所需的 TLS。若工厂期待的是代理会话,却把端点直接连到 events.example,就把这两种角色混在了一起。

WebSocket URL 始终是真实的服务目的地。它的主机名同时决定 TLS 身份;换成代理主机名并不能配置出预期的安全服务。

相关文章