OnProxyConnectResponse で Go の CONNECT ステータスを観察する
リクエストの前にトランスポートへフックを設定します。nil を返すと通常のトンネルステータス確認が維持されます。
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 サイトの応答には別のヘッダーがあります。