100 Continue
Penggunaan
Klien yang menyertakan header Expect ingin memastikan bahwa server siap menerima body pesan sebelum mengirimkannya. Ketika body pesan berukuran besar, menggunakan tipe konten yang tidak diterima server, atau pengguna tidak memiliki otorisasi untuk mengirim file, proses ini memvalidasi kondisi-kondisi tersebut sebelum body dikirim.
Begitu status code 100 Continue tiba, body pesan pun dikirimkan. Ketika server justru mengembalikan 417, klien tidak melanjutkan.
Keuntungan menggunakan header Expect dengan 100-continue adalah penghematan bandwidth ketika server bersikap selektif terhadap konten yang diterima dan diproses.
Kerugiannya adalah header dan body permintaan HTTP dikirim secara terpisah. Sebagian lingkungan rentan membuat keduanya terpisah dan mengembalikan error alih-alih memproses permintaan HTTP tersebut.
Contoh
Permintaan
PUT /docs HTTP/1.1
Host: example.com
Content-Type: application/pdf
Content-Length: 99000
Expect: 100-continue
Response
HTTP/1.1 100 Continue
Tindak lanjut permintaan
<PDF file contents are sent as message body>
Response akhir
HTTP/1.1 200 OK
Klien berencana mengirim file PDF berukuran 99 KB ke server untuk diproses dan menyatakan hal tersebut dalam permintaan HTTP, dengan meminta validasi terlebih dahulu. Server merespons secara positif, lalu klien mengirimkan body pesan. Sebagai response akhir, server mengakhiri sesi HTTP tersebut dengan indikasi keberhasilan.
Sebagai alternatif, server merespons dengan sebuah error:
HTTP/1.1 417 Expectation Failed
Dalam situasi ini, klien tidak mengirimkan PDF tersebut, dan komunikasi selanjutnya dimulai dengan permintaan HTTP yang baru.
Expect100Continue pada pustaka klien
Banyak pustaka klien HTTP mengekspos Expect100Continue sebagai properti yang dapat dikonfigurasi. Pada .NET, ServicePointManager.Expect100Continue mengendalikan apakah permintaan POST dan PUT secara otomatis menyertakan header Expect: 100-continue. Menonaktifkan properti ini melewati pemeriksaan pendahuluan dan langsung mengirimkan body.
Referensi kode
.NET
HttpStatusCode.Continue
Rust
http::StatusCode::CONTINUE
Rails
:continue
Go
http.StatusContinue
Symfony
Response::HTTP_CONTINUE
Python3.5+
http.HTTPStatus.CONTINUE
Apache HttpComponents Core
org.apache.hc.core5.http.HttpStatus.SC_CONTINUE
Angular
@angular/common/http/HttpStatusCode.Continue