101 Switching Protocols
Penggunaan
Klien yang menyertakan header permintaan Upgrade menginginkan server menggunakan protokol berbeda untuk sisa sesi HTTP. Beberapa protokol didaftar pada satu baris, dipisahkan koma, menurut urutan preferensi menurun. Versi protokol bersifat opsional.
Connection: upgrade
Upgrade: protocol-name[/protocol-version]
Permintaan ini dilakukan ketika ada keuntungan dari melakukannya, misalnya memanfaatkan fitur yang ditawarkan oleh versi protokol yang lebih baru. Upgrade ini hanya didukung oleh HTTP/1.1, dan klien tidak punya cara untuk memaksa server berganti protokol. Upgrade bersifat opsional, dan server mengembalikan 200 ketika header Upgrade diabaikan.
Permintaan dari sisi server
Server tidak punya cara untuk memaksa klien meng-upgrade protokol, tetapi server menolak permintaan ketika klien gagal memenuhi persyaratannya. Ketika klien mengirim permintaan menggunakan protokol yang tidak didukung server, server mengembalikan 426. Dengan menggunakan protokol yang diarahkan oleh server, permintaan klien berikutnya akan diterima dan diproses.
Contoh
Klien meminta upgrade dari HTTP/1.1 ke protokol WebSocket. Server menerimanya dan berganti protokol.
Permintaan
GET /chat HTTP/1.1
Host: example.com
Connection: upgrade
Upgrade: websocket
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Respons
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
WebSocket dan lapisan protokol
Koneksi WebSocket dimulai sebagai permintaan HTTP dan di-upgrade melalui handshake 101. Setelah upgrade selesai, koneksi beroperasi sebagai kanal TCP full-duplex yang persisten pada lapisan aplikasi (layer 7). Framing HTTP digantikan oleh format frame WebSocket. Server-Sent Events (SSE) merupakan alternatif untuk streaming dari server ke klien tanpa memerlukan upgrade protokol.
Referensi kode
.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