101 Switching Protocols
使い方
Upgrade リクエストヘッダーを含めるクライアントは、HTTP セッションの残りの部分でサーバーに別のプロトコルを使ってほしいと考えています。複数のプロトコルは1行にカンマ区切りで、優先度の高い順に列挙します。プロトコルバージョンは任意です。
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 ハンドシェイクを通じてアップグレードされます。アップグレードが完了すると、接続はアプリケーション層(レイヤー 7)で持続的な全二重の TCP チャネルとして動作します。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