101 Switching Protocols
Utilisation
Les clients qui incluent l’en-tête de requête Upgrade souhaitent que le serveur utilise un protocole différent pour le reste de la session HTTP. Plusieurs protocoles sont listés sur une seule ligne, séparés par des virgules, par ordre de préférence décroissant. La version du protocole est facultative.
Connection: upgrade
Upgrade: protocol-name[/protocol-version]
La demande est faite lorsqu’elle présente un intérêt, par exemple pour tirer parti des fonctionnalités offertes par des versions de protocole plus récentes. Cette mise à niveau n’est prise en charge que par HTTP/1.1, et un client n’a aucun moyen de forcer le serveur à changer de protocole. La mise à niveau est facultative, et le serveur renvoie 200 lorsque l’en-tête Upgrade est ignoré.
Demande côté serveur
Le serveur n’a aucun moyen de forcer un client à changer de protocole, mais il refuse les requêtes lorsqu’un client ne satisfait pas aux exigences. Lorsqu’un client envoie une requête avec un protocole que le serveur ne prend pas en charge, le serveur renvoie 426. En utilisant le protocole indiqué par le serveur, le client voit ses requêtes suivantes acceptées et traitées.
Exemple
Le client demande le passage de HTTP/1.1 au protocole WebSocket. Le serveur accepte et change de protocole.
Requête
GET /chat HTTP/1.1
Host: example.com
Connection: upgrade
Upgrade: websocket
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Réponse
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
WebSocket et couche protocolaire
Les connexions WebSocket débutent comme des requêtes HTTP et sont mises à niveau via la poignée de main 101. Une fois la mise à niveau terminée, la connexion fonctionne comme un canal TCP persistant et full-duplex au niveau de la couche applicative (couche 7). Le découpage en trames HTTP est remplacé par le format de trame WebSocket. Les Server-Sent Events (SSE) constituent une alternative pour la diffusion du serveur vers le client sans nécessiter de mise à niveau de protocole.
Références de code
.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