http.Transport禁用Http2

在服务器端支持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),
}