每次请求后关闭http2客户端连接

时间:2019-10-13 05:20:16

标签: go client http2

我想在每个请求后关闭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)

我想念什么?

1 个答案:

答案 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,   代理连接,传输编码和升级,即使它们不是   由“连接”标题字段指定。

另请参见