Pada episode ini kita akan membuka mesin di balik curl: libcurl dengan arsitektur curl_easy dan curl_multi, ekosistem binding lintas bahasa, kapan memakai CLI atau library, cara membangun dari source, dan memulai embedding lewat --libcurl.

Di episode 19, kalian menjalankan curl --libcurl request.c dan menghasilkan file kode C tanpa menulis satu baris pun. Itu bukan sekadar trik keren — itu pintu masuk ke dunia di balik curl. Selama 19 episode kita memakai curl sebagai alat dari terminal. Sekarang waktunya membuka kap mesin dan melihat mesin yang sebenarnya: libcurl.
Perbedaan mendasarnya begini. CLI curl adalah mobil jadi: kalian masuk, menyalakan mesin, dan sampai tujuan. libcurl adalah mesin itu sendiri — bisa dipasang ke mobil apa pun yang kalian bangun sendiri. Memahami libcurl membuka kemampuan yang tidak mungkin dilakukan lewat terminal: request dari dalam aplikasi, kontrol penuh atas lifecycle, streaming data, dan integrasi dengan error handling bahasa pemrograman kalian.
curl dan libcurl adalah dua entitas yang berbeda. curl adalah program command-line yang bisa dijalankan manusia dan skrip. libcurl adalah library C yang melakukan transfer data mentah — dan CLI curl hanyalah salah satu "pemakainya". Ini menjelaskan kenapa --libcurl bisa menghasilkan kode yang setara: CLI dan library berbagi logika transfer yang sama.
Analogi yang paling tepat: curl adalah restoran yang menyajikan masakan, libcurl adalah dapurnya. Restoran bisa ganti menu atau tutup — dapurnya tetap dipakai banyak koki lain. Setiap kali kalian melihat "powered by libcurl" di belakang tool lain, ingatlah bahwa itu dapur yang sama dengan curl.
curl_easy dan curl_multilibcurl bekerja dalam dua antarmuka utama. curl_easy adalah yang paling dasar: satu handle, satu transfer, dieksekusi sinkron. Alurnya selalu sama — init, set option, perform, cleanup:
#include <curl/curl.h>
int main(void)
{
CURL *hnd = curl_easy_init();
curl_easy_setopt(hnd, CURLOPT_URL, "https://api.example.com/users");
CURLcode ret = curl_easy_perform(hnd);
curl_easy_cleanup(hnd);
return (int)ret;
}Empat baris inti itu adalah kerangka semua program libcurl. curl_easy_setopt adalah tempat kalian memasang semua opsi yang selama ini kalian ketik sebagai flag di CLI — URL, header, timeout, dan lainnya, masing-masing sebagai konstanta CURLOPT_*.
curl_multi adalah level di atasnya: banyak transfer dalam satu proses tanpa thread terpisah. Ini adalah cara libcurl menangani ratusan koneksi bersamaan — dasarnya yang sama dengan --parallel di episode 19:
CURLM *multi = curl_multi_init();
curl_multi_add_handle(multi, easy_a);
curl_multi_add_handle(multi, easy_b);
curl_multi_perform(multi, &running);
curl_multi_cleanup(multi);Bayangkan curl_easy sebagai satu pegawai yang melayani satu pelanggan sampai selesai, sedangkan curl_multi sebagai supervisor yang memantau banyak pegawai sekaligus — efisien untuk aplikasi yang mengunduh atau menguji banyak resource secara paralel. Inilah alasan banyak crawler dan download manager cepat: mereka berjalan di atas curl_multi, bukan membuka thread per request.
Pengaruh libcurl melampaui C. Banyak ekosistem bahasa pemrograman membangun binding di atasnya — atau memilih membangun stack HTTP sendiri. Membaca tabel ini membantu kalian memahami dari mana "otak" HTTP di aplikasi kalian berasal:
| Ekosistem | Implementasi HTTP | Keterangan |
|---|---|---|
Python pycurl | libcurl | Binding langsung, semua fitur libcurl tersedia |
Python requests | Stack sendiri (urllib3) | Tidak memakai libcurl, murni Python |
| PHP cURL extension | libcurl | Standar de facto HTTP di ekosistem PHP |
Rust curl crate | libcurl | Binding yang rapi ke libcurl |
Node.js node-libcurl | libcurl | Binding libcurl untuk JavaScript |
Ruby curb | libcurl | Binding libcurl untuk Ruby |
Go net/http | Stack sendiri | Implementasi native, tanpa libcurl |
Pola yang perlu kalian lihat: ada dua filosofi. Ekosistem seperti PHP dan Rust memilih menempel ke libcurl — berpuluh tahun pengalaman transfer data jadi gratis. Ekosistem seperti Go dan Python memilih implementasi sendiri — kendali penuh, bebas dari ketergantungan C. Tidak ada yang salah; yang penting adalah mengetahui mana yang mana saat debugging. Error "timeout" dari requests dan dari pycurl bisa berasal dari kode yang sama sekali berbeda.
Pertanyaan paling praktis: kapan saya pakai CLI curl, kapan saya pakai binding di aplikasi?
subprocess) itu mahal dan rapuh: mem-bootstrap proses baru per request, rentan masalah quoting, dan menyulitkan penanganan error. Jika request itu bagian dari aplikasi, pakai binding.Aturan praktisnya: kalau request bisa dilakukan manusia di terminal, pakai CLI. Kalau request dilakukan oleh program sebagai bagian dari logika bisnis, pakai library.
Kadang paket curl bawaan sistem tidak menyertakan fitur yang kalian butuhkan — misalnya HTTP/3 atau WebSocket. Solusinya adalah membangun sendiri. libcurl menggunakan sistem build yang fleksibel; dua pendekatan paling umum adalah configure dan CMake:
./configure --with-openssl --enable-websocket
make
sudo make installBangun dari source memberi kalian tiga keuntungan: memilih fitur secara eksplisit, memakai versi terbaru sebelum paket distro ikut, dan mengontrol dependensi seperti OpenSSL dan HTTP/3 library. Setelah terpasang, verifikasi dengan curl --version bahwa fitur yang diinginkan muncul di baris Features. Pastikan juga library libcurl ikut terpasang — untuk development di C, dibutuhkan paket development seperti libcurl4-openssl-dev.
--libcurlCara terbaik untuk mulai menulis kode libcurl adalah tidak menulis dari nol — biarkan curl menuliskan kerangkanya. Di episode 19 kalian sudah menghasilkan file:
curl --libcurl request.c https://api.example.com/usersFile yang dihasilkan adalah template lengkap dengan curl_easy_init, curl_easy_setopt untuk URL, dan curl_easy_cleanup. Langkah selanjutnya adalah mengompilasinya:
gcc -o request request.c -lcurl
./requestFlag -lcurl menghubungkan program dengan library libcurl. Jika kalian ingin tahu persis dari mana library itu datang, pkg-config --libs libcurl dan curl-config --version menunjukkan lokasi serta versinya. Dari template kecil ini, kalian bisa menambahkan callback untuk menangkap body respons, mengatur timeout, atau menukar curl_easy menjadi curl_multi ketika request mulai banyak.
Episode 20 membuka lapisan yang selama ini tersembunyi di balik terminal: libcurl sebagai library yang dijalankan CLI curl, arsitektur curl_easy untuk satu transfer sinkron dan curl_multi untuk transfer paralel, peta ekosistem binding lintas bahasa, panduan kapan memakai CLI atau library, cara membangun dari source, dan jalan masuk termudah lewat --libcurl.
Inti yang harus dibawa pulang: curl itu alat, libcurl itu fondasi — dan fondasi yang sama menopang tool lain di ekosistem kalian. Memahami keduanya berarti kalian tidak lagi "mengendarai mobil tanpa mengerti mesinnya".
Di episode 21 berikutnya kita akan menaikkan semuanya ke level produksi: production readiness dan security hardening — verifikasi TLS yang benar, pengelolaan rahasia, timeout dan retry yang terukur, hingga checklist keamanan untuk backend yang memakai curl. Sampai jumpa!