首页 > 解决方案 > x/net/http2:ConnState 无法跟踪

问题描述

net/httpSDK中的包Server结构有ConnState func(net.Conn, ConnState),但在'x/net/http2'的'Server'结构中不存在

有了这个h2c特性,当状态变量转换为 时http.StateHijacked,我将不再知道连接的后续状态。

我希望能够跟踪这个 TCP 连接的状态,直到它关闭。

有没有这样的功能或灵活的解决方案?谢谢

标签: httpgotcphttp2grpc-go

解决方案


您不应在生产中使用此代码。

从 x/net/http2:

这是一个正在进行中的 Go 的 HTTP/2 实现。

对于您的 h2c 支持,有以下信息:

ServeConn 在提供的连接上提供 HTTP/2 请求并阻塞,直到连接不再可读。

ServeConn 假设 c 没有任何读取或写入,开始使用 HTTP/2。它写入其初始设置框架并期望能够从客户端读取前言和设置框架。如果 c 具有像 *tls.Conn 这样的 ConnectionState 方法,则 ConnectionState 用于验证 TLS 密码套件并设置 Handlers 中的 Request.TLS 字段。

ServeConn 本身不支持 h2c。任何 h2c 支持都必须根据提供适当行为的 net.Conn 来实施。

HTTP/2 不支持 H2C,他们削减支持的技术原因很少。您可以在以下堆栈线程中找到更多信息:为什么 Web 浏览器不支持 h2c(没有 TLS 的 HTTP/2)?

你不应该知道连接状态,你应该依赖语言库。如果您需要检查连接是否可以接受新连接,这里有功能:https ://pkg.go.dev/golang.org/x/net/http2#ClientConn.CanTakeNewRequest


只是为了了解更多上下文,我有一个问题:为什么需要知道应用程序中的连接状态?这是一个应该从您的应用程序中隐藏的逻辑。


推荐阅读