from io import BytesIO
import pycurl

body = BytesIO()
curl = pycurl.Curl()
try:
    curl.setopt(pycurl.URL, "https://api.example/")
    curl.setopt(pycurl.PROXY, "https://proxy.example:8443")
    curl.setopt(pycurl.PROXY_CAINFO, "/path/to/proxy-ca.pem")
    curl.setopt(pycurl.CAINFO, "/path/to/origin-ca.pem")
    curl.setopt(pycurl.CONNECTTIMEOUT, 5)
    curl.setopt(pycurl.TIMEOUT, 30)
    curl.setopt(pycurl.WRITEDATA, body)
    curl.perform()
finally:
    curl.close()

HTTPS プロキシをサポートした PycURL/libcurl ビルドを使用します。バンドルのパスは想定する信頼セットを表します。PROXY_CAINFO は中間プロキシを検証し、CAINFO は接続先の TLS を検証します。既存の信頼でその接続がすでにカバーされている場合は、明示的な上書きを省略します。

PROXY の URL はそのリスナーを表します。PROXYTYPE を数値で推測する必要はありません。平文 HTTP リスナーの場合、接続先が HTTPS でも URL は http:// のままです。その場合は HTTP プロキシ一覧 がエンドポイント候補を提供し、プロキシ用 TLS バンドルはリスナーが実際に TLS を使うときだけ適用されます。

必要に応じて PROXYUSERNAME と PROXYPASSWORD でプロキシのアカウントを渡します。証明書の検証は維持してください。プロキシの検証を無効にすると、不足している認証局を導入する代わりに中間プロキシの身元確認が失われます。

関連記事