transport := http.DefaultTransport.(*http.Transport).Clone()
transport.Proxy = http.ProxyURL(proxyURL)
transport.OnProxyConnectResponse = func(
    _ context.Context,
    _ *url.URL,
    _ *http.Request,
    response *http.Response,
) error {
    observeConnect(response.StatusCode, response.Header.Get("X-Proxy-Region"))
    return nil
}
client := &http.Client{Transport: transport}

context、net/http、net/url を使用します。標準の型アサーションは、そのトランスポートがインストールされたままであることを前提とします。proxyURL は解析され、observeConnect は並行実行に対して安全でなければなりません。許可された公開 HTTPS プローブには、HTTP プロキシ一覧 がそのプロキシ URL の候補を提供します。

コールバックは、CONNECT が成功 200 かどうかを確認する前に実行されるため、407 も観察できます。nil は通常の確認を続け、拒否されたトンネルを受け入れません。エラーはリクエストを失敗させます。

X-Proxy-Region はプロバイダーが定義した例です。ここでステータスとヘッダーを読み取り、ボディとソケットの所有権は Transport に残します。Transport がその後、宛先の TLS を処理します。

これは新しいトンネルの確立を観察するもので、すべてのリクエストではありません。再利用された接続には新しい CONNECT 応答がなく、Web サイトの応答には別のヘッダーがあります。

関連記事