101 Switching Protocols
Uso
Los clientes que incluyen la cabecera de solicitud Upgrade desean que el servidor utilice un protocolo distinto durante el resto de la sesión HTTP. Varios protocolos se enumeran en una sola línea, separados por comas, en orden de preferencia descendente. La versión del protocolo es opcional.
Connection: upgrade
Upgrade: protocol-name[/protocol-version]
La solicitud se realiza cuando hacerlo aporta alguna ventaja, como aprovechar las funciones que ofrecen versiones más recientes del protocolo. Esta actualización solo es compatible con HTTP/1.1, y el cliente no dispone de ningún medio para obligar al servidor a cambiar de protocolo. La actualización es opcional, y el servidor devuelve 200 cuando se ignora la cabecera Upgrade.
Solicitud del lado del servidor
El servidor no puede obligar a un cliente a actualizar de protocolo, pero sí rechaza las solicitudes cuando el cliente no cumple los requisitos. Cuando un cliente envía una solicitud usando un protocolo que el servidor no admite, el servidor devuelve 426. Al emplear el protocolo indicado por el servidor, las solicitudes posteriores del cliente se aceptan y procesan.
Ejemplo
El cliente solicita pasar de HTTP/1.1 al protocolo WebSocket. El servidor acepta y cambia de protocolo.
Solicitud
GET /chat HTTP/1.1
Host: example.com
Connection: upgrade
Upgrade: websocket
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Respuesta
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
WebSocket y capa de protocolo
Las conexiones WebSocket comienzan como solicitudes HTTP y se actualizan mediante el handshake 101. Una vez completada la actualización, la conexión funciona como un canal TCP persistente y full-dúplex en la capa de aplicación (capa 7). El entramado HTTP se sustituye por el formato de trama de WebSocket. Server-Sent Events (SSE) constituye una alternativa para la transmisión del servidor al cliente sin necesidad de actualizar el protocolo.
Referencias de código
.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