http://proxy.example:8080 のような従来のプロキシ値はURLです。TwistedのclientFromStringは tcp:host=proxy.example:port=8080 のようなエンドポイント記述を受け付けます。2つの文字列は、異なる文法で関連する情報を表しています。

アプリケーションが従来のHTTPプロキシURLを受け取る場合は、エンドポイントを作成する前に解析します。

import os
from urllib.parse import urlsplit
from twisted.internet.endpoints import HostnameEndpoint
from twisted.web.client import ProxyAgent

proxy = urlsplit(os.environ['http_proxy'])
if proxy.scheme != 'http' or not proxy.hostname:
    raise ValueError('Expected an HTTP proxy URL')
port = proxy.port if proxy.port is not None else 80
endpoint = HostnameEndpoint(reactor, proxy.hostname, port, timeout=5)
agent = ProxyAgent(endpoint, reactor=reactor)

この断片は、アプリケーションがすでに自身のreactorを持っていることを前提としています。HTTP URLの既定値でない場合は、実際のプロキシポートを構成で指定してください。HTTPプロキシ一覧は、プロキシアカウントなしで許可された公開HTTPリクエスト向けのエンドポイント候補を提供します。HostnameEndpointは、ホスト名を別のコロン区切り構成文字列に埋め込むことも避けます。

これはルーティング入力のみを変換します。URLに埋め込まれた認証情報は、ホストとポートが解析されたという理由だけで認証ヘッダーになるわけではありません。必要なサポート対象のプロキシ認証は、リクエストの認証の仕組みを通じて提供してください。プレーンHTTPの宛先とBasicを提供する中間者については、ProxyAgentのBasicリクエストヘッダーがそのような仕組みの1つを提供します。

HTTPSプロキシURLには、プロキシへのTLS対応接続が必要です。SOCKS URLにはSOCKSネゴシエーションが必要です。どちらも、それらのスキームを単純なHTTP ProxyAgentエンドポイント変換に渡すことでは実装されません。

関連記事