Go の標準 DefaultTransport は Proxy を ProxyFromEnvironment に設定します。別途構築した &http.Transport{} の Proxy 関数は nil であるため、プロキシを選択しません。

この違いは、タイムアウトを変更するためだけにトランスポートを追加した後に現れることがあります。標準のデフォルトがまだ設定されている場合は、それをクローンして必要なフィールドを変更します。

transport := http.DefaultTransport.(*http.Transport).Clone()
transport.ResponseHeaderTimeout = 15 * time.Second

client := &http.Client{
    Transport: transport,
    Timeout: 30 * time.Second,
}

クローンは環境プロキシの選択と、その他のデフォルトのトランスポート設定を保持します。型アサーションは、アプリケーションが DefaultTransport を別の RoundTripper に置き換えていないことを前提としています。

意図的にゼロから構築するトランスポートでは、それがルーティングポリシーである場合に Proxy: http.ProxyFromEnvironment を明示的に設定します。明示的な ProxyURL 関数は別のポリシーを表します。選択された一つの仲介者です。

同時リクエストが使用する前にトランスポートを構成し、その後はワークロードに対して再利用します。共有のデフォルトオブジェクトを変更すると、無関係なクライアントに影響する可能性があります。

カスタム TLS 設定は別です。プロキシ検出を維持するために証明書検証を無効にする必要はなく、一致するすべての HTTPS リクエストのセキュリティを変えてしまいます。

関連記事