了解用于http / 2请求和升级的标头HTTP2-Settings的值

时间:2015-05-22 15:35:08

标签: http protocols spdy http2

我正在编写一个简单的应用来确定某些网站是否支持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请求标头的值应该是什么。

我希望有人可以解释一个例子中应该包含哪些信息。

2 个答案:

答案 0 :(得分:5)

HTTP / 2已达到official standard的状态。

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

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

[免责声明,我是Jetty提交者和Jetty HTTP / 2实现者]。 例如,Jetty确实支持这种升级方式(甚至是直接HTTP / 2),例如参见these tests,但我们不会在我们自己的网站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帧有效负载(只有定义的字节为here,因此没有定义的9个八位字节帧头here),然后转换它们使用base64定义的here

出于测试的目的,会有一个空的HTTP2-Settings标题,但正如我所说,你肯定检测网站是否支持HTTP / 2:你的升级将会失败,但网站可能会通过ALPN支持HTTP / 2 over TLS。

答案 1 :(得分:0)

此站点http://nghttp2.org/接受非加密的HTTP2(h2c)连接,所以:

Eigen::VectorXd v(4);
v << 1, 2, 3, 4;
std::cout << v(2, 0); // displays 3

根据sbordet的建议确实从服务器产生了“101 Switching Protocols”响应。