一つのエンドポイントにクライアントのリクエストを任せるなら 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) は接続タイムアウトを上書きし、その他の設定済みタイムアウト項目には既定値を使います。読み取り、書き込み、プール待ちには別々の制限があります。十五秒は処理全体の実時間の締め切りではありません。プールのタイムアウトは、別の処理が利用可能な接続を保持している場合にも起こります。プロキシに届かない証拠と判断する前に、クライアントとストリーミングレスポンスを正しく閉じてください。

関連記事