将 HTTP 代理 URL 转换为 Twisted 端点
将常规 HTTP 代理 URL 解析为主机和端口,而不是把它当作 Twisted 的端点描述语法传入。
像 http://proxy.example:8080 这样的常规代理值是一个 URL。Twisted 的 clientFromString 接受端点描述,例如 tcp:host=proxy.example:port=8080。这两个字符串用不同的语法描述相关信息。
如果应用接受常规 HTTP 代理 URL,请先解析它,再创建端点:
import os
from urllib.parse import urlsplit
from twisted.internet.endpoints import HostnameEndpoint
from twisted.web.client import ProxyAgent
proxy = urlsplit(os.environ['http_proxy'])
if proxy.scheme != 'http' or not proxy.hostname:
raise ValueError('Expected an HTTP proxy URL')
port = proxy.port if proxy.port is not None else 80
endpoint = HostnameEndpoint(reactor, proxy.hostname, port, timeout=5)
agent = ProxyAgent(endpoint, reactor=reactor)
该片段假定应用已经拥有自己的 reactor。当端口不是 HTTP URL 的默认值时,请在配置中指定真实的代理端口。HTTP 代理列表为无需代理账户的获准公共 HTTP 请求提供端点候选。HostnameEndpoint 还避免了将主机名嵌入另一个以冒号分隔的配置字符串。
这仅转换路由输入。嵌入 URL 的凭据不会仅仅因为解析了主机和端口就变成授权标头。请通过请求的认证安排提供任何所需的受支持代理认证。对于纯 HTTP 目标和支持 Basic 的中间方,ProxyAgent 的 Basic 请求标头提供了这样一种安排。
HTTPS 代理 URL 需要到代理的、支持 TLS 的连接。SOCKS URL 需要 SOCKS 协商。把这两种方案送入普通的 HTTP ProxyAgent 端点转换,都无法实现其中任何一种。