在服务器端支持http2时,golang的http.Transport默认是启用的http2的(GO 1.6 and later)。在默认场景下,性能是非常高的,这得益于http2相比http1.1的进化。但是在一些特殊场景下,这样会带来很多麻烦。
最近写了一个自动切换proxy的ProxyFunc,发现并不是每次请求都会调用ProxyFunc。追查了一番源代码,发现只要禁用掉http2就可以让每次请求都走ProxyFunc函数。
禁用方法有两个
使用GODEBUG环境变量
GODEBUG=http2client=0
Transport的TLSNextProto非空
// Disable HTTP/2
http.DefaultClient.Transport = &http.Transport{
TLSNextProto: make(map[string]func(authority string, c *tls.Conn) http.RoundTripper),
}