HTTPXでproxyとmountsを使い分けて経路を選ぶ
HTTPXのproxyとトランスポートのマウントを使い、接続先のスキーム、環境変数の扱い、接続と読み取りの時間制限を整理します。
一つのエンドポイントにクライアントのリクエストを任せるなら proxy= を使います。接続先のスキームごとに経路を分けるなら mounts= です。以下はこれらのHTTPXインターフェースを使う例です。古い proxies= APIを使うプロジェクトでは、そのバージョンに合った設定が必要です。
エンドポイントを一つ使う
import httpx
timeout = httpx.Timeout(15.0, connect=5.0)
with httpx.Client(
proxy="http://127.0.0.1:8080",
trust_env=False,
timeout=timeout,
) as client:
response = client.get("https://example.com/")
response.raise_for_status()
print(response.status_code)
ローカルの待受アドレスを稼働中のHTTPプロキシに置き換えます。HTTPプロキシ一覧の候補も、利用する接続先でのテストは必要です。HTTPSの接続先にも、CONNECT経由でこの http:// エンドポイントを使えます。スキームを https:// に変えると、プロキシ自体へのTLSを要求することになり、待受側とクライアントの両方が対応している必要があります。
接続先のスキームで経路を分ける
import httpx
mounts = {
"http://": httpx.HTTPTransport(
proxy="http://127.0.0.1:8080",
trust_env=False,
),
"https://": httpx.HTTPTransport(
proxy="http://127.0.0.1:8081",
trust_env=False,
),
}
with httpx.Client(
mounts=mounts,
trust_env=False,
timeout=httpx.Timeout(15.0, connect=5.0),
) as client:
response = client.get("https://example.com/")
response.raise_for_status()
print(response.status_code)
マウントのキーは接続先URLと照合されます。この例ではHTTPの接続先はポート8080、HTTPSの接続先は8081を選びます。プロキシの値が表すのは待受側自身のプロトコルなので、HTTPS用のマウントに http:// プロキシがあっても正しい設定です。実際のエンドポイントに置き換え、両方の接続先スキームを確認してください。
どちらの例もクライアントに trust_env=False を設定し、トランスポートを渡す箇所ではそちらにも設定しています。それ以外ではHTTPXは既定でプロキシと証明書の環境変数を読み取ります。配備環境がそれらに依存するなら、自動検出を有効にするか、必要な経路と信頼設定を明示してください。独自の信頼設定には、使用中のHTTPXバージョンが対応するTLSコンテキストとCA設定を使い、接続先の検証は有効にしておきます。HTTPSプロキシの信頼設定は接続先と別にできる場合があります。
httpx.Timeout(15.0, connect=5.0) は接続タイムアウトを上書きし、その他の設定済みタイムアウト項目には既定値を使います。読み取り、書き込み、プール待ちには別々の制限があります。十五秒は処理全体の実時間の締め切りではありません。プールのタイムアウトは、別の処理が利用可能な接続を保持している場合にも起こります。プロキシに届かない証拠と判断する前に、クライアントとストリーミングレスポンスを正しく閉じてください。