101 Switching Protocols
Verwendung
Clients, die den Upgrade-Anfrage-Header mitsenden, möchten, dass der Server für den Rest der HTTP-Sitzung ein anderes Protokoll verwendet. Mehrere Protokolle werden in einer einzigen Zeile kommagetrennt und in absteigender Reihenfolge der Präferenz aufgeführt. Die Protokollversion ist optional.
Connection: upgrade
Upgrade: protocol-name[/protocol-version]
Die Anfrage wird gestellt, wenn sich daraus ein Vorteil ergibt, etwa um Funktionen neuerer Protokollversionen zu nutzen. Dieses Upgrade wird nur von HTTP/1.1 unterstützt, und ein Client hat keine Möglichkeit, den Server zu einem Protokollwechsel zu zwingen. Das Upgrade ist optional, und der Server gibt 200 zurück, wenn der Upgrade-Header ignoriert wird.
Serverseitige Anforderung
Der Server hat keine Möglichkeit, einen Client zum Protokoll-Upgrade zu zwingen, doch er weist Anfragen zurück, wenn ein Client die Anforderungen nicht erfüllt. Sendet ein Client eine Anfrage mit einem Protokoll, das der Server nicht unterstützt, gibt der Server 426 zurück. Verwendet der Client das vom Server vorgegebene Protokoll, werden seine nachfolgenden Anfragen angenommen und verarbeitet.
Beispiel
Der Client fordert ein Upgrade von HTTP/1.1 auf das WebSocket-Protokoll an. Der Server nimmt an und wechselt das Protokoll.
Anfrage
GET /chat HTTP/1.1
Host: example.com
Connection: upgrade
Upgrade: websocket
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Antwort
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
WebSocket und Protokollschicht
WebSocket-Verbindungen beginnen als HTTP-Anfragen und werden über den 101-Handshake hochgestuft. Nach Abschluss des Upgrades arbeitet die Verbindung als dauerhafter, vollduplexfähiger TCP-Kanal auf der Anwendungsschicht (Schicht 7). Das HTTP-Framing wird durch das WebSocket-Frame-Format ersetzt. Server-Sent Events (SSE) sind eine Alternative für das Streaming vom Server zum Client, die kein Protokoll-Upgrade erfordert.
Code-Referenzen
.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