在 OnProxyConnectResponse 中观察 Go 的 CONNECT 状态
在请求之前于 transport 上安装钩子;返回 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;标准默认的类型断言假定该 transport 仍处于安装状态。proxyURL 会被解析,observeConnect 必须并发安全。对于获准的公开 HTTPS 探测,HTTP 代理列表 可为该代理 URL 提供候选。
回调在检查 CONNECT 是否成功返回 200 之前运行,因此也能观察到 407。nil 会继续正常检查,且不接受被拒绝的隧道;返回错误则使请求失败。
X-Proxy-Region 是提供方定义的示例。在此读取状态和响应头,并把正文与套接字的所有权留给 Transport,之后由它处理目标 TLS。
这里观察的是新隧道的建立,而不是每个请求。复用的连接没有新的 CONNECT 响应,网站响应也带有各自独立的响应头。