101 Switching Protocols
Применение
Клиенты, включающие запросный заголовок Upgrade, хотят, чтобы сервер использовал другой протокол на протяжении оставшейся части HTTP-сессии. Несколько протоколов перечисляются в одной строке через запятую, в порядке убывания предпочтения. Версия протокола указывается по желанию.
Connection: upgrade
Upgrade: protocol-name[/protocol-version]
Запрос отправляется тогда, когда в этом есть выгода, например возможность воспользоваться функциями более новых версий протокола. Такое переключение поддерживается только в HTTP/1.1, и у клиента нет способа заставить сервер сменить протокол. Переключение необязательно: если заголовок Upgrade игнорируется, сервер возвращает 200.
Требование со стороны сервера
Сервер не может заставить клиента переключить протокол, но он отклоняет запросы, когда клиент не соответствует требованиям. Когда клиент отправляет запрос по протоколу, который сервер не поддерживает, сервер возвращает 426. Используя протокол, указанный сервером, клиент добивается того, что последующие запросы принимаются и обрабатываются.
Пример
Клиент запрашивает переход с HTTP/1.1 на протокол WebSocket. Сервер соглашается и переключает протоколы.
Запрос
GET /chat HTTP/1.1
Host: example.com
Connection: upgrade
Upgrade: websocket
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Ответ
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
WebSocket и уровни протоколов
Соединения WebSocket начинаются как HTTP-запросы и переключаются через рукопожатие 101. После завершения переключения соединение работает как постоянный полнодуплексный TCP-канал на прикладном уровне (уровень 7). Формат кадров HTTP заменяется форматом кадров WebSocket. Server-Sent Events (SSE) — альтернатива для потоковой передачи от сервера к клиенту, не требующая переключения протокола.
Примеры кода
.NET
HttpStatusCode.SwitchingProtocols
Rust
http::StatusCode::SWITCHING_PROTOCOLS
Rails
:switching_protocols
Go
http.StatusSwitchingProtocols
Symfony
Response::HTTP_SWITCHING_PROTOCOLS
Python3.5+
http.HTTPStatus.SWITCHING_PROTOCOLS
Apache HttpComponents Core
org.apache.hc.core5.http.HttpStatus.SC_SWITCHING_PROTOCOLS
Angular
@angular/common/http/HttpStatusCode.SwitchingProtocols