【发布时间】:2018-10-30 05:59:40
【问题描述】:
我正在尝试使用 HTTP/2 扩展服务器,该服务器已经支持 HTTP/1.1 和 TLS v1.2。我在 Go 中编写它,在那里我定义了这样的 tls 配置 -
tlsConfig := &tls.Config{
Certificates: []tls.Certificate{cert},
ServerName: "mysrvr",
NextProtos: []string{"h2", "http/1.1", "http/1.0"},
Time: time.Now,
Rand: rand.Reader,
}
很明显,我使用“h2”字符串来设置 ALPN 握手。
现在当我通过 curl 发出请求时,我收到了这个请求 -
$ curl -v https://127.0.0.1:8000 -k --http2
当我解析请求时,它显示一个 PRI 方法首先发送而不是 GET -
HTTP/2.0
PRI
我从https://www.rfc-editor.org/rfc/rfc7540#page-78 获得了一些关于 PRI 方法的想法,其中说如下 -
This method is never used by an actual client.
This method will appear to be used when an HTTP/1.1 server or
intermediary attempts to parse an HTTP/2 connection preface.
我现在的问题是为什么发送 PRI 请求,而服务器显然支持 HTTP/2?我是否需要根据 HTTP/2 规范解析它并使用空的 SETTINGS 帧进行响应,还是应该由 Go http2 运行时处理它?
我正在使用 http.ReadRequest 解析客户端请求,但即使我忽略 PRI 请求(如建议如下)。
【问题讨论】:
-
当标准库包含一个已经支持 HTTP/2 的 HTTP 服务器时,为什么还要编写自己的 HTTP 服务器?重新发明轮子通常是个坏主意。
-
我的用例有点不同。另外,我想通过这个实验更多地了解 Go 和 http2。