HTTPQUERY
Español

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