我正在编写一个简单的应用程序来确定某些网站是否支持http/2。
根据我在草稿中读到的内容:
https://tools.ietf.org/html/draft-ietf-httpbis-http2-07#section-3.2
我应该可以做一个get请求,比如

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请求头的值应该是什么。
我希望有人能解释什么信息应该包括在一个例子中。

最佳答案

http/2已达到official standard状态。
通过使用cleartext升级机制,您很难确定网站是否支持http/2。
原因是浏览器不支持这种升级到http/2的方式(他们都喜欢使用alpn而不是tls),因此两个服务器都不支持。
[免责声明,我是jetty提交者和jetty http/2实现者]。
例如,jetty确实支持这种类型的升级(甚至直接http/2),请参见例如these tests,但出于上述原因,我们不在自己的网站https://webtide.com上部署它。
您不需要在这个升级设置框架中发送某些内容,您只想在服务器有机会向您回讲http/2之前配置服务器时发送,但通常默认值是可以的。
请记住,作为连接前言的一部分,客户端必须发送另一个设置帧,它也可以是空的或包含配置参数。通常,http/2客户端api(如Jetty HTTP2Client)将允许您轻松配置前言中的设置框架,因为它将用于升级机制和alpn机制。
HTTP2-Settings头的最小有效值是空字符串:

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

否则,您需要创建一个设置帧有效负载(仅定义here的字节,因此没有定义here的9八位字节帧头),然后使用base64转换这些字节。
为了您的测试,一个空的HTTP2-Settings头就可以了,但是正如我所说,您肯定不会检测到一个网站是否支持http/2:您的升级将失败,但是该网站很可能通过alpn支持http/2 over tls。

09-15 16:17