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 引数は宛先リクエストのヘッダーを記述します。このプロキシ認証は別の受信者に属します。そこにプロキシのアカウントを置いても、先の CONNECT 交換を設定したことにはなりません。

make_headers は Basic ヘッダーの値を組み立てます。NTLM を交渉せず、対応スキームを自動選択せず、プロキシがそのアカウントを受け付けることも証明しません。

TLS リスナーを持つプロキシは別のプロキシ TLS コンテキストを追加します。上記の http:// エンドポイントは、トンネル経由で HTTPS 宛先を運ぶ通常の HTTP リスナーを意図的に表しています。

関連記事