在nghttp2示例中看不到Http设置标头

时间:2019-07-08 18:28:03

标签: c http2 nghttp2

我目前正在尝试学习nghttp2,并正在尝试执行此页面底部提供的客户端代码:

https://nghttp2.org/documentation/tutorial-client.html

我执行了以下的C代码:

./libevent-client URL

我的服务器是Windows IIS 10.0,我想在标题的输出中看到http2-settings框架。到目前为止,它显示以下输出:

Connected
Request headers:
:method: GET
:scheme: https
:authority: MY URL
:path: /

Response headers from stream ID=1:
:status: 200
content-type: text/html
last-modified: Mon, 01 Jul 2019 17:57:17 GMT
accept-ranges: bytes
etag: "c7c5406c3630d51:0"
server: Microsoft-IIS/10.0
date: Mon, 08 Jul 2019 16:02:27 GMT
content-length:51
All headers received

<html><head>Hello</head><html>

我需要知道代码中需要什么才能查看http设置是否随请求传递。我知道以下功能可以完成发送带有请求的SETTINGS帧的工作:

static void send_client_connection_header(http2_session_data *session_data) {
  nghttp2_settings_entry iv[1] = {
      {NGHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS, 100}};
  int rv;

  /* client 24 bytes magic string will be sent by nghttp2 library */
  rv = nghttp2_submit_settings(session_data->session, NGHTTP2_FLAG_NONE, iv,
                               ARRLEN(iv));
  if (rv != 0) {
    errx(1, "Could not submit SETTINGS: %s", nghttp2_strerror(rv));
  }
}

我也不知道我们在http2协议中用于HTTP设置的标记是什么,就像我们使用方法“:method”,方案“:scheme”等一样。即使在RFC。

1 个答案:

答案 0 :(得分:0)

HTTP / 2设置框架不是HTTP标头-它是在连接开始时发送的单独消息。因此,不可能像显示HTTP标头一样显示它。

HTTP / 2包含许多此类不可见的控制帧:

  • 设置框架以定义连接的使用方式
  • WINDOW_UPDATE框架以实现流控制
  • 用于重定优先级的流的优先级框架(以及响应)。

...等等。

通常,浏览器和服务器不会向用户甚至在开发人员工具中都不会显示这些控制消息。 Chrome允许您使用chrome://net-export URL来查看它们,也可以使用Wireshark等网络嗅探工具来查看它们。

不过,最简单的方法之一(也是检查原始帧来学习HTTP / 2的一种很好的方法)是使用nghttpd工具(它是nghttp2套件的一部分)来创建一个HTTP / 2服务器,该服务器可以记录以详细模式运行时发送给它的所有消息,例如:

nghttpd -v 443 server.key server.crt

我将在我的书中更深入地讨论如何做到这一点,您可以每天在以下网址免费在线预览5分钟:https://livebook.manning.com/#!/book/http2-in-action/chapter-4/176

我应该说的一件事是,当通过非加密的HTTP / 1.1(而不是HTTPS)进行连接,然后升级到HTTP / 2时,设置将以HTTP标头(称为HTTP2-Settings)发送,但是这是一种特殊情况,发送时消息为HTTP / 1.1消息。另外,浏览器仅通过HTTPS(for good reasons)支持HTTP / 2,我也看到您也在使用HTTPS。因此,我会忽略这一点,仅出于完整性考虑而提及它。