通过 HTTP 代理连接 Autobahn Twisted WSS
让 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 协议类。请把 reactor 与连接清理留在该应用自身的生命周期里。对于经公共中间服务器获准使用的公共 WSS 服务,HTTP 代理列表 可为工厂的代理主机和端口提供候选。
对于已配置代理的工厂,connectWS 会让 TCP 连接到代理,并为后续的安全连接保留目的地 TLS 上下文。它一开始不会用目的地 TLS 包裹普通的 HTTP 代理连接。
自定义的 HostnameEndpoint 与 ClientService 组合必须保持同样的分工:先连接代理,再让已配置的工厂 协商目标 并建立所需的 TLS。若工厂期待的是代理会话,却把端点直接连到 events.example,就把这两种角色混在了一起。
WebSocket URL 始终是真实的服务目的地。它的主机名同时决定 TLS 身份;换成代理主机名并不能配置出预期的安全服务。