HTTP/2¶
Добавлено в: v8.4.0
Стабильность: 2 – Стабильная
API является удовлетворительным. Совместимость с NPM имеет высший приоритет и не будет нарушена кроме случаев явной необходимости.
Модуль node:http2 реализует протокол HTTP/2. Подключение:
1 | |
Проверка отсутствия поддержки криптографии¶
Node.js может быть собран без модуля node:crypto. Тогда import из node:http2 или require('node:http2') приведут к выбросу ошибки.
В CommonJS ошибку можно перехватить через try/catch:
1 2 3 4 5 6 | |
При лексическом import в ESM ошибку можно перехватить только если обработчик process.on('uncaughtException') зарегистрирован до любой попытки загрузить модуль (например через preload).
Если код ESM может выполняться на сборке без криптографии, используйте динамический import() вместо лексического import:
1 2 3 4 5 6 | |
Основной API (Core API)¶
Core API — низкоуровневый интерфейс вокруг возможностей HTTP/2. Он не рассчитан на совместимость с модулем HTTP/1, зато есть API совместимости.
Core API http2 симметричнее для клиента и сервера, чем http: события вроде 'error', 'connect' и 'stream' могут испускаться и на клиенте, и на сервере.
Пример сервера¶
Ниже простой HTTP/2-сервер на Core API. Известных браузеров с поддержкой незашифрованного HTTP/2 нет, поэтому для работы с браузерами нужен http2.createSecureServer().
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | |
Чтобы сгенерировать сертификат и ключ для примера, выполните:
1 2 | |
Пример клиента¶
Пример HTTP/2-клиента:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | |
Класс: Http2Session¶
- Наследует:
<EventEmitter>
Экземпляры класса http2.Http2Session представляют активную сессию обмена данными между HTTP/2-клиентом и сервером. Экземпляры этого класса не предназначены для прямого создания из прикладного кода.
Поведение каждого экземпляра Http2Session немного различается в зависимости от того, работает ли он как сервер или как клиент. Свойство http2session.type позволяет определить режим работы Http2Session. На стороне сервера прикладному коду редко приходится работать с объектом Http2Session напрямую: обычно действия выполняются через Http2Server или объекты Http2Stream.
Прикладной код не создаёт экземпляры Http2Session напрямую. На сервере они создаются экземпляром Http2Server при приёме нового соединения HTTP/2. На клиенте экземпляры Http2Session создаются вызовом http2.connect().
Http2Session и сокеты¶
Каждый экземпляр Http2Session при создании связан ровно с одним net.Socket или tls.TLSSocket. При уничтожении Socket или Http2Session уничтожаются оба.
Из-за особых требований к сериализации и обработке, которые накладывает протокол HTTP/2, прикладному коду не рекомендуется читать данные из Socket или записывать в него, если сокет привязан к Http2Session. Это может перевести сессию HTTP/2 в неопределённое состояние и сделать сессию и сокет непригодными к использованию.
После привязки Socket к Http2Session прикладной код должен опираться только на API Http2Session.
Событие: 'close'¶
Событие 'close' генерируется после уничтожения Http2Session. У обработчика нет аргументов.
Событие: 'connect'¶
session<Http2Session>socket<net.Socket>
Событие 'connect' генерируется после успешного подключения Http2Session к удалённой стороне; можно начинать обмен.
Прикладной код обычно не подписывается на это событие напрямую.
Событие: 'error'¶
error<Error>
Событие 'error' генерируется при ошибке обработки Http2Session.
Событие: 'frameError'¶
type<integer>Тип кадра.code<integer>Код ошибки.id<integer>Идентификатор потока (или0, если кадр не связан с потоком).
Событие 'frameError' генерируется при ошибке отправки кадра в сессии. Если кадр, который не удалось отправить, относится к конкретному Http2Stream, делается попытка сгенерировать 'frameError' на этом Http2Stream.
Если 'frameError' связан с потоком, поток сразу после него закрывается и уничтожается. Если событие не связано с потоком, Http2Session завершается сразу после 'frameError'.
Событие: 'goaway'¶
errorCode<number>Код ошибки HTTP/2 из кадраGOAWAY.lastStreamID<number>Идентификатор последнего потока, успешно обработанного удалённой стороной (или0, если не указан).opaqueData<Buffer>Если в кадреGOAWAYбыли дополнительные непрозрачные данные, передаётсяBufferс ними.
Событие 'goaway' генерируется при получении кадра GOAWAY.
Экземпляр Http2Session автоматически завершается при генерации 'goaway'.
Событие: 'localSettings'¶
settings<HTTP/2 Settings Object>Копия полученного кадраSETTINGS.
Событие 'localSettings' генерируется при получении подтверждающего кадра SETTINGS.
При вызове http2session.settings() новые параметры вступают в силу только после события 'localSettings'.
1 2 3 4 5 | |
Событие: 'ping'¶
payload<Buffer>8-байтовая полезная нагрузка кадраPING
Событие 'ping' генерируется при каждом получении кадра PING от подключённого пира.
Событие: 'remoteSettings'¶
settings<HTTP/2 Settings Object>Копия полученного кадраSETTINGS.
Событие 'remoteSettings' генерируется при получении нового кадра SETTINGS от пира.
1 2 3 | |
Событие: 'stream'¶
stream<Http2Stream>Ссылка на потокheaders<HTTP/2 Headers Object>Объект заголовковflags<number>Связанные числовые флагиrawHeaders<HTTP/2 Raw Headers>Массив сырых заголовков
Событие 'stream' генерируется при создании нового Http2Stream.
1 2 3 4 5 6 7 8 9 10 11 | |
На сервере обычно не подписываются на это событие напрямую, а обрабатывают 'stream' у net.Server или tls.Server из http2.createServer() и http2.createSecureServer(), как в примере:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
Потоки HTTP/2 и сетевые сокеты не соответствуют друг другу 1:1; сетевая ошибка уничтожает каждый поток отдельно — обрабатывайте на уровне потока, как выше.
Событие: 'timeout'¶
После http2session.setTimeout() событие 'timeout' генерируется при отсутствии активности на Http2Session в течение заданных миллисекунд. У обработчика нет аргументов.
1 2 | |
http2session.alpnProtocol¶
- Тип:
<string>| undefined
Значение undefined, если Http2Session ещё не подключена к сокету; h2c, если не используется TLSSocket; иначе — значение alpnProtocol подключённого TLSSocket.
http2session.close([callback])¶
callback<Function>
Корректно закрывает Http2Session: текущие потоки завершаются сами, новые Http2Stream не создаются. После закрытия http2session.destroy() может быть вызвана, если нет открытых Http2Stream.
Если указан callback, он регистрируется как обработчик 'close'.
http2session.closed¶
- Тип:
<boolean>
true, если сессия закрыта, иначе false.
http2session.connecting¶
- Тип:
<boolean>
true, пока сессия ещё подключается; перед событием connect и/или вызовом колбэка http2.connect станет false.
http2session.destroy([error][, code])¶
error<Error>Ошибка, если уничтожение из-за ошибки.code<number>Код ошибки HTTP/2 для финального кадраGOAWAY. Если не задан иerrorнеundefined, по умолчаниюINTERNAL_ERROR, иначеNO_ERROR.
Немедленно завершает Http2Session и связанный net.Socket или tls.TLSSocket.
После уничтожения — событие 'close'. Если error не undefined, перед 'close' сгенерируется 'error'.
Оставшиеся открытые Http2Stream этой сессии тоже уничтожаются.
http2session.destroyed¶
- Тип:
<boolean>
true, если сессия уничтожена и больше не должна использоваться.
http2session.encrypted¶
- Тип:
<boolean>| undefined
undefined, если сокет сессии ещё не подключён; true при TLSSocket; false для других типов сокета или потока.
http2session.goaway([code[, lastStreamID[, opaqueData]]])¶
code<number>Код ошибки HTTP/2lastStreamID<number>Числовой ID последнего обработанногоHttp2StreamopaqueData<Buffer>|<TypedArray>|<DataView>Дополнительные данные в кадреGOAWAY
Отправляет кадр GOAWAY пиру без закрытия Http2Session.
http2session.localSettings¶
Объект без прототипа с текущими локальными настройками этой Http2Session.
http2session.originSet¶
- Тип:
<string[]>| undefined
При подключении к TLSSocket возвращает массив origin, для которых сессия может считаться авторитетной. Только при TLS.
http2session.pendingSettingsAck¶
- Тип:
<boolean>
Ожидает ли сессия подтверждения отправленного SETTINGS. true после http2session.settings(); false, когда все SETTINGS подтверждены.
http2session.ping([payload, ]callback)¶
Добавлено в: v8.9.3
payload<Buffer>|<TypedArray>|<DataView>Необязательная полезная нагрузка пинга.callback<Function>- Возвращает:
<boolean>
Отправляет кадр PING HTTP/2-пиру. callback обязателен. Возвращает true, если PING отправлен, иначе false.
Максимум неподтверждённых пингов задаётся maxOutstandingPings (по умолчанию 10).
payload — ровно 8 байт в Buffer, TypedArray или DataView; возвращается с подтверждением пинга.
Колбэк: (err, duration, payload) — err равен null при успехе, duration — миллисекунды от отправки до подтверждения, payload — 8 байт ответа.
1 2 3 4 5 6 | |
Без payload по умолчанию — 64-битная метка времени (little endian) начала измерения PING.
http2session.ref()¶
Вызывает ref() для базового net.Socket.
http2session.remoteSettings¶
Объект без прототипа с удалёнными настройками; их задаёт подключённый пир HTTP/2.
http2session.setLocalWindowSize(windowSize)¶
windowSize<number>
Задаёт размер окна локальной конечной точки. windowSize — полный размер окна, не дельта.
1 2 3 4 5 6 7 8 9 | |
1 2 3 4 5 6 7 8 9 | |
Для клиентов HTTP/2 подходят события 'connect' или 'remoteSettings'.
http2session.setTimeout(msecs, callback)¶
Добавлено в: v8.4.0
msecs<number>callback<Function>
Задаёт колбэк при отсутствии активности на Http2Session дольше msecs мс; регистрируется как слушатель 'timeout'.
http2session.socket¶
- Тип:
<net.Socket>|<tls.TLSSocket>
Возвращает объект Proxy, ведущий себя как net.Socket (или tls.TLSSocket), но ограничивает методы безопасными для HTTP/2.
destroy, emit, end, pause, read, resume, write дают ошибку ERR_HTTP2_NO_SOCKET_MANIPULATION. См. Http2Session и сокеты.
setTimeout вызывается на этой Http2Session.
Остальное проксируется на сокет.
http2session.state¶
Разная информация о состоянии Http2Session.
- Тип:
<Object> effectiveLocalWindowSize<number>Текущий локальный размер окна приёма.effectiveRecvDataLength<number>Байт получено с последнегоWINDOW_UPDATE.nextStreamID<number>Следующий ID для новогоHttp2Stream.localWindowSize<number>Сколько байт удалённый пир может отправить безWINDOW_UPDATE.lastProcStreamID<number>ID потока, для которого последним пришёлHEADERSилиDATA.remoteWindowSize<number>Сколько байт может отправить эта сессия безWINDOW_UPDATE.outboundQueueSize<number>Кадров в исходящей очереди.deflateDynamicTableSize<number>Размер исходящей динамической таблицы сжатия заголовков.inflateDynamicTableSize<number>Размер входящей динамической таблицы.
Объект с текущим состоянием сессии.
http2session.settings([settings][, callback])¶
Добавлено в: v8.4.0
settings<HTTP/2 Settings Object>callback<Function>Вызывается после подключения сессии или сразу, если уже подключена.err<Error>| nullsettings<HTTP/2 Settings Object>Обновлённый объект настроек.duration<integer>
Обновляет локальные настройки и отправляет SETTINGS пиру.
После вызова http2session.pendingSettingsAck будет true, пока пир не подтвердит.
Новые настройки вступают в силу после подтверждения SETTINGS и события 'localSettings'. Можно отправить несколько SETTINGS подряд.
http2session.type¶
- Тип:
<number>
http2session.type равен http2.constants.NGHTTP2_SESSION_SERVER для сервера и http2.constants.NGHTTP2_SESSION_CLIENT для клиента.
http2session.unref()¶
Вызывает unref() для базового net.Socket.
Класс: ServerHttp2Session¶
- Наследует:
<Http2Session>
serverhttp2session.altsvc(alt, originOrStream)¶
alt<string>Описание альтернативной службы по RFC 7838.originOrStream<number>|<string>|<URL>|<Object>origin URL (или объект сorigin) либо числовой ID активногоHttp2Stream(http2stream.id).
Отправляет клиенту кадр ALTSVC (RFC 7838).
1 2 3 4 5 6 7 8 9 10 11 12 | |
1 2 3 4 5 6 7 8 9 10 11 12 | |
Отправка кадра ALTSVC с конкретным идентификатором потока означает, что альтернативная служба связана с origin данного Http2Stream.
Строки alt и origin должны содержать только байты ASCII и интерпретируются строго как последовательность байтов ASCII. Специальное значение 'clear' можно передать, чтобы сбросить ранее заданную альтернативную службу для домена.
Если в аргумент originOrStream передана строка, она разбирается как URL и из неё извлекается значение origin. Например, для URL HTTP 'https://example.org/foo/bar' значение origin — ASCII-строка 'https://example.org'. Будет выброшена ошибка, если строку нельзя разобрать как URL или из неё нельзя получить корректный origin.
В качестве originOrStream можно передать объект URL или любой объект со свойством origin; тогда используется значение свойства origin. Значение свойства origin должно быть корректно сериализованным ASCII origin.
Указание альтернативных служб¶
Формат параметра alt строго задан RFC 7838: это ASCII-строка со списком «альтернативных» протоколов через запятую, связанных с конкретным хостом и портом.
Например, значение 'h2="example.org:81"' означает, что протокол HTTP/2 доступен на хосте 'example.org' на TCP/IP-порту 81. Хост и порт должны быть внутри кавычек (").
Можно указать несколько альтернатив, например: 'h2="example.org:81", h2=":82"'.
Идентификатор протокола ('h2' в примерах) может быть любым допустимым ALPN Protocol ID.
Синтаксис этих значений реализацией Node.js не проверяется: они передаются как есть — от пользователя или от пира.
serverhttp2session.origin(...origins)¶
origins<string>|<URL>|<Object>Одна или несколько строк URL, переданных отдельными аргументами.
Отправляет подключённому клиенту кадр ORIGIN (по RFC 8336), чтобы объявить набор origin, для которых сервер может выдавать авторитетные ответы.
1 2 3 4 5 6 7 8 9 10 | |
1 2 3 4 5 6 7 8 9 10 | |
Если в качестве origin передана строка, она разбирается как URL и из неё извлекается значение origin. Например, для URL HTTP 'https://example.org/foo/bar' значение origin — ASCII-строка 'https://example.org'. Будет выброшена ошибка, если строку нельзя разобрать как URL или из неё нельзя получить корректный origin.
В качестве origin можно передать объект URL или любой объект со свойством origin; тогда используется значение свойства origin. Значение свойства origin должно быть корректно сериализованным ASCII origin.
Также можно использовать опцию origins при создании нового HTTP/2-сервера через http2.createSecureServer():
1 2 3 4 5 6 7 8 | |
1 2 3 4 5 6 7 8 | |
Класс: ClientHttp2Session¶
- Наследует:
<Http2Session>
Событие: 'altsvc'¶
Событие 'altsvc' генерируется при каждом получении клиентом кадра ALTSVC. В обработчик передаются значение из ALTSVC, origin и идентификатор потока. Если в кадре ALTSVC нет origin, в аргументе будет пустая строка.
1 2 3 4 5 6 7 8 | |
1 2 3 4 5 6 7 8 | |
Событие: 'origin'¶
origins<string[]>
Событие 'origin' генерируется при каждом получении клиентом кадра ORIGIN. В обработчик передаётся массив строк origin. Свойство http2session.originSet обновляется так, чтобы включить полученные origin.
1 2 3 4 5 6 7 | |
1 2 3 4 5 6 7 | |
Событие 'origin' генерируется только при использовании защищённого TLS-соединения.
clienthttp2session.request(headers[, options])¶
Добавлено в: v8.4.0
-
headers<HTTP/2 Headers Object>|<HTTP/2 Raw Headers> -
options<Object> endStream<boolean>true, если сторонуHttp2Streamдля записи нужно сразу закрыть, например при отправке запросаGETбез тела.exclusive<boolean>Еслиtrueиparentуказывает на родительский поток, создаваемый поток становится единственной прямой зависимостью родителя, а все остальные существующие зависимые потоки становятся зависимыми от нового потока. По умолчанию:false.parent<number>Числовой идентификатор потока, от которого зависит новый поток.waitForTrailers<boolean>Еслиtrue, после отправки последнего кадраDATAHttp2Streamсгенерирует событие'wantTrailers'.-
signal<AbortSignal>AbortSignalдля прерывания текущего запроса. -
Возвращает:
<ClientHttp2Stream>
Только для клиентских экземпляров Http2Session: http2session.request() создаёт и возвращает экземпляр Http2Stream для отправки HTTP/2-запроса на подключённый сервер.
При первом создании ClientHttp2Session сокет может быть ещё не подключён. Если в этот момент вызвать clienthttp2session.request(), фактический запрос откладывается до готовности сокета. Если session закроется до выполнения запроса, будет выброшено ERR_HTTP2_GOAWAY_SESSION.
Метод доступен только при http2session.type равном http2.constants.NGHTTP2_SESSION_CLIENT.
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
Если задана опция options.waitForTrailers, событие 'wantTrailers' генерируется сразу после постановки в очередь последнего фрагмента полезной нагрузки. Тогда можно вызвать http2stream.sendTrailers(), чтобы отправить завершающие заголовки пиру.
При установленном options.waitForTrailers Http2Stream не закроется автоматически после отправки последнего кадра DATA. Прикладной код должен вызвать либо http2stream.sendTrailers(), либо http2stream.close(), чтобы закрыть Http2Stream.
Если задан options.signal с AbortSignal и вызывается abort у соответствующего AbortController, у запроса будет событие 'error' с ошибкой AbortError.
Псевдозаголовки :method и :path в headers не задаются — по умолчанию используются:
:method='GET':path=/
Класс: Http2Stream¶
- Наследует:
<stream.Duplex>
Каждый экземпляр класса Http2Stream — это двунаправленный поток обмена HTTP/2 поверх Http2Session. За время жизни одной Http2Session может существовать до 231−1 экземпляров Http2Stream.
Прикладной код не создаёт Http2Stream напрямую: они создаются и передаются через Http2Session. На сервере Http2Stream появляется при входящем HTTP-запросе (и передаётся в обработчик события 'stream') или при вызове http2stream.pushStream(). На клиенте экземпляры создаются и возвращаются при вызове http2session.request() или при входящем событии 'push'.
Класс Http2Stream — основа для ServerHttp2Stream и ClientHttp2Stream, которые используются соответственно на сервере и на клиенте.
Все экземпляры Http2Stream — потоки Duplex: сторона Writable отправляет данные пиру, сторона Readable принимает данные от пира.
Кодировка текста по умолчанию для Http2Stream — UTF-8. При отправке текста задайте кодировку заголовком 'content-type'.
1 2 3 4 | |
Жизненный цикл Http2Stream¶
Создание¶
На сервере экземпляры ServerHttp2Stream создаются, когда:
- получен новый кадр HTTP/2
HEADERSс ранее неиспользованным идентификатором потока; - вызван метод
http2stream.pushStream().
На клиенте экземпляры ClientHttp2Stream создаются при вызове http2session.request().
На клиенте экземпляр Http2Stream, возвращённый http2session.request(), может быть ещё не готов к использованию, если родительская Http2Session ещё не установлена полностью. Тогда операции над Http2Stream буферизуются до события 'ready'. Прикладному коду редко нужно обрабатывать 'ready' напрямую. Готовность Http2Stream можно проверить по http2stream.id: если значение undefined, поток ещё не готов.
Уничтожение¶
Все экземпляры Http2Stream уничтожаются, когда:
- от подключённого пира получен кадр
RST_STREAMдля потока и (только для клиентских потоков) прочитаны отложенные данные; - вызван
http2stream.close()и (только для клиентских потоков) прочитаны отложенные данные; - вызваны
http2stream.destroy()илиhttp2session.destroy().
При уничтожении Http2Stream делается попытка отправить пиру кадр RST_STREAM.
После уничтожения Http2Stream генерируется 'close'. Поскольку Http2Stream — экземпляр stream.Duplex, при текущем потоке данных также будет 'end'. Событие 'error' возможно, если http2stream.destroy() вызван с Error первым аргументом.
После уничтожения http2stream.destroyed будет true, а http2stream.rstCode задаёт код ошибки RST_STREAM. Уничтоженный Http2Stream использовать нельзя.
Событие: 'aborted'¶
Событие 'aborted' генерируется при аварийном прерывании Http2Stream в процессе обмена. У обработчика нет аргументов.
Событие 'aborted' генерируется только если сторона записи Http2Stream ещё не завершена.
Событие: 'close'¶
Событие 'close' генерируется при уничтожении Http2Stream. После него экземпляр использовать нельзя.
Код ошибки HTTP/2 при закрытии потока можно получить из http2stream.rstCode. Если код не равен NGHTTP2_NO_ERROR (0), также будет событие 'error.
Событие: 'error'¶
error<Error>
Событие 'error' генерируется при ошибке обработки Http2Stream.
Событие: 'frameError'¶
type<integer>Тип кадра.code<integer>Код ошибки.id<integer>Идентификатор потока (или0, если кадр не связан с потоком).
Событие 'frameError' генерируется при ошибке отправки кадра. Обработчик получает целое число — тип кадра, и целое число — код ошибки. Экземпляр Http2Stream уничтожается сразу после 'frameError'.
Событие: 'ready'¶
Событие 'ready' генерируется, когда Http2Stream открыт, ему назначен id, и им можно пользоваться. У обработчика нет аргументов.
Событие: 'timeout'¶
Событие 'timeout' генерируется при отсутствии активности на Http2Stream в течение числа миллисекунд, заданного http2stream.setTimeout(). У обработчика нет аргументов.
Событие: 'trailers'¶
headers<HTTP/2 Headers Object>Объект с заголовкамиflags<number>Связанные числовые флаги
Событие 'trailers' генерируется при получении блока заголовков завершающих полей. В колбэк передаются объект заголовков HTTP/2 и флаги.
Событие может не произойти, если http2stream.end() вызван до получения трейлеров и входящие данные не читаются и на них не подписываются.
1 2 3 | |
Событие: 'wantTrailers'¶
Событие 'wantTrailers' генерируется, когда в очередь поставлен последний кадр DATA для отправки и Http2Stream готов отправить завершающие заголовки. Чтобы оно возникло, при инициации запроса или ответа нужно задать опцию waitForTrailers.
http2stream.aborted¶
- Тип:
<boolean>
true, если экземпляр Http2Stream был аварийно прерван. В этом случае уже было событие 'aborted'.
http2stream.bufferSize¶
- Тип:
<number>
Число символов, буферизованных для записи. Подробнее см. net.Socket.bufferSize.
http2stream.close(code[, callback])¶
Добавлено в: v8.4.0
code<number>Беззнаковое 32-битное целое — код ошибки. По умолчанию:http2.constants.NGHTTP2_NO_ERROR(0x00).callback<Function>Необязательная функция — слушатель события'close'.
Закрывает экземпляр Http2Stream, отправляя пиру HTTP/2 кадр RST_STREAM.
http2stream.closed¶
- Тип:
<boolean>
true, если экземпляр Http2Stream закрыт.
http2stream.destroyed¶
- Тип:
<boolean>
true, если экземпляр Http2Stream уничтожен и больше не может использоваться.
http2stream.endAfterHeaders¶
- Тип:
<boolean>
true, если во входящем кадре HEADERS запроса или ответа установлен флаг END_STREAM, то есть дополнительных данных ждать не следует и читаемая сторона Http2Stream будет закрыта.
http2stream.id¶
- Тип:
<number>| undefined
Числовой идентификатор потока для этого Http2Stream. undefined, если идентификатор ещё не назначен.
http2stream.pending¶
- Тип:
<boolean>
true, если экземпляру Http2Stream ещё не назначен числовой идентификатор потока.
http2stream.priority(options)¶
Добавлено в: v8.4.0
Стабильность: 0 - Устарело
Поддержка сигнализации приоритета объявлена устаревшей в RFC 9113 и больше не поддерживается в Node.js.
Пустой метод, оставлен для обратной совместимости.
http2stream.rstCode¶
- Тип:
<number>
Содержит код ошибки RST_STREAM, сообщённый при уничтожении Http2Stream после получения кадра RST_STREAM от пира, вызова http2stream.close() или http2stream.destroy(). Будет undefined, если Http2Stream ещё не закрыт.
http2stream.sentHeaders¶
Объект с исходящими заголовками, отправленными для этого Http2Stream.
http2stream.sentInfoHeaders¶
Массив объектов с исходящими информационными (дополнительными) заголовками для этого Http2Stream.
http2stream.sentTrailers¶
Объект с исходящими трейлерами, отправленными для этого Http2Stream.
http2stream.session¶
- Тип:
<Http2Session>
Ссылка на Http2Session, которой принадлежит этот Http2Stream. После уничтожения Http2Stream значение будет undefined.
http2stream.setTimeout(msecs, callback)¶
Добавлено в: v8.4.0
msecs<number>callback<Function>
1 2 3 4 5 6 7 | |
1 2 3 4 5 6 7 | |
http2stream.state¶
Добавлено в: v8.4.0
Разная информация о текущем состоянии Http2Stream.
- Тип:
<Object> localWindowSize<number>Сколько байт подключённый пир может отправить по этомуHttp2StreamбезWINDOW_UPDATE.state<number>Флаг низкоуровневого состоянияHttp2Streamпо даннымnghttp2.localClose<number>1, если этотHttp2Streamзакрыт локально.remoteClose<number>1, если этотHttp2Streamзакрыт удалённо.sumDependencyWeight<number>Устаревшее свойство, всегда0.weight<number>Устаревшее свойство, всегда16.
Текущее состояние этого Http2Stream.
http2stream.sendTrailers(headers)¶
headers<HTTP/2 Headers Object>
Отправляет завершающий кадр HEADERS пиру HTTP/2. Метод сразу закрывает Http2Stream и должен вызываться только после события 'wantTrailers'. При отправке запроса или ответа нужно задать options.waitForTrailers, чтобы Http2Stream оставался открытым после последнего кадра DATA и можно было отправить трейлеры.
1 2 3 4 5 6 7 8 9 | |
1 2 3 4 5 6 7 8 9 | |
По спецификации HTTP/1 в трейлерах не допускаются псевдозаголовки HTTP/2 (например ':method', ':path' и т.д.).
Класс: ClientHttp2Stream¶
- Наследует
<Http2Stream>
Класс ClientHttp2Stream расширяет Http2Stream и используется только на HTTP/2-клиенте. На клиенте экземпляры Http2Stream дают события вроде 'response' и 'push', актуальные только для клиента.
Событие: 'continue'¶
Генерируется, когда сервер отправляет статус 100 Continue, обычно из-за заголовка Expect: 100-continue в запросе — сигнал клиенту отправить тело запроса.
Событие: 'headers'¶
headers<HTTP/2 Headers Object>flags<number>rawHeaders<HTTP/2 Raw Headers>
Событие 'headers' генерируется при получении дополнительного блока заголовков для потока, например информационных 1xx. В колбэк передаются объект заголовков HTTP/2, флаги и сырые заголовки (см. сырые заголовки HTTP/2).
1 2 3 | |
Событие: 'push'¶
headers<HTTP/2 Headers Object>flags<number>
Событие 'push' генерируется при получении заголовков ответа для потока Server Push. В колбэк передаются объект заголовков HTTP/2 и связанные флаги.
1 2 3 | |
Событие: 'response'¶
headers<HTTP/2 Headers Object>flags<number>rawHeaders<HTTP/2 Raw Headers>
Событие 'response' генерируется при получении от подключённого HTTP/2-сервера кадра ответа HEADERS для этого потока. Обработчик вызывается с тремя аргументами: объект с объект заголовков HTTP/2, флаги и сырые заголовки (см. сырые заголовки HTTP/2).
1 2 3 4 5 6 | |
1 2 3 4 5 6 | |
Класс: ServerHttp2Stream¶
- Наследует:
<Http2Stream>
Класс ServerHttp2Stream расширяет Http2Stream и используется только на HTTP/2-сервере. На сервере у экземпляров есть дополнительные методы вроде http2stream.pushStream() и http2stream.respond().
http2stream.additionalHeaders(headers)¶
headers<HTTP/2 Headers Object>
Отправляет дополнительный информационный кадр HEADERS пиру HTTP/2.
http2stream.headersSent¶
- Тип:
<boolean>
true, если заголовки уже отправлены, иначе false (только для чтения).
http2stream.pushAllowed¶
- Тип:
<boolean>
Свойство только для чтения, связанное с флагом SETTINGS_ENABLE_PUSH в последнем кадре SETTINGS, полученном от удалённого клиента. Будет true, если удалённая сторона принимает push-потоки, и false в противном случае. Настройки одинаковы для каждого Http2Stream в одной и той же Http2Session.
http2stream.pushStream(headers[, options], callback)¶
Добавлено в: v8.4.0
headers<HTTP/2 Headers Object>options<Object>exclusive<boolean>Еслиtrueиparentуказывает на родительский поток, создаваемый поток становится единственной прямой зависимостью родителя, а все остальные существующие зависимые потоки становятся зависимыми от нового потока. По умолчанию:false.parent<number>Числовой идентификатор потока, от которого зависит новый поток.callback<Function>Вызывается после инициации push-потока.err<Error>pushStream<ServerHttp2Stream>Возвращённый объектpushStream.headers<HTTP/2 Headers Object>Объект заголовков, с которым был инициированpushStream.
Инициирует push-поток. Колбэк получает новый экземпляр Http2Stream для push вторым аргументом или Error первым аргументом.
1 2 3 4 5 6 7 8 9 10 11 | |
1 2 3 4 5 6 7 8 9 10 11 | |
Задать вес push-потока в кадре HEADERS нельзя. Передайте значение weight в http2stream.priority с опцией silent: true, чтобы на сервере балансировать полосу между параллельными потоками.
Вызов http2stream.pushStream() изнутри уже push-потока запрещён и приведёт к ошибке.
http2stream.respond([headers[, options]])¶
Добавлено в: v8.4.0
headers<HTTP/2 Headers Object>|<HTTP/2 Raw Headers>options<Object>endStream<boolean>true, если ответ не будет содержать тело.waitForTrailers<boolean>Еслиtrue, после отправки последнего кадраDATAHttp2Streamсгенерирует событие'wantTrailers'.
1 2 3 4 5 6 | |
1 2 3 4 5 6 | |
Инициирует ответ. Если задана options.waitForTrailers, событие 'wantTrailers' генерируется сразу после постановки в очередь последнего фрагмента полезной нагрузки. Тогда можно вызвать http2stream.sendTrailers(), чтобы отправить завершающие заголовки пиру.
При установленном options.waitForTrailers Http2Stream не закроется автоматически после последнего кадра DATA. Прикладной код должен вызвать http2stream.sendTrailers() или http2stream.close(), чтобы закрыть Http2Stream.
1 2 3 4 5 6 7 8 9 | |
1 2 3 4 5 6 7 8 9 | |
http2stream.respondWithFD(fd[, headers[, options]])¶
Добавлено в: v8.4.0
fd<number>|<FileHandle>Дескриптор файла для чтения.headers<HTTP/2 Headers Object>options<Object>statCheck<Function>waitForTrailers<boolean>Еслиtrue, после отправки последнего кадраDATAHttp2Streamсгенерирует событие'wantTrailers'.offset<number>Смещение начала чтения.length<number>Сколько байт из fd отправить.
Инициирует ответ, читая данные из указанного дескриптора файла. Сам дескриптор не проверяется. При ошибке чтения Http2Stream закрывается кадром RST_STREAM с кодом INTERNAL_ERROR.
При использовании интерфейс Duplex у Http2Stream закрывается автоматически.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |
Необязательная функция options.statCheck позволяет прикладному коду добавить заголовки содержимого по данным fs.Stat для fd. Если statCheck задан, http2stream.respondWithFD() вызовет fs.fstat() для этого дескриптора.
Опции offset и length ограничивают ответ диапазоном байт, например для HTTP Range.
Дескриптор файла или FileHandle при закрытии потока не закрывается — его нужно закрыть вручную, когда он больше не нужен. Один и тот же дескриптор одновременно для нескольких потоков использовать нельзя — возможна потеря данных. Повторное использование дескриптора после завершения потока допускается.
Если задана options.waitForTrailers, событие 'wantTrailers' генерируется сразу после постановки в очередь последнего фрагмента полезной нагрузки. Затем можно вызвать http2stream.sendTrailers() для завершающих заголовков.
При установленном options.waitForTrailers Http2Stream не закроется автоматически после последнего кадра DATA. Прикладной код обязан вызвать http2stream.sendTrailers() или http2stream.close(), чтобы закрыть Http2Stream.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | |
http2stream.respondWithFile(path[, headers[, options]])¶
Добавлено в: v8.4.0
path<string>|<Buffer>|<URL>headers<HTTP/2 Headers Object>options<Object>statCheck<Function>onError<Function>Колбэк при ошибке до начала отправки.waitForTrailers<boolean>Еслиtrue, после последнего кадраDATAHttp2Streamсгенерирует'wantTrailers'.offset<number>Смещение начала чтения.length<number>Сколько байт отправить.
Отправляет обычный файл как ответ. В path должен быть обычный файл, иначе на объекте Http2Stream будет событие 'error'.
При использовании интерфейс Duplex у Http2Stream закрывается автоматически.
Необязательная options.statCheck позволяет добавить заголовки содержимого по fs.Stat файла:
При ошибке чтения файла Http2Stream закрывается кадром RST_STREAM с INTERNAL_ERROR. Если задан onError, он будет вызван; иначе поток уничтожается.
Пример с путём к файлу:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | |
Функция options.statCheck может отменить отправку, вернув false. Например, при условном запросе по результатам stat можно вернуть ответ 304:
1 2 3 4 5 6 7 8 9 10 11 12 | |
1 2 3 4 5 6 7 8 9 10 11 12 | |
Заголовок content-length задаётся автоматически.
Опции offset и length ограничивают ответ диапазоном, например для HTTP Range.
options.onError обрабатывает ошибки до начала передачи файла. По умолчанию поток уничтожается.
Если задана options.waitForTrailers, событие 'wantTrailers' генерируется сразу после постановки в очередь последнего фрагмента полезной нагрузки; затем можно вызвать http2stream.sendTrailers() для завершающих заголовков.
При установленном options.waitForTrailers Http2Stream не закроется автоматически после последнего кадра DATA. Нужно вызвать http2stream.sendTrailers() или http2stream.close().
1 2 3 4 5 6 7 8 9 10 | |
1 2 3 4 5 6 7 8 9 10 | |
Класс: Http2Server¶
- Наследует:
<net.Server>
Экземпляры Http2Server создаются функцией http2.createServer(). Класс Http2Server не экспортируется модулем node:http2 напрямую.
Событие: 'checkContinue'¶
request<http2.Http2ServerRequest>response<http2.Http2ServerResponse>
Если зарегистрирован обработчик 'request' или в http2.createServer() передан колбэк, событие 'checkContinue' генерируется при каждом запросе с HTTP-заголовком Expect: 100-continue. Если на событие не подписываются, сервер сам отвечает статусом 100 Continue, когда нужно.
Обработка: вызов response.writeContinue(), если клиенту нужно продолжить тело, или подходящий HTTP-ответ (например 400), если тело отправлять не следует.
Если событие обработано, 'request' для этого запроса не генерируется.
Событие: 'connection'¶
socket<stream.Duplex>
Генерируется при установке нового TCP-потока. socket обычно имеет тип net.Socket. Обычно это событие не используют.
Его также можно явно сгенерировать, чтобы подставить соединение в HTTP-сервер; тогда можно передать любой поток Duplex.
Событие: 'request'¶
request<http2.Http2ServerRequest>response<http2.Http2ServerResponse>
Генерируется при каждом запросе. В одной сессии может быть несколько запросов. См. API совместимости.
Событие: 'session'¶
session<ServerHttp2Session>
Событие 'session' генерируется при создании новой Http2Session объектом Http2Server.
Событие: 'sessionError'¶
error<Error>session<ServerHttp2Session>
Событие 'sessionError' генерируется при событии 'error' у Http2Session, связанной с Http2Server.
Событие: 'stream'¶
stream<Http2Stream>Ссылка на потокheaders<HTTP/2 Headers Object>Объект заголовковflags<number>Связанные числовые флагиrawHeaders<HTTP/2 Raw Headers>Массив сырых заголовков
Событие 'stream' генерируется, когда оно же пришло от Http2Session, связанной с сервером.
См. также [событие 'stream' у Http2Session][Http2Session's 'stream' event].
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | |
Событие: 'timeout'¶
Добавлено в: v8.4.0
Событие 'timeout' генерируется при отсутствии активности на сервере в течение числа миллисекунд, заданного http2server.setTimeout(). По умолчанию: 0 (таймаут отключён)
server.close([callback])¶
callback<Function>
Останавливает приём новых сессий. Из-за долгоживущих сессий HTTP/2 это не мешает создавать новые потоки запросов в уже открытых сессиях. Для корректного завершения вызовите http2session.close() у всех активных сессий.
Если передан callback, он вызывается только после закрытия всех активных сессий, хотя новые сессии сервер уже не принимает. Подробнее см. net.Server.close().
server[Symbol.asyncDispose]()¶
Добавлено в: v20.4.0
Вызывает server.close() и возвращает промис, который выполняется после закрытия сервера.
server.setTimeout([msecs][, callback])¶
Добавлено в: v8.4.0
msecs<number>По умолчанию: 0 (без таймаута)callback<Function>- Возвращает:
<Http2Server>
Задаёт таймаут для запросов HTTP/2-сервера и колбэк при отсутствии активности на Http2Server дольше msecs мс.
Колбэк регистрируется как слушатель 'timeout'.
Если callback не функция, выбрасывается ERR_INVALID_ARG_TYPE.
server.timeout¶
Добавлено в: v8.4.0
- Тип:
<number>Таймаут в миллисекундах. По умолчанию: 0 (без таймаута)
Количество миллисекунд бездействия, после которых считается, что у сокета истёк таймаут.
Значение 0 отключает поведение таймаута для входящих соединений.
Логика таймаута сокета настраивается при установке соединения, поэтому изменение значения влияет только на новые подключения, не на уже существующие.
server.updateSettings([settings])¶
settings<HTTP/2 Settings Object>
Обновляет сервер переданными настройками.
Выбрасывает ERR_HTTP2_INVALID_SETTING_VALUE при недопустимых значениях settings.
Выбрасывает ERR_INVALID_ARG_TYPE при недопустимом аргументе settings.
Класс: Http2SecureServer¶
- Наследует:
<tls.Server>
Экземпляры Http2SecureServer создаются функцией http2.createSecureServer(). Класс Http2SecureServer не экспортируется модулем node:http2 напрямую.
Событие: 'checkContinue'¶
request<http2.Http2ServerRequest>response<http2.Http2ServerResponse>
Если зарегистрирован обработчик 'request' или в http2.createSecureServer() передан колбэк, событие 'checkContinue' генерируется при каждом запросе с Expect: 100-continue. Если на событие не подписываются, сервер сам отвечает 100 Continue, когда нужно.
Обработка: response.writeContinue() или подходящий ответ (например 400).
Если событие обработано, 'request' для этого запроса не генерируется.
Событие: 'connection'¶
socket<stream.Duplex>
Генерируется при установке нового TCP-потока до начала TLS handshake. socket обычно net.Socket. Обычно обращаются к событию редко.
Его можно явно сгенерировать для подстановки соединения; допускается любой Duplex.
Событие: 'request'¶
request<http2.Http2ServerRequest>response<http2.Http2ServerResponse>
Генерируется при каждом запросе. В сессии может быть несколько запросов. См. API совместимости.
Событие: 'session'¶
session<ServerHttp2Session>
Событие 'session' при создании новой Http2Session объектом Http2SecureServer.
Событие: 'sessionError'¶
error<Error>session<ServerHttp2Session>
Событие 'sessionError' при 'error' у Http2Session, связанной с Http2SecureServer.
Событие: 'stream'¶
stream<Http2Stream>Ссылка на потокheaders<HTTP/2 Headers Object>Объект заголовковflags<number>Связанные числовые флагиrawHeaders<HTTP/2 Raw Headers>Массив сырых заголовков
Событие 'stream' при 'stream' от Http2Session, связанной с сервером.
См. также [событие 'stream' у Http2Session][Http2Session's 'stream' event].
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | |
Событие: 'timeout'¶
Событие 'timeout' генерируется при отсутствии активности на сервере в течение числа миллисекунд, заданного http2secureServer.setTimeout(). По умолчанию: 2 минуты.
Событие: 'unknownProtocol'¶
Добавлено в: v8.4.0
socket<stream.Duplex>
Событие 'unknownProtocol' генерируется, если подключающийся клиент не согласовал допустимый протокол (HTTP/2 или HTTP/1.1). Обработчик получает сокет. Если слушателя нет, соединение разрывается. Таймаут задаётся опцией 'unknownProtocolTimeout' в http2.createSecureServer().
В старых версиях Node.js событие возникало при allowHTTP1 равном false, если при TLS клиент не отправлял расширение ALPN или отправлял ALPN без HTTP/2 (h2). В новых версиях оно генерируется только при allowHTTP1 равном false и отсутствии расширения ALPN. Если клиент отправляет ALPN без HTTP/2 (или без HTTP/1.1 при allowHTTP1 равном true), TLS handshake завершается ошибкой, защищённое соединение не устанавливается.
См. API совместимости.
server.close([callback])¶
callback<Function>
Останавливает приём новых сессий; см. описание для Http2Server. Для корректного завершения закройте активные сессии через http2session.close().
Если передан callback, он вызывается после закрытия всех активных сессий. Подробнее tls.Server.close().
server.setTimeout([msecs][, callback])¶
Добавлено в: v8.4.0
msecs<number>По умолчанию:120000(2 minutes)callback<Function>- Возвращает:
<Http2SecureServer>
Задаёт таймаут для запросов защищённого HTTP/2-сервера и колбэк при отсутствии активности на Http2SecureServer дольше msecs мс.
Колбэк регистрируется как слушатель 'timeout'.
Если callback не функция, выбрасывается ERR_INVALID_ARG_TYPE.
server.timeout¶
Добавлено в: v8.4.0
- Тип:
<number>Таймаут в миллисекундах. По умолчанию: 0 (без таймаута)
Количество миллисекунд бездействия, после которых считается, что у сокета истёк таймаут.
Значение 0 отключает поведение таймаута для входящих соединений.
Логика таймаута сокета настраивается при подключении, изменение влияет только на новые соединения.
server.updateSettings([settings])¶
settings<HTTP/2 Settings Object>
Обновляет сервер переданными настройками.
Выбрасывает ERR_HTTP2_INVALID_SETTING_VALUE при недопустимых значениях settings.
Выбрасывает ERR_INVALID_ARG_TYPE при недопустимом аргументе settings.
http2.createServer([options][, onRequestHandler])¶
Добавлено в: v8.4.0
options<Object>maxDeflateDynamicTableSize<number>Максимальный размер динамической таблицы для сжатия заголовков. По умолчанию:4Kib.maxSettings<number>Максимум записей настроек в одном кадреSETTINGS. Минимум1. По умолчанию:32.maxSessionMemory<number>Максимум памяти дляHttp2Sessionв мегабайтах (1— 1 МБ). Минимум1. Лимит кредитный: существующиеHttp2Streamмогут его превысить, новые при превышении отклоняются. Учитываются число потоков, память таблиц сжатия заголовков, данные в очереди на отправку и неподтверждённыеPINGиSETTINGS. По умолчанию:10.maxHeaderListPairs<number>Максимум пар заголовков. Аналогичноserver.maxHeadersCountилиrequest.maxHeadersCountвnode:http. Минимум4. По умолчанию:128.maxOutstandingPings<number>Максимум неподтверждённых пингов. По умолчанию:10.maxSendHeaderBlockLength<number>Максимальный размер сериализованного сжатого блока заголовков. Превышение — событие'frameError'и закрытие потока. На весь блок действует этот лимит; уnghttp2на каждую распакованную пару ключ/значение — не более65536.paddingStrategy<number>Стратегия дополнения для кадровHEADERSиDATA. По умолчанию:http2.constants.PADDING_STRATEGY_NONE. Возможные значения:http2.constants.PADDING_STRATEGY_NONE: без дополнения.http2.constants.PADDING_STRATEGY_MAX: максимально допустимое дополнение по реализации.http2.constants.PADDING_STRATEGY_ALIGNED: подобрать дополнение так, чтобы длина кадра с 9-байтовым заголовком была кратна 8. Для каждого кадра есть максимум байт дополнения по состоянию flow control и настройкам; если он меньше расчётного для выравнивания, используется максимум, итоговая длина может быть не кратна 8.
peerMaxConcurrentStreams<number>Максимум одновременных потоков удалённого пира, как после кадраSETTINGS. Переопределяется, если пир задаёт свойmaxConcurrentStreams. По умолчанию:100.maxSessionInvalidFrames<integer>Сколько неверных кадров терпеть до закрытия сессии. По умолчанию:1000.maxSessionRejectedStreams<integer>Сколько отклонённых при создании потоков терпеть до закрытия сессии. Каждое отклонение сNGHTTP2_ENHANCE_YOUR_CALM— сигнал пиру не открывать новые потоки; продолжение считается некорректным поведением. По умолчанию:100.settings<HTTP/2 Settings Object>Начальные настройки для отправки пиру при соединении.streamResetBurst<number>иstreamResetRatenumber Ограничение частоты сбросов входящих потоков (кадр RST_STREAM). Оба параметра нужны; по умолчанию 1000 и 33.remoteCustomSettings<Array>Массив целых — типы настроек в свойствеCustomSettingsу принимаемыхremoteSettings. Подробнее см.CustomSettingsу объектаHttp2Settings.Http1IncomingMessage<http.IncomingMessage>КлассIncomingMessageдля отката на HTTP/1. Для расширения базовогоhttp.IncomingMessage. По умолчанию:http.IncomingMessage. Устарело. Используйтеhttp1Options.IncomingMessage. См. DEP0202.Http1ServerResponse<http.ServerResponse>КлассServerResponseдля отката на HTTP/1. По умолчанию:http.ServerResponse. Устарело. Используйтеhttp1Options.ServerResponse. См. DEP0202.http1Options<Object>Опции отката на HTTP/1 приallowHTTP1равномtrue; передаются нижележащему HTTP/1-серверу. См.http.createServer(). В том числе:IncomingMessage<http.IncomingMessage>КлассIncomingMessageдля отката. По умолчанию:http.IncomingMessage.ServerResponse<http.ServerResponse>КлассServerResponseдля отката. По умолчанию:http.ServerResponse.keepAliveTimeout<number>Миллисекунды простоя без входящих данных после отправки последнего ответа до уничтожения сокета. По умолчанию:5000.
Http2ServerRequest<http2.Http2ServerRequest>КлассHttp2ServerRequestдля использования. Для расширения базовогоHttp2ServerRequest. По умолчанию:Http2ServerRequest.Http2ServerResponse<http2.Http2ServerResponse>КлассHttp2ServerResponseдля использования. По умолчанию:Http2ServerResponse.unknownProtocolTimeout<number>Таймаут в мс ожидания после события'unknownProtocol'; если сокет к этому моменту не уничтожен, сервер уничтожит его. По умолчанию:10000.strictFieldWhitespaceValidation<boolean>Приtrue— строгая проверка пробелов в начале и конце имён и значений полей заголовков HTTP/2 по RFC-9113. По умолчанию:true.strictSingleValueFields<boolean>Приtrue— строгая проверка заголовков и трейлеров, которые по определению однозначны; при нескольких значениях — ошибка. По умолчанию:true....options<Object>Любые опцииnet.createServer().onRequestHandler<Function>См. API совместимости- Возвращает:
<Http2Server>
Возвращает экземпляр net.Server, который создаёт и управляет Http2Session.
Известных браузеров с поддержкой незашифрованного HTTP/2 нет, поэтому для обмена с браузерами нужен http2.createSecureServer().
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |
http2.createSecureServer(options[, onRequestHandler])¶
Добавлено в: v8.4.0
options<Object>allowHTTP1<boolean>Входящие клиенты без HTTP/2 переводятся на HTTP/1.x приtrue. См.'unknownProtocol'и согласование ALPN. По умолчанию:false.maxDeflateDynamicTableSize<number>См. описание уhttp2.createServer(). По умолчанию:4Kib.maxSettings<number>См.http2.createServer(). По умолчанию:32.maxSessionMemory<number>См.http2.createServer(). По умолчанию:10.maxHeaderListPairs<number>См.http2.createServer(). По умолчанию:128.maxOutstandingPings<number>См.http2.createServer(). По умолчанию:10.maxSendHeaderBlockLength<number>См.http2.createServer().paddingStrategy<number>См.http2.createServer(). По умолчанию:http2.constants.PADDING_STRATEGY_NONE. Варианты:http2.constants.PADDING_STRATEGY_NONE: без дополнения.http2.constants.PADDING_STRATEGY_MAX: максимум дополнения по реализации.http2.constants.PADDING_STRATEGY_ALIGNED: выравнивание длины кадра (см.http2.createServer()).
peerMaxConcurrentStreams<number>См.http2.createServer(). По умолчанию:100.maxSessionInvalidFrames<integer>См.http2.createServer(). По умолчанию:1000.maxSessionRejectedStreams<integer>См.http2.createServer(). По умолчанию:100.settings<HTTP/2 Settings Object>Начальные настройки пиру при соединении.streamResetBurst<number>иstreamResetRatenumber См.http2.createServer().remoteCustomSettings<Array>См.http2.createServer()....options<Object>Любые опцииtls.createServer(); для сервера обычно нужныpfxилиkey/cert.origins<string[]>Массив origin для кадраORIGINсразу после создания сервернойHttp2Session.unknownProtocolTimeout<number>См.http2.createServer(). По умолчанию:10000.strictFieldWhitespaceValidation<boolean>См.http2.createServer(). По умолчанию:true.strictSingleValueFields<boolean>См.http2.createServer(). По умолчанию:true.http1Options<Object>См.http2.createServer().IncomingMessage<http.IncomingMessage>Класс для отката HTTP/1. По умолчанию:http.IncomingMessage.ServerResponse<http.ServerResponse>Класс для отката HTTP/1. По умолчанию:http.ServerResponse.keepAliveTimeout<number>См.http2.createServer(). По умолчанию:5000.
onRequestHandler<Function>См. API совместимости- Возвращает:
<Http2SecureServer>
Возвращает экземпляр tls.Server, который создаёт и управляет Http2Session.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | |
http2.connect(authority[, options][, listener])¶
Добавлено в: v8.4.0
authority<string>|<URL>Удалённый HTTP/2-сервер: минимальный корректный URL с префиксомhttp://илиhttps://, хостом и портом (если не стандартный). Части userinfo, path, query и fragment игнорируются.options<Object>maxDeflateDynamicTableSize<number>См.http2.createServer(). По умолчанию:4Kib.maxSettings<number>См.http2.createServer(). По умолчанию:32.maxSessionMemory<number>См.http2.createServer(). По умолчанию:10.maxHeaderListPairs<number>См.http2.createServer(); минимум1. По умолчанию:128.maxOutstandingPings<number>См.http2.createServer(). По умолчанию:10.maxReservedRemoteStreams<number>Максимум зарезервированных push-потоков, которые клиент примет одновременно. При превышении новые push от сервера отклоняются. Минимум 0, максимум 232−1; отрицательное значение — как максимум. По умолчанию:200.maxSendHeaderBlockLength<number>См.http2.createServer().paddingStrategy<number>См.http2.createServer(). По умолчанию:http2.constants.PADDING_STRATEGY_NONE. Варианты:http2.constants.PADDING_STRATEGY_NONE: без дополнения.http2.constants.PADDING_STRATEGY_MAX: максимум дополнения.http2.constants.PADDING_STRATEGY_ALIGNED: выравнивание длины кадра (см.http2.createServer()).
peerMaxConcurrentStreams<number>См.http2.createServer(). По умолчанию:100.protocol<string>Протокол подключения, если не задан вauthority:'http:'или'https:'. По умолчанию:'https:'settings<HTTP/2 Settings Object>Начальные настройки пиру при соединении.remoteCustomSettings<Array>См.http2.createServer().createConnection<Function>Необязательный колбэк: получаетURLизconnectиoptions, возвращаетDuplexдля соединения этой сессии....options<Object>Любые опцииnet.connect()илиtls.connect().unknownProtocolTimeout<number>См.http2.createServer(). По умолчанию:10000.strictFieldWhitespaceValidation<boolean>См.http2.createServer(). По умолчанию:true.listener<Function>Однократный слушатель события'connect'.- Возвращает:
<ClientHttp2Session>
Возвращает экземпляр ClientHttp2Session.
1 2 3 4 5 6 | |
1 2 3 4 5 6 | |
http2.constants¶
Коды ошибок для RST_STREAM и GOAWAY¶
| Значение | Имя | Константа |
|---|---|---|
0x00 | Нет ошибки | http2.constants.NGHTTP2_NO_ERROR |
0x01 | Ошибка протокола | http2.constants.NGHTTP2_PROTOCOL_ERROR |
0x02 | Внутренняя ошибка | http2.constants.NGHTTP2_INTERNAL_ERROR |
0x03 | Ошибка управления потоком | http2.constants.NGHTTP2_FLOW_CONTROL_ERROR |
0x04 | Тайм-аут настроек | http2.constants.NGHTTP2_SETTINGS_TIMEOUT |
0x05 | Поток закрыт | http2.constants.NGHTTP2_STREAM_CLOSED |
0x06 | Ошибка размера кадра | http2.constants.NGHTTP2_FRAME_SIZE_ERROR |
0x07 | Поток отклонён | http2.constants.NGHTTP2_REFUSED_STREAM |
0x08 | Отмена | http2.constants.NGHTTP2_CANCEL |
0x09 | Ошибка сжатия | http2.constants.NGHTTP2_COMPRESSION_ERROR |
0x0a | Ошибка CONNECT | http2.constants.NGHTTP2_CONNECT_ERROR |
0x0b | Не нагнетайте | http2.constants.NGHTTP2_ENHANCE_YOUR_CALM |
0x0c | Недостаточная безопасность | http2.constants.NGHTTP2_INADEQUATE_SECURITY |
0x0d | Требуется HTTP/1.1 | http2.constants.NGHTTP2_HTTP_1_1_REQUIRED |
http2.getDefaultSettings()¶
- Возвращает:
<HTTP/2 Settings Object>
Возвращает объект с настройками по умолчанию для Http2Session. При каждом вызове создаётся новый объект, его можно безопасно изменять.
http2.getPackedSettings([settings])¶
settings<HTTP/2 Settings Object>- Возвращает:
<Buffer>
Возвращает Buffer с сериализованным представлением переданных настроек HTTP/2 по спецификации HTTP/2. Предназначено для поля заголовка HTTP2-Settings.
1 2 3 4 5 6 | |
1 2 3 4 5 6 | |
http2.getUnpackedSettings(buf)¶
buf<Buffer>|<TypedArray>Упакованные настройки.- Возвращает:
<HTTP/2 Settings Object>
Возвращает объект настроек HTTP/2 с разобранными настройками из Buffer, как у http2.getPackedSettings().
http2.performServerHandshake(socket[, options])¶
socket<stream.Duplex>options<Object>Любые опцииhttp2.createServer().- Возвращает:
<ServerHttp2Session>
Создаёт серверную сессию HTTP/2 из уже имеющегося сокета.
http2.sensitiveHeaders¶
- Тип:
<symbol>
Этот символ можно задать свойством объекта заголовков HTTP/2 со значением-массивом — список имён заголовков, считающихся чувствительными. Подробнее см. чувствительные заголовки.
Объект заголовков¶
Заголовки задаются собственными свойствами объектов JavaScript. Ключи при сериализации приводятся к нижнему регистру. Значения — строки (иначе приводятся к строкам) или массив строк (несколько значений одного поля).
1 2 3 4 5 6 7 | |
Объекты заголовков, передаваемые в колбэки, имеют прототип null, поэтому обычные методы вроде Object.prototype.toString() и Object.prototype.hasOwnProperty() недоступны.
Для входящих заголовков:
:statusприводится к числу (number).- Дубликаты
:status,:method,:authority,:scheme,:path,:protocol,age,authorization,access-control-allow-credentials,access-control-max-age,access-control-request-method,content-encoding,content-language,content-length,content-location,content-md5,content-range,content-type,date,dnt,etag,expires,from,host,if-match,if-modified-since,if-none-match,if-range,if-unmodified-since,last-modified,location,max-forwards,proxy-authorization,range,referer,retry-after,tk,upgrade-insecure-requests,user-agentиx-content-type-optionsотбрасываются. set-cookieвсегда массив; дубликаты добавляются в массив.- При нескольких
cookieзначения объединяются через'; '. - Для остальных заголовков значения объединяются через
', '.
1 2 3 4 5 6 | |
1 2 3 4 5 6 | |
Сырые заголовки¶
В некоторых API заголовки можно передавать или получать плоским массивом, сохраняя порядок и дубликаты ключей, как в сырой передаче.
Ключи и значения идут в одном списке, это не список пар: чётные индексы — ключи, нечётные — значения. Дубликаты не сливаются, каждая пара ключ–значение отдельно.
Удобно для прокси с точной пересылкой заголовков или при оптимизации, если заголовки уже в сыром виде.
1 2 3 4 5 6 7 8 | |
Чувствительные заголовки¶
Заголовки HTTP/2 можно пометить как чувствительные: тогда алгоритм сжатия заголовков никогда не индексирует их. Так поступают для значений с низкой энтропией, которые ценны для атакующего, например Cookie или Authorization. Добавьте имена заголовков в свойство [http2.sensitiveHeaders] как массив:
1 2 3 4 5 6 7 8 9 | |
Для некоторых заголовков, например Authorization и коротких Cookie, флаг выставляется автоматически.
У принимаемых заголовков свойство тоже задаётся: в нём имена всех заголовков, помеченных как чувствительные, в том числе автоматически.
Для сырых заголовков свойство задаётся на массиве, например rawHeadersArray[http2.sensitiveHeaders] = ['cookie'], а не отдельной парой ключ–значение внутри массива.
Объект настроек¶
Добавлено в: v8.4.0
API http2.getDefaultSettings(), http2.getPackedSettings(), http2.createServer(), http2.createSecureServer(), http2session.settings(), http2session.localSettings и http2session.remoteSettings возвращают или принимают объект настроек для Http2Session. Это обычные объекты JavaScript со следующими свойствами.
headerTableSize<number>Максимум байт для сжатия заголовков. Минимум 0, максимум 232−1. По умолчанию:4096.enablePush<boolean>true, если наHttp2Sessionразрешены push-потоки HTTP/2. По умолчанию:true.initialWindowSize<number>Начальный размер окна отправителя в байтах для потокового управления потоком. Минимум 0, максимум 232−1. По умолчанию:65535.maxFrameSize<number>Максимальный размер полезной нагрузки кадра в байтах. Минимум 16384, максимум 224−1. По умолчанию:16384.maxConcurrentStreams<number>Максимум одновременных потоков наHttp2Session. Значения по умолчанию нет в смысле «не задано»; теоретически до 232−1 потоков. Минимум 0, максимум 232−1. По умолчанию:4294967295.maxHeaderListSize<number>Максимальный размер списка заголовков (несжатые октеты). Минимум 0, максимум 232−1. По умолчанию:65535.maxHeaderSize<number>СинонимmaxHeaderListSize.enableConnectProtocol<boolean>true, если включается «Extended Connect Protocol» по RFC 8441. Имеет смысл только от сервера. После включенияenableConnectProtocolдляHttp2Sessionотключить его нельзя. По умолчанию:false.customSettings<Object>Дополнительные типы настроек, пока не реализованные в Node и нижележащих библиотеках. Ключ — числовой тип настройки из реестра «HTTP/2 SETTINGS» ([RFC 7540]), значение — число настройки. Тип должен быть целым от 1 до 2^16−1, лучше больше 6 (уже заняты нативные типы), но ошибкой это не считается. Значения — беззнаковые целые от 0 до 2^32−1. Поддерживается не более 10 пользовательских настроек. Работает при отправкеSETTINGSили при приёме типов изremoteCustomSettingsу сервера или клиента. Не смешивайтеcustomSettingsдля id с нативными настройками, если в будущей версии Node этот тип начнёт обрабатываться нативно.
Любые прочие свойства объекта настроек игнорируются.
Обработка ошибок¶
При использовании node:http2 возможны разные ошибки:
Ошибки проверки — при неверном аргументе, опции или значении настройки. Всегда синхронный throw.
Ошибки состояния — действие в неподходящий момент (например отправка данных после закрытия потока). Сообщаются синхронным throw или событием 'error' на Http2Stream, Http2Session или HTTP/2-сервере в зависимости от места и момента.
Внутренние ошибки — неожиданный сбой сессии HTTP/2. Сообщаются событием 'error' на Http2Session или HTTP/2-сервере.
Ошибки протокола — нарушение ограничений HTTP/2. Сообщаются throw или 'error' на Http2Stream, Http2Session или HTTP/2-сервере.
Обработка недопустимых символов в именах и значениях заголовков¶
Реализация HTTP/2 строже относится к недопустимым символам в именах и значениях заголовков, чем HTTP/1.
Имена полей без учёта регистра; по сети передаются в нижнем регистре. В API Node.js можно задать смешанный регистр (Content-Type), при передаче будет content-type.
В имени поля допускаются только символы ASCII: a–z, A–Z, 0–9, !, #, $, %, &, ', *, +, -, ., ^, _, `, |, ~.
Недопустимые символы в имени приводят к закрытию потока с ошибкой протокола.
Значения допускают больше свободы, но не должны содержать перевод строки или возврат каретки и должны укладываться в US-ASCII по требованиям HTTP.
Push-потоки на клиенте¶
Чтобы принимать push-потоки на клиенте, подпишитесь на событие 'stream' у ClientHttp2Session:
1 2 3 4 5 6 7 8 9 10 11 12 | |
1 2 3 4 5 6 7 8 9 10 11 12 | |
Поддержка метода CONNECT¶
Метод CONNECT позволяет использовать HTTP/2-сервер как прокси для TCP/IP-соединений.
Простой TCP-сервер:
1 2 3 4 5 6 7 8 9 10 | |
1 2 3 4 5 6 7 8 9 10 | |
HTTP/2 CONNECT-прокси:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | |
HTTP/2 CONNECT-клиент:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | |
Расширенный протокол CONNECT¶
RFC 8441 описывает расширение «Extended CONNECT Protocol» для HTTP/2: туннель через Http2Stream с методом CONNECT для других протоколов (например WebSocket).
HTTP/2-серверы включают Extended CONNECT настройкой enableConnectProtocol:
1 2 3 | |
1 2 3 | |
Когда клиент получает от сервера кадр SETTINGS с разрешением extended CONNECT, можно отправлять запросы CONNECT с псевдозаголовком ':protocol':
1 2 3 4 5 6 7 8 | |
1 2 3 4 5 6 7 8 | |
API совместимости¶
API совместимости даёт опыт, близкий к HTTP/1, при работе с HTTP/2, чтобы писать приложения и для HTTP/1, и для HTTP/2. Охватывается только публичный API HTTP/1. Внутренние методы и состояние многих модулей не поддерживаются — реализация другая.
Пример HTTP/2-сервера через API совместимости:
1 2 3 4 5 6 7 | |
1 2 3 4 5 6 7 | |
О смешанном сервере HTTPS и HTTP/2 см. в разделе согласование ALPN. Обновление с не-TLS HTTP/1 не поддерживается.
API совместимости состоит из Http2ServerRequest и Http2ServerResponse. Совместимость с HTTP/1 не скрывает различий протоколов; например текстовое пояснение к коду статуса игнорируется.
Согласование ALPN¶
ALPN позволяет обслуживать и HTTPS, и HTTP/2 на одном сокете. Объекты req и res могут быть HTTP/1 или HTTP/2; приложение должно опираться только на публичный API HTTP/1 и само определять, когда доступны возможности HTTP/2.
Пример сервера с обоими протоколами:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | |
Событие 'request' ведёт себя одинаково и для HTTPS, и для HTTP/2.
Класс: http2.Http2ServerRequest¶
- Наследует:
<stream.Readable>
Объект Http2ServerRequest создаётся http2.Server или http2.SecureServer и передаётся первым аргументом в 'request'. Даёт доступ к состоянию запроса, заголовкам и данным.
Событие: 'aborted'¶
Событие 'aborted' при аварийном прерывании Http2ServerRequest в процессе обмена.
Генерируется только если сторона записи Http2ServerRequest ещё не завершена.
Событие: 'close'¶
Указывает, что базовый Http2Stream закрыт. Как и 'end', не более одного раза на ответ.
request.aborted¶
- Тип:
<boolean>
request.aborted равен true, если запрос прерван.
request.authority¶
- Тип:
<string>
Псевдозаголовок authority. В HTTP/2 можно задать :authority или host; значение берётся из req.headers[':authority'], иначе из req.headers['host'].
request.complete¶
- Тип:
<boolean>
request.complete равен true, если запрос завершён, прерван или уничтожен.
request.connection¶
Стабильность: 0 - Устарело
Используйте request.socket.
- Тип:
<net.Socket>|<tls.TLSSocket>
См. request.socket.
request.destroy([error])¶
error<Error>
Вызывает destroy() у Http2Stream, получившего Http2ServerRequest. Если передан error, генерируется 'error' с этим аргументом у слушателей.
Если поток уже уничтожен, ничего не делает.
request.headers¶
- Тип:
<Object>
Объект заголовков запроса/ответа.
Пары имя–значение; имена заголовков в нижнем регистре.
1 2 3 4 5 6 | |
В HTTP/2 путь, хост, протокол и метод задаются особыми заголовками с префиксом : (например ':path'). Они попадают в request.headers; их нельзя менять бездумно — возможны ошибки. Например, если удалить все заголовки:
1 2 | |
request.httpVersion¶
- Тип:
<string>
Для серверного запроса — версия HTTP, присланная клиентом; для клиентского ответа — версия HTTP сервера. Возвращает '2.0'.
message.httpVersionMajor — первая цифра, message.httpVersionMinor — вторая.
request.method¶
- Тип:
<string>
Метод запроса строкой. Только чтение. Примеры: 'GET', 'DELETE'.
request.rawHeaders¶
- Тип:
<HTTP/2 Raw Headers>
Сырой список заголовков запроса/ответа в том виде, как получен.
1 2 3 4 5 6 7 8 9 10 11 | |
request.rawTrailers¶
- Тип:
<string[]>
Сырые ключи и значения трейлеров запроса/ответа. Заполняется только к событию 'end'.
request.scheme¶
- Тип:
<string>
Псевдозаголовок схемы — часть целевого URL.
request.setTimeout(msecs, callback)¶
msecs<number>callback<Function>- Возвращает:
<http2.Http2ServerRequest>
Задаёт таймаут Http2Stream равным msecs мс. Если передан колбэк, он добавляется как слушатель 'timeout' на объекте ответа.
Если ни на запрос, ни на ответ, ни на сервер не подписаны на 'timeout', по истечении таймаута Http2Stream уничтожаются. Если обработчик есть, таймауты нужно обрабатывать явно.
request.socket¶
- Тип:
<net.Socket>|<tls.TLSSocket>
Возвращает объект Proxy, ведущий себя как net.Socket (или tls.TLSSocket), с логикой HTTP/2.
Свойства destroyed, readable и writable читаются и задаются через request.stream.
Методы destroy, emit, end, on и once вызываются на request.stream.
setTimeout вызывается на request.stream.session.
pause, read, resume и write дают ошибку с кодом ERR_HTTP2_NO_SOCKET_MANIPULATION. См. [Http2Session и сокеты][Http2Session and Sockets].
Остальное идёт на сокет напрямую. При TLS для данных клиентского сертификата используйте request.socket.getPeerCertificate().
request.stream¶
- Тип:
<Http2Stream>
Http2Stream, связанный с запросом.
request.trailers¶
- Тип:
<Object>
Объект трейлеров запроса/ответа. Заполняется к событию 'end'.
request.url¶
- Тип:
<string>
Строка URL запроса — только та часть, что присутствует в HTTP-запросе. Например:
1 2 | |
Тогда request.url будет таким:
1 | |
Разобрать URL на части можно через new URL():
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |
Класс: http2.Http2ServerResponse¶
- Наследует:
<Stream>
Создаётся HTTP-сервером внутри, не пользователем. Передаётся вторым аргументом в 'request'.
Событие: 'close'¶
Базовый Http2Stream завершён до вызова response.end() или до сброса буфера.
Событие: 'finish'¶
Генерируется, когда ответ отправлен: последний фрагмент заголовков и тела передан мультиплексору HTTP/2 для передачи по сети. Не означает, что клиент уже что-то получил.
После этого на объекте ответа больше не будет событий.
response.addTrailers(headers)¶
headers<Object>
Добавляет HTTP-трейлеры (заголовки в конце сообщения) к ответу.
Недопустимые символы в имени или значении заголовка приводят к TypeError.
response.appendHeader(name, value)¶
name<string>value<string>|<string[]>
Добавляет одно значение к заголовку.
Если value — массив, это эквивалентно нескольким вызовам метода.
Если раньше значений не было, эквивалентно response.setHeader().
Недопустимые символы в имени или значении — TypeError.
1 2 3 4 5 6 7 | |
response.connection¶
Стабильность: 0 - Устарело
Используйте response.socket.
- Тип:
<net.Socket>|<tls.TLSSocket>
См. response.socket.
response.createPushResponse(headers, callback)¶
Добавлено в: v8.4.0
headers<HTTP/2 Headers Object>Объект заголовковcallback<Function>Вызывается после завершенияhttp2stream.pushStream(), при ошибке или отклонении создания pushHttp2Stream, либо еслиHttp2ServerRequestзакрыт до вызоваhttp2stream.pushStream()err<Error>res<http2.Http2ServerResponse>Новый объектHttp2ServerResponse
Вызывает http2stream.pushStream() с заданными заголовками и при успехе передаёт в колбэк новый Http2ServerResponse, оборачивающий Http2Stream. Если Http2ServerRequest закрыт, колбэк получает ERR_HTTP2_INVALID_STREAM.
response.end([data[, encoding]][, callback])¶
Добавлено в: v8.4.0
data<string>|<Buffer>|<Uint8Array>encoding<string>callback<Function>- Возвращает:
<this>
Сообщает, что все заголовки и тело ответа отправлены; сообщение считается завершённым. response.end() нужно вызвать для каждого ответа.
Если указан data, это эквивалентно response.write(data, encoding) и затем response.end(callback).
Если указан callback, он вызывается по окончании потока ответа.
response.finished¶
Стабильность: 0 - Устарело
Используйте response.writableEnded.
- Тип:
<boolean>
false, пока ответ не завершён; после response.end() — true.
response.getHeader(name)¶
Читает заголовок из очереди на отправку (ещё не ушёл клиенту). Имя без учёта регистра.
1 | |
response.getHeaderNames()¶
- Возвращает:
<string[]>
Массив уникальных имён исходящих заголовков; все в нижнем регистре.
1 2 3 4 5 | |
response.getHeaders()¶
- Возвращает:
<Object>
Неглубокая копия текущих исходящих заголовков; массивы в значениях можно менять без дополнительных вызовов методов http. Ключи — имена заголовков в нижнем регистре.
Объект из response.getHeaders() не наследует от Object: методы вроде obj.toString(), obj.hasOwnProperty() не работают.
1 2 3 4 5 | |
response.hasHeader(name)¶
true, если заголовок name есть среди исходящих. Сопоставление имени без учёта регистра.
1 | |
response.headersSent¶
- Тип:
<boolean>
true, если заголовки уже отправлены, иначе false (только чтение).
response.removeHeader(name)¶
name<string>
Удаляет заголовок из очереди неявной отправки.
1 | |
response.req¶
Ссылка на исходный объект HTTP2 request.
response.sendDate¶
- Тип:
<boolean>
Если true, заголовок Date генерируется и отправляется автоматически, если его ещё нет. По умолчанию true.
Отключать только для тестов; в ответах HTTP требуется заголовок Date.
response.setHeader(name, value)¶
name<string>value<string>|<string[]>
Задаёт значение неявного заголовка; если заголовок уже есть, значение заменяется. Массив строк — несколько полей с одним именем.
1 | |
or
1 | |
Недопустимые символы — TypeError.
Заголовки из response.setHeader() объединяются с аргументом response.writeHead(); приоритет у response.writeHead().
1 2 3 4 5 6 7 | |
response.setTimeout(msecs[, callback])¶
msecs<number>callback<Function>- Возвращает:
<http2.Http2ServerResponse>
Задаёт таймаут Http2Stream равным msecs мс. Колбэк добавляется как слушатель 'timeout' на объекте ответа.
Логика таймаута такая же, как у request.setTimeout: без слушателей потоки уничтожаются; со слушателями — обрабатывайте явно.
response.socket¶
- Тип:
<net.Socket>|<tls.TLSSocket>
Proxy как net.Socket/tls.TLSSocket с логикой HTTP/2.
destroyed, readable и writable берутся из response.stream.
Методы destroy, emit, end, on и once вызываются на response.stream.
setTimeout вызывается на response.stream.session.
pause, read, resume и write дают ошибку с кодом ERR_HTTP2_NO_SOCKET_MANIPULATION. См. [Http2Session и сокеты][Http2Session and Sockets].
Остальное идёт на сокет напрямую.
1 2 3 4 5 6 | |
1 2 3 4 5 6 | |
response.statusCode¶
- Тип:
<number>
При неявных заголовках (без явного response.writeHead()) свойство задаёт код статуса, который уйдёт клиенту при сбросе заголовков.
1 | |
После отправки заголовков клиенту свойство отражает фактически отправленный код статуса.
response.statusMessage¶
- Тип:
<string>
Текстовое пояснение к статусу в HTTP/2 не поддерживается (RFC 7540 8.1.2.4). Возвращается пустая строка.
response.stream¶
- Тип:
<Http2Stream>
Http2Stream, связанный с ответом.
response.writableEnded¶
- Тип:
<boolean>
true после вызова response.end(). Не показывает сброс данных в ядро; для этого см. writable.writableFinished.
response.write(chunk[, encoding][, callback])¶
chunk<string>|<Buffer>|<Uint8Array>encoding<string>callback<Function>- Возвращает:
<boolean>
Если response.writeHead() ещё не вызывался, включается режим неявных заголовков и они сбрасываются.
Отправляет фрагмент тела ответа; можно вызывать несколько раз.
Как в node:http: для HEAD тело не отправляется; для ответов 204 и 304 тело не должно быть.
chunk — строка или буфер; для строки второй параметр — кодировка в байты (по умолчанию 'utf8'). callback — после сброса этого фрагмента.
Это сырое тело HTTP, не multipart и прочие высокоуровневые кодировки.
Первый вызов response.write() отправляет буферизованные заголовки и первый фрагмент тела; дальше данные стримятся отдельными порциями — буферизация до первого фрагмента тела.
true, если всё сразу ушло в буфер ядра; false, если часть осталась в пользовательской памяти. При освобождении буфера будет 'drain'.
response.writeContinue()¶
Отправляет статус 100 Continue — клиенту можно отправлять тело запроса. См. 'checkContinue' у Http2Server и Http2SecureServer.
response.writeEarlyHints(hints)¶
hints<Object>
Отправляет статус 103 Early Hints с заголовком Link, чтобы агент мог заранее подгрузить или предсоединиться к ресурсам. hints — объект со значениями заголовков для Early Hints.
Пример
1 2 3 4 5 6 7 8 9 10 11 12 | |
response.writeHead(statusCode[, statusMessage][, headers])¶
Добавлено в: v8.4.0
statusCode<number>statusMessage<string>headers<HTTP/2 Headers Object>|<HTTP/2 Raw Headers>- Возвращает:
<http2.Http2ServerResponse>
Отправляет заголовки ответа. statusCode — трёхзначный HTTP-код, например 404. Последний аргумент headers — заголовки ответа.
Возвращает Http2ServerResponse для цепочки вызовов.
Для совместимости с HTTP/1 вторым аргументом можно передать statusMessage, но в HTTP/2 он не используется, эффекта нет, будет предупреждение процесса.
1 2 3 4 5 | |
Content-Length задаётся в байтах, не в символах; для подсчёта — Buffer.byteLength(). Исходящие сообщения Node не сверяет с длиной тела; при приёме отклоняет, если Content-Length не совпадает с фактическим размером.
Не более одного вызова на сообщение до response.end().
Если до этого вызывались response.write() или response.end(), неявные заголовки считаются и этот метод вызывается сам.
Заголовки из response.setHeader() объединяются с response.writeHead(); приоритет у response.writeHead().
1 2 3 4 5 6 7 | |
Недопустимые символы в имени или значении заголовка — TypeError.
Сбор метрик производительности HTTP/2¶
API Performance Observer позволяет собирать базовые метрики для каждой Http2Session и Http2Stream.
1 2 3 4 5 6 7 8 9 10 11 12 | |
1 2 3 4 5 6 7 8 9 10 11 12 | |
У PerformanceEntry свойство entryType равно 'http2'.
name — 'Http2Stream' или 'Http2Session'.
Если name равен Http2Stream, у PerformanceEntry есть дополнительные поля:
bytesRead<number>Байт кадровDATA, полученных для этогоHttp2Stream.bytesWritten<number>Байт кадровDATA, отправленных для этогоHttp2Stream.id<number>Идентификатор связанногоHttp2StreamtimeToFirstByte<number>Миллисекунды междуstartTimeзаписиPerformanceEntryи приёмом первого кадраDATA.timeToFirstByteSent<number>Миллисекунды междуstartTimeи отправкой первого кадраDATA.timeToFirstHeader<number>Миллисекунды междуstartTimeи приёмом первого заголовка.
Если name равен Http2Session, дополнительные поля:
bytesRead<number>Байт получено для этойHttp2Session.bytesWritten<number>Байт отправлено для этойHttp2Session.framesReceived<number>Число принятых кадров HTTP/2 уHttp2Session.framesSent<number>Число отправленных кадров HTTP/2 уHttp2Session.maxConcurrentStreams<number>Максимум одновременно открытых потоков за жизньHttp2Session.pingRTT<number>Миллисекунды от отправки кадраPINGдо подтверждения. Только если наHttp2SessionотправлялиPING.streamAverageDuration<number>Средняя длительность (мс) всехHttp2Stream.streamCount<number>Число обработанныхHttp2StreamуHttp2Session.type<string>'server'или'client'— типHttp2Session.
Примечание о :authority и host¶
В HTTP/2 в запросе должен быть псевдозаголовок :authority или заголовок host. При прямой сборке HTTP/2 предпочтительнее :authority; при переводе с HTTP/1 (например в прокси) — host.
API совместимости подставляет host, если нет :authority. См. request.authority. Без API совместимости (или при прямой работе с req.headers) запасной логикой занимаетесь сами.