Не удается увидеть заголовок Http-Settings в примере nghttp2 - PullRequest
0 голосов
/ 08 июля 2019

В настоящее время я пытаюсь выучить 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));
  }
}

Я также не знаю, какой тег мы используем для HTTP-настроек в протоколе http2, как и для метода, который мыесть ": метод", для схемы ": схема" и т. д. Я не смог найти его даже в RFC.

1 Ответ

0 голосов
/ 08 июля 2019

Кадр настроек HTTP / 2 не является заголовком HTTP - это отдельное сообщение, отправляемое в начале соединения. Поэтому невозможно отобразить его так, как если бы он был заголовком HTTP.

HTTP / 2 содержит много таких невидимых контрольных кадров:

  • Рамка SETTINGS, чтобы определить, как используется соединение
  • WINDOW_UPDATE кадр для реализации управления потоком
  • Фрейм ПРИОРИТЕТА для перераспределения потоков (и, следовательно, ответов).

... и т.д.

Обычно браузеры и серверы не показывают эти управляющие сообщения пользователю или даже в инструментах разработчика. Chrome позволяет просматривать их с помощью URL-адреса chrome://net-export, или вы можете использовать инструмент сетевого анализа, например 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 *). 1025 *) но это особый случай, и при отправке это сообщение HTTP / 1.1. Кроме того, браузеры поддерживают только HTTP / 2 через HTTPS ( по уважительным причинам ), и я вижу, что вы также используете HTTPS. Поэтому я бы проигнорировал это и упомянул об этом только ради полноты.

...