我想在每个请求后关闭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)
我想念什么?
HTTP / 2不允许该行为。
https://httpwg.org/specs/rfc7540.html#rfc.section.8.1.2
8.1.2.2。特定于连接的标题字段
HTTP / 2不使用Connection标头字段指示特定于连接的标头字段;在这个协议中特定于连接的元数据通过其他方式传达。 [...]
[...]
这意味着中介将HTTP / 1.x消息转换为HTTP / 2将需要删除由连接头字段,以及连接头字段本身。这些中介人也应删除其他特定于连接的标头字段,例如Keep-Alive,代理连接,传输编码和升级,即使它们不是由连接头字段指定。
另请参见