5

我正在编写一个简单的应用程序来确定某些网站是否支持 http/2。

根据我在草稿中读到的内容:

https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-http2-07#section-3.2

我应该能够做一个获取请求,例如

GET / HTTP/1.1
Host: server.example.com
Connection: Upgrade, HTTP2-Settings
Upgrade: h2c
HTTP2-Settings: <base64url encoding of HTTP/2 SETTINGS payload>

然后如果他们支持 http/2 响应应该是这样的:

 HTTP/1.1 101 Switching Protocols
 Connection: Upgrade
 Upgrade: HTTP/2.0

 [ HTTP/2.0 connection ...

我试图准确理解HTTP2-Settings请求标头的值应该是什么。

我希望有人可以解释示例中应包含哪些信息。

4

2 回答 2

11

HTTP/2 已经达到了官方标准的状态。

通过使用明文升级机制来确定网站是否支持 HTTP/2,您几乎没有运气。

原因是浏览器不支持这种升级到 HTTP/2 的方式(他们都更喜欢使用 ALPN 而不是 TLS),因此两个服务器都不支持。

[免责声明,我是 Jetty 提交者和 Jetty HTTP/2 实现者]。例如,Jetty 确实支持这种升级方式(甚至直接 HTTP/2),例如这些测试,但由于上述原因,我们不将其部署在我们自己的网站https://webtide.com上。

您不需要在此升级设置框架中发送任何内容,您只想在服务器有机会向您回复 HTTP/2 之前配置服务器时发送它,但通常默认值是可以的。

请记住,作为连接前言的一部分,客户端必须发送另一个SETTINGS 帧,该帧也可以为空或包含配置参数。通常 HTTP/2 客户端 API(例如Jetty HTTP2Client)将允许您轻松配置作为前言一部分的 SETTINGS 框架,因为它将在升级机制和 ALPN 机制中使用。

标头的最小有效值HTTP2-Settings是空字符串:

GET / HTTP/1.1
Host: host
Connection: Upgrade, HTTP2-Settings
Upgrade: h2c
HTTP2-Settings:
User-Agent: whatever

否则,您需要创建一个 SETTINGS 帧有效负载(仅此处定义的字节,因此没有此处定义的 9 个八位字节帧头),然后使用此处定义的 base64 转换这些字节

出于测试的目的,可以使用空HTTP2-Settings标头,但正如我所说,您肯定不会检测网站是否支持 HTTP/2:您的升级将失败,但该网站很可能通过 ALPN 支持 HTTP/2 over TLS .

于 2015-05-22T16:39:42.217 回答
1

该站点http://nghttp2.org/接受未加密的 HTTP2 (h2c) 连接,这样做:

GET / HTTP/1.1
Host: nghttp2.org
Connection: Upgrade, HTTP2-Settings
Upgrade: h2c
HTTP2-Settings:
User-Agent: whatever

正如 sbordet 所建议的那样,确实会从服务器产生“101 Switching Protocols”响应。

于 2016-10-12T20:53:15.493 回答