【问题标题】:Close http2 client connection after every request每次请求后关闭 http2 客户端连接
【发布时间】:2020-02-10 03:15:44
【问题描述】:

我想在每次请求后关闭 http2 客户端连接(例如在 http1.1 中禁用 keep-alive 连接)。我尝试添加标题Connection: close 但这给出了 http2:客户端连接不可用错误。

我尝试使用 request.Close = true 以及在文档中指定,但仍然出现错误。

以下是我正在使用的代码 sn-p:

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: 客户端连接不可用(等待标头时超出 Client.Timeout)

我错过了什么?

【问题讨论】:

  • 我正在考虑将此问题重用于通用“golang:我想控制 HTTP/2 连接”。

标签: go client http2


【解决方案1】:

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 将需要删除由 Connection 标头字段,以及 Connection 标头字段 本身。此类中介机构还应删除其他 特定于连接的头字段,例如 Keep-Alive, 代理连接、传输编码和升级,即使它们不是 由 Connection 标头字段指定。

另见

【讨论】:

  • 感谢您的澄清。只是好奇,如果我想在每次请求 HTTP/2 后关闭连接,可以做什么? Go 根本不允许这样做?
  • 你可以试试github.com/golang/net/blob/master/http2/transport.go#L475 但实际上http/2 和http/1.1 是不同的。你所问的以某种方式违背了它的目的。
  • 非常感谢!这似乎有效。同意,这会破坏目的,但在 http2 服务器处理程序中添加 Header 确实可以完成工作,所以我认为它也应该适用于客户端。参考:github.com/golang/go/issues/20977
  • 我明白了,谢谢你的链接。请注意,它会在空闲时断开连接,请查看评论 github.com/golang/net/commit/… 我不确定将连接视为空闲的条件,但作为快速猜测,它可能不会立即生效。
猜你喜欢
  • 1970-01-01
  • 2020-08-06
  • 1970-01-01
  • 2020-05-22
  • 2015-11-08
  • 2018-09-23
  • 1970-01-01
  • 1970-01-01
  • 2013-08-10
相关资源
最近更新 更多