即使强制尝试设置为false,Go http请求也会返回到http2



每隔几个请求就会发生一件奇怪的事情,Go的http包会抛出以下错误:

http2: server sent GOAWAY and closed the connection; LastStreamID=19999, ErrCode=NO_ERROR, debug=""

因此我意识到默认传输的ForceAttemptHTTP2设置为true(https://golang.org/src/net/http/transport.go第48行(,所以我手动将其设置为false,如下所示:

transport := &http.Transport{
ForceAttemptHTTP2: false,
}
httpClient := &http.Client{Transport: transport}

但即使这样做了,我仍然会得到相同的http2错误,而不是http1,这对我来说没有意义吗?

我是网络新手,所以我有一种感觉,我错过了一些应该在这里显而易见的东西?

我想问题是如何强制http包只使用http而不使用http2

这似乎做到了:

package main
import (
"crypto/tls"
"net/http"
)
func main() {
client := &http.Client{
Transport: &http.Transport{
TLSNextProto: map[string]func(string, *tls.Conn)http.RoundTripper{},
},
}
req, e := http.NewRequest("HEAD", "https://stackoverflow.com", nil)
if e != nil {
panic(e)
}
res, e := client.Do(req)
if e != nil {
panic(e)
}
println(res.Proto == "HTTP/1.1")
}

必须禁用HTTP/2的程序可以通过设置Transport.TLSNextProto来执行此操作(对于客户端(或Server.TLSNextProto(对于服务器(到非零的空映射。

https://golang.org/pkg/net/http#pkg-概述

诚然,这是一个相当尴尬的语法,所以你可能更喜欢这样的语法相反:

package main
import (
"net/http"
"os"
)
func main() {
os.Setenv("GODEBUG", "http2client=0")
req, e := http.NewRequest("HEAD", "https://stackoverflow.com", nil)
if e != nil {
panic(e)
}
res, e := new(http.Client).Do(req)
if e != nil {
panic(e)
}
println(res.Proto == "HTTP/1.1")
}

最新更新