417 Expectation Failed
Penggunaan
Ketika pesan error 417 Expectation Failed diterima, klien telah menetapkan satu atau beberapa kondisi untuk negosiasi proaktif di dalam header Expect pada permintaan. Hal ini berkaitan dengan respons informasional 100.
Ketika sebuah permintaan dikirim menggunakan header Expect: 100-continue, server memeriksa detail permintaan yang relevan. Detail ini mencakup kolom header Content-Type atau Content-Length. Jika server bersedia menerima body pesan, respons informasional 100 dikembalikan.
Jika server tidak bersedia menerima body pesan, status yang sesuai akan dikirim, misalnya 401 atau 405. Error 417 Expectation Failed hanya dikembalikan ketika server atau rantai respons tidak mendukung expectation. Jika pesan ini diterima, klien mengirim ulang permintaan tanpa header Expect.
Dampak SEO
Mesin pencari seperti Google tidak akan mengindeks URL dengan status respons 417 Expectation Failed. URL yang sebelumnya terindeks akan dihapus dari hasil pencarian.
Pertimbangan khusus bagi klien
Klien yang mengirim Expect: 100-continue tidak diwajibkan menunggu selama jangka waktu tertentu. Klien dapat melanjutkan pengiriman body pesan tanpa lebih dulu menerima respons. Karena server HTTP/1.0 tidak mendukung expectation, ketika server semacam itu digunakan sebagai perantara, klien tidak menunggu tanpa batas waktu sebelum mengirimkan body pesan.
Pertimbangan khusus bagi server
Jika server menerima Expect: 100-continue sebagai bagian dari permintaan HTTP/1.0, expectation tersebut harus diabaikan. Server tidak perlu memberi konfirmasi dengan 100 jika body pesan sudah diterima atau jika tidak ada body pesan sama sekali.
Ketika server mengirim 100, pada akhirnya harus menyusul status final seperti 200, kecuali koneksi terputus sebelum itu.
Jika server merespons dengan respons final sebelum menerima seluruh body pesan, respons tersebut menunjukkan apa yang akan dilakukan server terhadap koneksi: menutup koneksi, atau terus membaca dan membuang pesan permintaan.
Contoh
Klien meminta untuk mengirim berkas PDF berukuran 10K. Server merespons dengan 417 Expectation Failed karena expectation tidak didukung.
Permintaan
PUT /docs HTTP/1.1
Host: example.com
Content-Type: application/pdf
Content-Length: 10000
Expect: 100-continue
Respons
HTTP/1.1 417 Expectation Failed
Content-Type: text/html
Content-Length: 159
<html>
<head>
<title>Expectations not supported</title>
</head>
<body>
<p>Expectations are not supported by this server.
</p>
</body>
</html>
Cara memperbaiki
Hapus header Expect: 100-continue dan kirim ulang permintaan dengan menyertakan body secara penuh. Server atau proxy perantara tidak mendukung mekanisme 100-continue.
Banyak pustaka klien HTTP menambahkan header Expect: 100-continue secara otomatis untuk payload berukuran besar tanpa instruksi eksplisit. Nonaktifkan perilaku ini di tingkat pustaka:
Masalah proxy dan perantara. Proxy HTTP/1.0, load balancer, dan gateway versi lama tidak memahami handshake Expect: 100-continue. Ketika permintaan melewati perantara semacam itu, proxy menolak permintaan sebelum server asal memproses expectation tersebut. Meningkatkan versi proxy atau mengalihkan rute agar tidak melewati perantara HTTP/1.0 menyelesaikan masalah ini pada lingkungan tersebut.
Di sisi server, status ini jarang terjadi pada tumpukan HTTP modern. Sebagian besar server menghormati Expect: 100-continue atau mengabaikan header tersebut secara diam-diam. Mengembalikan 417 adalah sinyal yang disengaja agar expectation dihapus dari permintaan.
Referensi kode
.NET
HttpStatusCode.ExpectationFailed
Rust
http::StatusCode::EXPECTATION_FAILED
Rails
:expectation_failed
Go
http.StatusExpectationFailed
Symfony
Response::HTTP_EXPECTATION_FAILED
Python3.5+
http.HTTPStatus.EXPECTATION_FAILED
Java
HttpServletResponse.SC_EXPECTATION_FAILED
Apache HttpComponents Core
org.apache.hc.core5.http.HttpStatus.SC_EXPECTATION_FAILED
Angular
@angular/common/http/HttpStatusCode.ExpectationFailed