ProxyManager 有单独的 proxy_headers 参数,用于发送给中间人的请求头。对于接受 Basic 认证的代理:

import urllib3

proxy_headers = urllib3.make_headers(
    proxy_basic_auth=f'{proxy_user}:{proxy_password}'
)
with urllib3.ProxyManager(
    'http://proxy.example:8080',
    proxy_headers=proxy_headers,
    timeout=urllib3.Timeout(connect=5, read=10),
) as http:
    response = http.request('GET', 'https://service.example/data')
    print(response.status)

对于普通 HTTP 目标,这些请求头会随转发请求一起发送给代理。对于使用 CONNECT 的 HTTPS 目标,它们属于隧道建立阶段,而不是发往网站的每个加密请求。

普通的 headers 参数描述的是目标请求头。这里的 proxy authentication 属于另一个接收方。把代理的账号放在那里,并不等同于配置前面的 CONNECT 交换。

make_headers 负责构造 Basic 请求头的值。它不协商 NTLM,不会自动选择受支持的认证方案,也不能证明代理接受该账号。

带 TLS listener 的代理会额外增加一个独立的 proxy TLS context。上面的 http:// 端点有意描述的是一个普通 HTTP listener,通过隧道承载 HTTPS 目标。

相关文章