Requests の HTTPAdapter.proxy_headers でプロキシヘッダーを設定する
プロキシ側が定義するフィールドのために HTTPAdapter.proxy_headers を拡張し、Requests 既存のプロキシ認証ヘッダー生成を保ちます。
プロキシ事業者が定義するヘッダーについて、Requests は HTTPAdapter.proxy_headers を上書きポイントとして公開します:
from urllib.parse import urlsplit
import requests
from requests.adapters import HTTPAdapter
class TaggedProxy(HTTPAdapter):
def proxy_headers(self, proxy):
headers = super().proxy_headers(proxy)
endpoint = urlsplit(proxy)
if (endpoint.scheme == 'http'
and endpoint.hostname == 'proxy.example'
and endpoint.port == 8080):
headers['X-Proxy-Account'] = 'department-a'
return headers
with requests.Session() as session:
adapter = TaggedProxy()
session.mount('http://', adapter)
session.mount('https://', adapter)
response = session.get(
'https://service.example/data',
proxies={'https': 'http://proxy.example:8080'},
timeout=15,
)
X-Proxy-Account はこの特定のプロキシが解釈するフィールドの例であり、あらゆる中間装置に対する標準的な認証方法ではありません。
super().proxy_headers(proxy) から始めてください。URL が Basic アカウントを提供するとき、Requests はこのメソッドで Proxy-Authorization を生成します。結果全体を置き換えると、その動作を失う可能性があります。
アダプターはこれらの値を urllib3 の ProxyManager に渡します。HTTPS トンネルでは CONNECT に付随します。通常のリクエストヘッダーのマッピングは、後続の宛先リクエストを表します。
プロキシマネージャーはプロキシ URL ごとにキャッシュされます。呼び出しごとに変える必要のある値のために、このフックをキャッシュされない業務リクエスト単位のコールバックとして扱わないでください。アカウント識別子が変わる場合は、それに応じてトランスポートの所有を選びます。
単純な HTTP 転送では、プロキシ用フィールドに中間装置の意図した取り扱い方針が依然として必要です。クライアント API でプロキシ固有であっても、プロキシがそのまま転送すれば機密性の保証にはなりません。