Content-Length
Penggunaan
Header Content-Length menyampaikan ukuran byte yang tepat dari body pesan HTTP. Klien mengandalkan nilai ini untuk mengetahui kapan sebuah respons telah diterima sepenuhnya, sehingga koneksi dapat digunakan kembali pada koneksi persisten di HTTP/1.1.
Ketika server mengirim respons dengan ukuran body yang diketahui, header Content-Length memungkinkan klien mengalokasikan memori dalam jumlah yang tepat dan menampilkan indikator progres yang akurat selama pengunduhan. Ketidaksesuaian antara panjang yang dideklarasikan dan ukuran body yang sebenarnya menandakan transfer terpotong atau rusak.
Header ini saling eksklusif dengan Transfer-Encoding chunked. Ketika server mengalirkan respons dengan ukuran yang tidak diketahui, pengodean chunked menggantikan panjang konten yang tetap. Pada HTTP/2 dan HTTP/3, framing menangani batas pesan di tingkat protokol, tetapi Content-Length tetap valid untuk memvalidasi ukuran body.
Nilainya berupa satu bilangan bulat non-negatif yang menyatakan jumlah oktet (byte) di dalam body pesan.
Contoh
Server mengembalikan respons JSON sebesar 3.495 byte. Klien membaca tepat 3.495 byte sebelum menganggap pesan lengkap.
Content-Length: 3495
Sebuah permintaan POST mengirimkan body formulir. Header Content-Length memberi tahu server berapa banyak byte yang harus diharapkan pada body permintaan.
POST /submit HTTP/1.1
Host: example.re
Content-Type: application/x-www-form-urlencoded
Content-Length: 27
field=value&other=something
Respons yang menggunakan transfer encoding chunked menghilangkan header Content-Length sepenuhnya. Header Transfer-Encoding lebih diutamakan.
Transfer-Encoding: chunked
Pemecahan masalah
Kegagalan transfer dan galat koneksi sering kali berakar pada nilai Content-Length yang salah atau bertentangan.
Transfer terputus atau unduhan tidak lengkap. Klien menerima byte lebih sedikit daripada yang dideklarasikan Content-Length dan melaporkan respons yang terpotong. Penyebab umum: origin menutup koneksi terlalu awal, timeout proxy memutus transfer, atau server salah menghitung ukuran body. Jalankan curl -v https://example.re/file dan bandingkan nilai header Content-Length dengan byte yang benar-benar diterima (ditampilkan pada ringkasan transfer). Ketidaksesuaian memastikan adanya masalah tersebut.
Pengodean chunked dan Content-Length hadir bersamaan. Mengirim Transfer-Encoding: chunked dan Content-Length sekaligus dalam satu respons melanggar spesifikasi HTTP. Klien harus mengabaikan Content-Length ketika Transfer-Encoding hadir, tetapi tidak semua implementasi mematuhi aturan ini. Hapus Content-Length ketika menggunakan pengodean chunked. Pada nginx, pengodean chunked diterapkan secara otomatis ketika ukuran body tidak diketahui, dan nginx menghilangkan Content-Length dalam kasus tersebut. Kode aplikasi khusus atau middleware yang menyetel kedua header perlu diperbaiki.
Content-Length salah setelah middleware mengubah body. Middleware yang menyuntikkan konten (skrip analitik, token keamanan, toolbar debug) mengubah ukuran body tanpa memperbarui Content-Length. Browser akan memotong konten yang terlihat atau menunggu byte yang tidak pernah tiba. Pindahkan perhitungan Content-Length ke tahap akhir setelah semua modifikasi body selesai. Pada Express.js, middleware compression menanganinya secara otomatis. Pada konfigurasi khusus, hapus Content-Length dan andalkan pengodean chunked sebagai gantinya.
Respons HEAD membawa Content-Length yang salah. Respons HEAD harus menyertakan Content-Length yang sama dengan yang akan dibawa respons GET terkait, tetapi tanpa body. Beberapa framework menghasilkan respons HEAD dengan Content-Length bernilai 0 atau menghilangkan header tersebut sepenuhnya. Verifikasi dengan membandingkan curl -I https://example.re/resource (HEAD) dengan curl -s -o /dev/null -w ’%{size_download}’ https://example.re/resource (ukuran body GET). Nilai yang tidak cocok merusak pengelola unduhan dan proxy caching yang mengandalkan HEAD untuk menentukan ukuran sumber daya.
Mendiagnosis masalah Content-Length dengan curl. Jalankan curl -v https://example.re/resource untuk melihat header Content-Length dan jumlah byte transfer pada keluaran verbose. Baris Content-Length: N menunjukkan ukuran yang dideklarasikan. Di bagian akhir, bytes received menunjukkan transfer yang sebenarnya. Tambahkan -o /dev/null untuk membuang body dan fokus pada header. Untuk respons terkompresi, ingat bahwa Content-Length mencerminkan ukuran terkompresi, bukan ukuran aslinya.