了解用于 http/2 请求和升级的 header HTTP2 设置的值
Understanding the value of the header HTTP2-Settings used for http/2 requests and upgrade
我正在编写一个简单的应用程序来确定某些网站是否支持 http/2。
根据我在草稿中阅读的内容:
https://datatracker.ietf.org/doc/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
请求 header 的确切值。
我希望有人可以解释示例中应包含哪些信息。
HTTP/2 已达到 official standard 的状态。
通过使用明文升级机制确定网站是否支持 HTTP/2 的可能性很小。
原因是浏览器不支持这种升级到 HTTP/2 的方式(他们都更喜欢使用 ALPN 而不是 TLS),因此服务器也不支持。
[免责声明,我是 Jetty 提交者和 Jetty HTTP/2 实施者]。
比如Jetty确实支持这种升级方式(甚至直接HTTP/2),参见例子these tests, but we don't deploy it on our own website, https://webtide.com,原因如上
您不需要在此升级设置框架中发送任何内容,如果您想在服务器有机会回复您 HTTP/2 之前配置服务器,您只想发送它,但通常默认值就可以了。
请记住,作为连接前言的一部分,客户端必须发送另一个 SETTINGS 帧,该帧也可以为空或包含配置参数。通常 HTTP/2 客户端 API,例如 Jetty HTTP2Client 将允许您轻松配置作为前言一部分的 SETTINGS 框架,因为它将在升级机制和 ALPN 机制中使用。
HTTP2-Settings
header 的最小有效值是空字符串:
GET / HTTP/1.1
Host: host
Connection: Upgrade, HTTP2-Settings
Upgrade: h2c
HTTP2-Settings:
User-Agent: whatever
否则您需要创建一个 SETTINGS 帧有效负载(仅定义的字节 here, and hence without the 9 octet frame header defined here), and then convert those bytes using base64 as defined here。
出于测试的目的,一个空的 HTTP2-Settings
header 就可以了,但是正如我所说,您肯定 不会 检测是否网站支持 HTTP/2:您的升级将失败,但该网站可能会通过 ALPN 通过 TLS 支持 HTTP/2。
此站点 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 切换协议”响应。
我正在编写一个简单的应用程序来确定某些网站是否支持 http/2。
根据我在草稿中阅读的内容:
https://datatracker.ietf.org/doc/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
请求 header 的确切值。
我希望有人可以解释示例中应包含哪些信息。
HTTP/2 已达到 official standard 的状态。
通过使用明文升级机制确定网站是否支持 HTTP/2 的可能性很小。
原因是浏览器不支持这种升级到 HTTP/2 的方式(他们都更喜欢使用 ALPN 而不是 TLS),因此服务器也不支持。
[免责声明,我是 Jetty 提交者和 Jetty HTTP/2 实施者]。 比如Jetty确实支持这种升级方式(甚至直接HTTP/2),参见例子these tests, but we don't deploy it on our own website, https://webtide.com,原因如上
您不需要在此升级设置框架中发送任何内容,如果您想在服务器有机会回复您 HTTP/2 之前配置服务器,您只想发送它,但通常默认值就可以了。
请记住,作为连接前言的一部分,客户端必须发送另一个 SETTINGS 帧,该帧也可以为空或包含配置参数。通常 HTTP/2 客户端 API,例如 Jetty HTTP2Client 将允许您轻松配置作为前言一部分的 SETTINGS 框架,因为它将在升级机制和 ALPN 机制中使用。
HTTP2-Settings
header 的最小有效值是空字符串:
GET / HTTP/1.1
Host: host
Connection: Upgrade, HTTP2-Settings
Upgrade: h2c
HTTP2-Settings:
User-Agent: whatever
否则您需要创建一个 SETTINGS 帧有效负载(仅定义的字节 here, and hence without the 9 octet frame header defined here), and then convert those bytes using base64 as defined here。
出于测试的目的,一个空的 HTTP2-Settings
header 就可以了,但是正如我所说,您肯定 不会 检测是否网站支持 HTTP/2:您的升级将失败,但该网站可能会通过 ALPN 通过 TLS 支持 HTTP/2。
此站点 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 切换协议”响应。