Upgrade
Применение
Заголовок Upgrade позволяет согласовать протокол на существующем соединении HTTP/1.1. Клиент отправляет этот заголовок, предлагая переключиться на другой протокол, а сервер либо соглашается, отвечая 101 Switching Protocols, либо игнорирует запрос и продолжает работу с текущим протоколом.
Распространённые цели перехода — WebSocket (websocket), TLS (TLS/1.2, TLS/1.3) и HTTP/2 в открытом виде (h2c). Переход на WebSocket — наиболее широко используемая форма в современных развёртываниях, обеспечивающая полнодуплексный обмен между браузерами и серверами.
Вместе с Upgrade требуется заголовок Connection. Отправитель устанавливает Connection: upgrade, чтобы дать промежуточным узлам сигнал переслать запрос на переход, а не обрабатывать соединение самостоятельно.
Сервер также отправляет Upgrade в составе ответа 426 Upgrade Required. Тем самым он сообщает клиенту, что отказывается обрабатывать запрос с текущим протоколом, и перечисляет требуемый протокол в значении Upgrade.
Примечание
Заголовок Upgrade применяется только к HTTP/1.1. HTTP/2 и HTTP/3 для выбора протокола используют ALPN (Application-Layer Protocol Negotiation) во время TLS-рукопожатия.
websocket
Переводит соединение на протокол WebSocket для полнодуплексного обмена. Клиент добавляет к запросу на переход заголовки Sec-WebSocket-Key и Sec-WebSocket-Version.
h2c
Переводит соединение на HTTP/2 в открытом виде (без TLS). Клиент добавляет заголовок HTTP2-Settings, содержащий параметры соединения HTTP/2 в кодировке base64url.
TLS/1.2, TLS/1.3
Переводит незашифрованное HTTP-соединение в соединение, защищённое TLS. Этот механизм используется реже, чем установление TLS напрямую.
Пример
Клиент запрашивает переход на WebSocket. Сервер соглашается, отвечая 101 Switching Protocols и подтверждая новый протокол.
GET /chat HTTP/1.1
Host: example.re
Connection: upgrade
Upgrade: websocket
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Клиент предлагает перейти на HTTP/2 в открытом виде. Заголовок HTTP2-Settings несёт начальные параметры HTTP/2, закодированные в формате base64url.
GET / HTTP/1.1
Host: example.re
Connection: upgrade, HTTP2-Settings
Upgrade: h2c
HTTP2-Settings: AAMAAABkAAQCAAAAAAIAAAAA
Сервер требует, чтобы клиент использовал другой протокол. Ответ 426 Upgrade Required содержит заголовок Upgrade с перечислением допустимого протокола.
HTTP/1.1 426 Upgrade Required
Upgrade: TLS/1.3
Connection: upgrade