http2 в curl

Проект curl начал эксперименты с поддержкой http2, начиная с сентября 2013 года.

В духе curl, мы намереваемся поддерживать все аспекты http2, которые сможем. curl часто используется как тестовая утилита и простой способ проверить веб-сайт, и мы намерены сохранить эту возможность также и для http2.

Curl использует отдельную библиотеку nghttp2 для работы со слоем http2 фреймов. Curl требуется nghttp2 версии 1.0 или больше.

Обратите внимание, что в настоящее время на Linux curl и libcurl не всегда поставляются с включенной поддержкой протокола HTTP/2.

11.1. Выглядит как HTTP 1.x

Внутренне curl будет конвертировать входящие http2-заголовки в заголовки в стиле HTTP 1.x и передавать их пользователю так, что они будут казаться очень похожими на существующий HTTP. Это упростит переход для чего бы не использовался curl и HTTP сегодня. Точно также curl конвертирует выходные заголовки. Передайте curl заголовки в стиле HTTP 1.x и он сконвертирует их на лету, когда будет передавать для http2-сервера. Это также позволяет пользователям особо не волноваться или заботиться о том, какая конкретно версия HTTP используется в сетевом обмене.

11.2. Нешифрованный простой текст.

curl поддерживает http2 поверх стандартного TCP с помощью заголовка Upgrade. Если вы выполняете HTTP-запрос и запрашиваете HTTP 2, curl попросит сервер обновить соединение до http2, если это возможно.

11.3. TLS и выбор библиотеки

curl поддерживает широкий спектр различных TLS-библиотек в качестве своего TLS-бэкенда, и это по-прежнему верно и для поддержки http2. Проблема с TLS для http2 – это наличие поддержки APLN и, в некоторой мере, поддержки NPN.

Собирайте curl с современными версиями OpenSSL или NSS чтобы получить поддержку ALPN и NPN. При использовании GnuTLS или PolarSSL вы получите поддержку ALPN, но не NPN.

11.4. Использование в командной строке

Чтобы объяснить curl, что надо начать использовать http2, как открытым текстом, так и через TLS, вы можете использовать опцию --http2 («дефис дефис http2»). Curl по прежнему по умолчанию использует HTTP/1.1, поэтому эта опция необходима, если вы хотите http2.

11.5. Опции libcurl

11.5.1 Включение HTTP/2

Ваше приложение как обычно использует https:// или http:// URL'ы, но вы можете задать опцию из curl_easy_setopt CURLOPT_HTTP_VERSION в значение CURL_HTTP_VERSION_2, чтобы libcurl попытался использовать http2. Он попытается сделать всё возможное для работы с http2, если сможет, но по-прежнему будет оперировать с HTTP 1.1.

11.5.2 Мультиплексирование

Поскольку lubcurl стремится сохранять своё привычное поведение, вам потребуется включить в вашем приложении HTTP/2 мультиплексирования с помощью опции CURLMOPT_PIPELINING. В противном случае он продолжит использовать по одному одновременному запросу на соединение.

Ещё одна небольшая деталь, которую надо учитывать: если вы запросите несколько передач за раз с помощью libcurl с использованием мульти-интерфейса, приложение может сразу запустить произвольное число передач, но если вы хотите, чтобы libcurl немного подождал перед запуском следующей передачи по существующему соединению вместо открытия нового соединения для всех их сразу, вы можете использовать опцию CURLOPT_PIPEWAIT для каждой индивидуальной передачи.

11.5.3 Посылка сервера

libcurl версии 7.44.0 и более поздних поддерживает HTTP/2 посылку сервера. Вы можете получить эту возможность установив функцию обратного вызова с помощью опции CURLMOPT_PUSHFUNCTION. Если посылка поддерживается приложением, то будет создана новая передача данных, которую CURL легко запустит и получит содержимое так же, как и при любой другой передаче данных.