Membedah apa yang sebenarnya terjadi di balik satu baris perintah curl: dari parsing URL, resolusi DNS, koneksi TCP dan TLS, hingga pengiriman dan penerimaan respons, plus mengenal opsi-opsi inti dan exit code.

Setelah di episode 1 kita memahami sejarah dan latar belakang curl — lahir dari httpget 1996, dipersatukan sebagai curl 1998, dengan libcurl sebagai mesinnya — sekarang saatnya membedah bagaimana curl bekerja dari dalam. Episode ini adalah jembatan antara "kenapa curl ada" dan "bagaimana memakainya", jadi perhatikan alurnya baik-baik.
Banyak pengguna curl memakainya seperti mesin fotokopi: tekan tombol, lihat hasil. Padahal di balik satu baris curl https://example.com ada rangkaian peristiwa yang teratur dan bisa diprediksi. Memahami rangkaian ini — seperti membuka kap mesin sebelum menyetir — akan membuat kalian jauh lebih percaya diri saat hasilnya tidak sesuai harapan, dan menjadi dasar untuk episode verbose di episode 3.
Setiap kali curl berjalan, ia melewati enam tahap yang sama. Anggap saja seperti proses mengirim paket lewat kurir:
https, curl melakukan pertukaran sertifikat dan kunci enkripsi. Ini seperti menunjukkan identitas dan menyepakati sandi rahasia.Pola ini berlaku untuk semua protokol yang didukung curl, bukan hanya HTTP. Inilah kenapa memahami enam tahap ini memberi kalian kemampuan general yang tidak lekang oleh protokol apa pun.
Di episode 1 kita menyebut bahwa curl punya dua wajah: CLI dan libcurl. Hubungannya begini: libcurl adalah mesinnya, CLI adalah kemudinya.
Ketika kalian mengetik perintah curl di terminal, yang terjadi adalah: program CLI membaca opsi-opsi kalian, lalu menerjemahkannya satu per satu menjadi pengaturan pada libcurl, lalu memanggil fungsi perform untuk menjalankan seluruh enam tahap transfer di atas. Hasilnya dikembalikan ke CLI untuk ditampilkan.
Konsekuensi penting dari desain ini: setiap opsi CLI punya pasangan di libcurl. Opsi -L berarti CURLOPT_FOLLOWLOCATION, opsi -d berarti CURLOPT_POSTFIELDS. Kalian tidak perlu menghafal nama C-nya sekarang — cukup pahami bahwa semua yang kalian pelajari di CLI berlaku juga di dunia library.
Curl memiliki lebih dari 250 opsi, tapi jangan panik. Sama seperti belajar bahasa asing — mulailah dari kosakata yang paling sering muncul. Enam opsi berikut adalah kosakata wajib yang akan kita perdalam di episode-episode berikutnya:
| Opsi | Singkatan dari | Fungsi |
|---|---|---|
-X | --request | Menentukan method HTTP secara eksplisit |
-d | --data | Mengirim data pada request (biasanya POST) |
-H | --header | Menambahkan atau mengubah header request |
-o | --output | Menulis hasil ke file, bukan ke layar |
-L | --location | Mengikuti redirect yang dikirim server |
-u | --user | Mengirim kredensial user dan password |
Pola bacanya mudah: opsi pendek dengan satu tanda hubung (-d), opsi panjang dengan dua tanda hubung (--data). Keduanya sama-sama valid dan sering bisa dipakai bergantian.
curl -L https://example.com
curl --location https://example.comSetiap kali curl selesai, ia "berbicara" melalui exit code — sebuah angka yang dikembalikan ke shell. Ini adalah sistem sinyal utama curl untuk scripting, dan aturannya sangat sederhana: 0 berarti sukses, selain 0 berarti ada masalah.
curl -s https://example.com
echo $?curl -s https://domain-yang-tidak-ada-xyz.example
echo $?Pada contoh kedua, kalian akan melihat exit code 6 — artinya curl gagal me-resolve DNS host tersebut. Setiap angka punya makna spesifik yang didokumentasikan di man curl pada bagian EXIT CODES. Beberapa yang paling sering muncul:
| Exit Code | Arti |
|---|---|
| 0 | Sukses |
| 6 | Tidak bisa me-resolve host |
| 7 | Gagal terhubung ke host |
| 28 | Timeout |
| 35 | Masalah TLS/SSL |
Tip
Exit code adalah bahasa utama curl untuk script. Ketika kalian menulis if curl ...; then atau curl ... || exit 1, kalian sedang membaca bahasa ini. Nanti di episode scripting, kebiasaan memeriksa exit code akan membedakan script yang andal dari script yang "biasa saja".
Salah satu miskonsepsi terbesar pemula adalah mengira curl "men-download file ke disk". Faktanya: curl menulis hasil ke stdout (layar) dan tidak menyentuh file kecuali kalian memintanya.
curl https://example.comApa yang kalian lihat? Hanya body HTML, tanpa header, tanpa file yang tersimpan. Untuk menyimpan ke file, kalian perlu -o (dengan nama yang kalian tentukan) atau -O (dengan nama file dari URL). Garis besarnya:
| Perintah | Perilaku |
|---|---|
curl URL | Body ke layar, header disembunyikan |
curl -o nama.html URL | Body disimpan ke nama.html |
curl -O URL | Body disimpan dengan nama file dari URL |
curl -i URL | Header ikut ditampilkan sebelum body |
curl -I URL | Hanya header, mengirim method HEAD |
Konsekuensi praktisnya: kalian bisa langsung memipakan output curl ke program lain — curl -s URL | jq . — tanpa repot menyimpan file perantara. Ini pola yang akan kalian pakai setiap hari.
Important
Ingat aturan emas ini: curl tidak menulis file kecuali diminta. Jika kalian menjalankan curl URL dan berharap file tersimpan, kalian akan kecewa — outputnya mengalir ke layar (atau bisa dialihkan dengan >). Biasakan memakai -o untuk menyimpan, atau redirect stdout. Di episode download nanti, kita akan melihat -O yang menyimpan dengan nama remote.
Berikut peta singkat keputusan yang akan sering kalian hadapi:
| Kalian ingin... | Pakai |
|---|---|
| Menampilkan body saja | curl URL |
| Menyimpan body ke file | -o nama atau -O |
| Mengikuti redirect | -L |
| Menambah header khusus | -H |
| Mengirim data (POST) | -d |
| Menggunakan method selain GET | -X |
Pada episode 2 ini, kalian telah membedah arsitektur curl dari dalam: enam tahap transfer (parse URL, resolve DNS, connect TCP/TLS, send request, receive response, show output), hubungan libcurl sebagai mesin dan CLI sebagai kemudi, enam opsi inti yang akan menjadi kosakata wajib, bahasa exit code, serta aturan emas bahwa curl tidak menulis file kecuali diminta.
Inti yang harus dibawa pulang:
-o, -O, -i, -I, -X, -d, -H, -L, -u adalah kosakata awal kalian.Di episode 3 selanjutnya, kita mulai hands-on sungguhan: HTTP request dasar — menjalankan GET pertama ke https://example.com, memahami perbedaan GET vs HEAD dengan -I, dan membedah output verbose -v baris demi baris sehingga kalian bisa "membaca" apa yang terjadi di setiap koneksi. Sampai jumpa di episode 3!