我想在每个请求后关闭http2客户端连接(例如在http1.1中禁用保持活动连接)。我尝试添加标题Connection: close
,但这给了
http2:客户端conn无法使用错误。
我尝试使用request.Close = true以及文档中指定的内容,但仍然出现错误。
以下是我正在使用的代码段:
func main() {
enableCompression := false
transport2 := &http2.Transport{
DisableCompression: !enableCompression,
AllowHTTP: true,
DialTLS: func(network, addr string, cfg *tls.Config) (net.Conn, error) {
return net.Dial(network, addr)
},
}
// Create http client
client := http.Client{
Transport: transport2,
Timeout: time.Duration(1 * time.Second),
}
var err error
var request *http.Request
if request, err = createRequest(); err == nil {
request.Close = true
var response *http.Response
if response, err = client.Do(request); err == nil {
fmt.Println(response)
} else {
fmt.Println("error: ", err)
}
}
}
func createRequest() (request *http.Request, err error) {
if request, err = http.NewRequest("GET", "http://0.0.0.0:1010/hello/sayHello", nil); err == nil {
fmt.Println(request)
}
return
}
这给出了错误: http2:客户端conn不可用(在等待标头时超出了Client.Timeout)
我想念什么?
答案 0 :(得分:0)
HTTP / 2不允许这种行为。
https://httpwg.org/specs/rfc7540.html#rfc.section.8.1.2
8.1.2.2。特定于连接的标题字段
HTTP / 2不使用连接头字段来指示 特定于连接的标头字段;在这个协议中 特定于连接的元数据通过其他方式传达。 [...]
[...]
这意味着中介将HTTP / 1.x消息转换为 HTTP / 2将需要删除由 连接头字段,以及连接头字段 本身。这些中介人也应删除其他 特定于连接的标头字段,例如Keep-Alive, 代理连接,传输编码和升级,即使它们不是 由“连接”标题字段指定。
另请参见