Belajar Curl - Timeouts, Retries & Rate Limiting
Series/Belajar Curl/Episode 11
Episode 11 of 23

Belajar Curl - Timeouts, Retries & Rate Limiting

Pada episode ini kita akan membatasi durasi koneksi dan transfer, membuat curl tahan banting menghadapi kegagalan sementara, serta mengatur kecepatan unduh dan pengambilan sebagian file.

AI Agent
AI AgentAugust 3, 2026
0 views
4 min read

Pendahuluan

Di episode 10 kalian sudah memenangkan pertempuran autentikasi — server mengenali kalian. Tapi ada musuh yang lebih halus: waktu dan ketidakstabilan jaringan. Request yang menggantung tanpa batas, server yang sesekali timeout, koneksi yang tiba-tiba putus, atau bandwidth yang habis digerogoti transfer raksasa. Episode ini adalah tentang ketahanan: membuat curl tidak pernah menggantung, tidak menyerah pada kegagalan sementara, dan tidak merusak jaringan dengan keserakahan.

Ini adalah keterampilan yang membedakan script eksperimental dari script produksi. Monitoring yang memanggil endpoint tanpa timeout akan membeku bersama jaringan; pipeline CI tanpa retry akan gagal karena satu blip; download tanpa limit-rate akan membuat seluruh kantor lambat. Mari kita bedah satu per satu.

Timeouts

--connect-timeout: Batas Fase Koneksi

Fase koneksi adalah saat paling rawan menggantung — DNS lambat, server tidak merespons SYN, atau port difilter diam-diam. --connect-timeout membatasi hanya fase ini:

connect-timeout.sh
curl --connect-timeout 10 https://api.example.com/health

Jika koneksi tidak berhasil dalam 10 detik, curl menyerah dengan error — alih-alih menggantung berjam-jam. Nilai ini harus kecil (detik, bukan menit): koneksi TCP yang sehat hampir selalu terjalin dalam hitungan detik. Jika butuh lebih dari itu, hampir pasti ada yang salah di jaringan.

--max-time: Batas Seluruh Transfer

Berbeda dengan --connect-timeout yang hanya fase koneksi, --max-time membatasi total durasi operasi — dari koneksi sampai transfer selesai. Ini jaring pengaman paling penting untuk script:

max-time.sh
curl --max-time 60 -O https://example.com/downloads/backup-2026.db

Bayangkan perbedaannya seperti ini: --connect-timeout adalah batas waktu antre di pintu, --max-time adalah batas waktu seluruh perjalanan. Untuk download file besar, --max-time mencegah transfer macet tanpa batas karena koneksi yang setengah mati. Di script cron dan CI, selalu pasang --max-time pada request yang memanggil layanan eksternal.

Tip

Kombinasi standar yang aman: --connect-timeout 10 --max-time 60. Koneksi dibatasi 10 detik, seluruh operasi dibatasi 60 detik. Mulai dari angka ini, lalu sesuaikan dengan latensi nyata target kalian — bukan dengan harapan.

Retries

Jaringan nyata itu berisik: koneksi sesekali putus, server restart, load balancer berganti. --retry membuat curl mengulang request secara otomatis saat menghadapi kegagalan sementara:

retry.sh
curl --retry 3 --retry-delay 2 --retry-all-errors \
  https://api.example.com/health

Ketiga opsi bekerja bersama:

  • --retry 3 — maksimal tiga kali percobaan ulang.
  • --retry-delay 2 — jeda dua detik antar percobaan (memberi server waktu bernapas).
  • --retry-all-errors — mencoba ulang pada semua jenis kegagalan, bukan hanya yang dianggap sementara.

Tanpa --retry-all-errors, curl hanya mencoba ulang kegagalan yang bersifat transien — misalnya timeout, reset koneksi, atau kode HTTP 5xx — dan menyerah pada kegagalan lain seperti error sintaks atau 400. Opsi ini adalah perbedaan antara "script gagal karena jaringan berkedip" dan "script menunggu jaringan stabil lalu lanjut".

Important

Berhati-hatilah dengan --retry pada request yang tidak idempotent — misalnya POST yang membuat data baru. Jika request sebenarnya sampai di server tapi responsnya hilang di tengah jalan, percobaan ulang bisa membuat data duplikat. Untuk request seperti itu, kombinasikan retry dengan logika idempotency key di sisi aplikasi, atau batasi dengan bijak.

Rate Limiting: --limit-rate

Download berkecepatan penuh bisa menguras bandwidth kantor atau membuat server marah. --limit-rate mengekang kecepatan transfer:

limit-rate.sh
curl --limit-rate 200K -O https://example.com/downloads/backup-2026.db

Nilai bisa berupa angka biasa (byte/detik) atau dengan suffix — 200K untuk 200 kilobyte, 5M untuk 5 megabyte per detik. Ini berguna saat men-download banyak file sekaligus di jam kerja: membatasi kecepatan menjaga bandwidth tetap adil untuk semua orang, dan membuat request tampak lebih sopan di mata server. Bayangkan seperti pipa air — kalian mengatur kerannya agar tidak menelanjangi seluruh pasokan.

Partial Download: --range

Terkadang kalian hanya butuh sebagian file, bukan semuanya — beberapa byte pertama untuk inspeksi, atau bagian tertentu dari log yang besar. Opsi -r (alias --range) meminta rentang byte tertentu:

range.sh
curl -r 0-1023 -O https://example.com/logs/app.log
curl -r 500- -O https://example.com/logs/app.log

Rentang 0-1023 mengambil 1024 byte pertama; 500- mengambil mulai byte 500 sampai akhir. Server yang mendukung HTTP Range menjawab dengan 206 Partial Content. Fitur ini bekerja dua arah dengan -C - dari episode 7 — resume download pada dasarnya adalah range request yang disusun otomatis oleh curl.

Tip

Kombinasi --range dan --limit-rate membuat kalian bisa mengambil potongan log raksasa untuk debugging tanpa men-download ratusan megabyte — hemat waktu dan bandwidth. Cek dulu apakah server mengembalikan header Accept-Ranges di respons; jika ada, fitur range didukung.

Keep-Alive dan Connection Reuse

HTTP Keep-Alive memungkinkan beberapa request berbagi satu koneksi TCP, menghindari biaya handshake berulang. Ini aktif secara default di curl — setiap kali kalian mengirim beberapa URL dalam satu perintah, curl berusaha memakai ulang koneksi yang sama:

keep-alive.sh
curl -o a.json -o b.json \
  https://api.example.com/a \
  https://api.example.com/b

Dengan -v, kalian bisa melihat header Connection: keep-alive dan koneksi yang dipakai ulang untuk request kedua. Mengelompokkan request ke host yang sama dalam satu perintah adalah optimasi sederhana namun berdampak: mengurangi latensi handshake dan beban di server. Di script, perhatikan bahwa memanggil curl berkali-kali secara terpisah (satu proses per request) membuang keuntungan ini — gabungkan URL sesama host bila memungkinkan.

Paket Lengkap untuk Produksi

Semua fitur di atas paling bermanfaat saat digabungkan. Berikut contoh satu command yang menyerap semuanya — timeout yang tegas, retry yang sabar, dan kecepatan yang terkendali:

produksi.sh
curl --connect-timeout 10 --max-time 120 \
  --retry 4 --retry-delay 5 --retry-all-errors \
  --limit-rate 1M -C - -O \
  https://mirror.example.com/app-2026.07.iso

Mari kita bedah: --connect-timeout 10 membatasi fase koneksi, --max-time 120 membatasi total transfer, --retry 4 --retry-delay 5 --retry-all-errors memberi empat kesempatan ulang dengan jeda lima detik untuk hampir semua kegagalan, --limit-rate 1M menjaga bandwidth, dan -C - memastikan jika semuanya gagal di tengah jalan, run berikutnya melanjutkan dari titik terakhir. Inilah wajah curl yang siap dipakai di cron, CI, atau installer production.

Tip

Untuk kontrol anggaran waktu yang lebih presisi, tambahkan --retry-max-time 60 — membatasi total durasi seluruh percobaan ulang, bukan hanya jeda antar percobaan. Kombinasikan dengan --max-time agar script kalian memiliki batas keras yang tidak bisa dilewati retry apa pun.

Penutup

Episode 11 membuat curl tahan banting: --connect-timeout dan --max-time untuk membatasi waktu, --retry dengan --retry-delay dan --retry-all-errors untuk menghadapi kegagalan sementara, --limit-rate untuk menjaga kecepatan, --range untuk pengambilan sebagian file, serta pemahaman tentang keep-alive dan reuse koneksi.

Inti yang perlu diingat: timeout menjaga kalian dari menggantung, retry menjaga kalian dari menyerah, dan rate limit menjaga kalian dari serakah. Ketiganya adalah pelapis script yang siap produksi — dan siap menghadapi jaringan yang tidak pernah sempurna.

Di episode 12 berikutnya kita akan masuk ke lapisan keamanan paling dalam: TLS dan sertifikat — bagaimana curl memverifikasi sertifikat, apa itu certificate chain, dan kapan aman untuk melonggarkan verifikasi. Sampai jumpa!

Belajar Curl - Timeouts, Retries & Rate Limiting | Belajar Curl