HTTP/2 可以在 Go 的 SOCKS 隧道里运行
克隆标准 HTTP 传输,选择 SOCKS 代理,并检查实际协商出的目标协议。
SOCKS 隧道承载的是一条 TCP 连接。Go 可以通过这条隧道与目标完成 TLS,并在其中协商 HTTP/2;SOCKS 服务器本身不需要会说 HTTP/2。
在保留 Go 标准默认传输的程序中,克隆其配置并选择代理:
import (
"net/http"
"net/url"
"time"
)
proxyURL := &url.URL{
Scheme: "socks5",
Host: "proxy.example:1080",
}
transport := http.DefaultTransport.(*http.Transport).Clone()
transport.Proxy = http.ProxyURL(proxyURL)
client := &http.Client{
Transport: transport,
Timeout: 30 * time.Second,
}
代理与目标仍然是两个不同的值。代理值请从 SOCKS5 代理列表 中选择 SOCKS5 端点;HTTP/2 仍然是与目标协商的。用 client 请求真正的 HTTPS 服务 URL,然后按应用的常规生命周期关闭响应体。
标准默认传输支持 HTTP/2。克隆它可以保留该配置,同时允许更改代理选择。类型断言假设程序没有把 http.DefaultTransport 换成其他 RoundTripper。
对于单独构建的传输,请检查其 HTTP/2 配置,尤其是在提供自定义 dial 或 TLS 钩子时。Go 提供了 ForceAttemptHTTP2,在较新的版本中还为这些选择提供了显式的 Protocols 配置。
目标仍然必须通过 TLS 协商提供 HTTP/2。检查成功响应的 Proto 或 ProtoMajor 值,以确认实际使用的是哪种协议。通过 SOCKS 成功的 HTTPS 请求本身并不能证明协商出的协议就是 HTTP/2。