Komut satırı HTTP araçları — cURL

Bu flood’da komut satırından HTTP istekleri yapmamızı sağlayan araçlardan cURL'den bahsedeceğim.

cURL, HTTP istemci olarak bilinse de aslında FTP, LDAP, SMTP, vb birçok popüler internet protokolü için istemci olarak kullanılabilmektedir. Komut satırından kullanılan cURL protokol işlemleri için birçok dilde binding'i bulunan libcurl adlı kütüphaneyi kullanır. Bu binding'ler sayesinde herhangi bir programlama dilinde geliştirilen bir uygulamada libcurl tarafından desteklenen internet protokolleri kolaylıkla uygulamaya entegre edilebilmektedir. Sonuç olarak etrafımızda gördüğümüz birçok cihazda libcurl kullanılmaktadır.

Yukarıdaki kısa girişten sonra şimdi cURL'i HTTP istemci olarak güçlü kılan özellikleri tanımaya başlayalım. cURL'in en çok kullanılan özelliği şüphesiz bir URL'nin erişilebilir olup olmadığını kontrol etmektir. Aşağıda bir örnek gösterilmiştir.

Anlaşıldığı üzere yukarıdaki örnekte ilgili URL’e bir HTTP GET isteği atılmıştır. PUT, POST, DELETE tipinde HTTP istekleri atmak için -X (--request) opsiyonu kullanılır. Aşağıdaki örnekte sunucuya bir PUT isteği gönderilmiştir.

HTTP isteğinin header'ına eklenmek istenen parametreler için -H (--header) opsiyonu kullanılır. Aşağıdaki örnekte bir önceki ekran çıktısında gönderilen istek tekrarlanmış fakat bu kez istek içeriğinin JSON olduğu header yardımıyla belirtilmiştir.

HTTP isteklerinin cevapları (özellikle dosya indirilirken), ekran yerine bir dosyaya yönlendirilebilir. -O, (--remote-name) opsiyonu bu amaçla kullanılır ve indirilen dosyayı uzaktaki kaynakla aynı isimle isimlendirir. -o, (--output) ile ise dosya ismi değiştirilebilir.

Yukarıda verilen bazı ekran çıktılarında progress bar görülmekte bazılarında ise görülmemektedir. cURL'in çıktısı gerek -O veya -o gerekse de pipe | ile stdout (ekran) dışında bir dosyaya yönlendirildiğinde stdout'ta progress bar gösterilmektedir.

cURL çıktısı ekrana verildiğinde, normal çıktı ile karışmaması için progress bar gizlenmektedir. Bazı durumlarda cURL'in çıktısı dosyaya yönlendirilse bile ekranda progress bar'in görüntülenmesi istenmeyebilir. progress bar'i gizlemek için -s, (--silent) kullanılır.

cURL ön tanımlı olarak web sunucunun redirect taleplerini takip etmemektedir. redirect'lerin takip edilmesi için -L, (--location) kullanılabilir. cURL ön tanımlı olarak maksimum 50 redirect isteğini takip etmektedir. Bu sayı --max-redirs ile değiştirilebilir.

cURL ile yapılan HTTP isteği ve alınan cevabın header'lar ve diğer detayları ile birlikte görüntülenmesi için -v, (--verbose) opsiyonu kullanılabilir. Bu opsiyon yeterli gelmezse --trace ya da --trace-ascii opsiyonları kullanılabilir.

Otomasyon betiklerinde kullanıldığında cURL'in 2xx olmayan sunucu cevaplarında hata tespiti için 0'dan farklı bir çıkış kodu üretmesini isteriz. Bu durumda -f, (--fail) opsiyonu kullanılır.

Geliştirme ortamlarında bulunan self-signed sertifikalara yapılan HTTPS isteklerinde sertifika hatalarını atlatmak için -k, (--insecure) opsiyonu kullanılır.

cURL popüler olarak kullanıldığı için HTTP ile ilgili birçok araç cURL komutlarının üretilmesini kolaylaştırmaktadır. Aşağıda Chrome'dan yapılan bir isteğin cURL karşılığının nasıl üretileceği gösterilmiştir.

Son olarak cURL yaptığı HTTP isteği ile ilgili detaylı zamanlama bilgisini tutmaktadır. Bu bilgi sayesinde performans problemi olan isteklerin hangi aşamada (TCP, DNS, sunucu, vb) yavaş olduğu tespit edilebilir.

Bu flood’da öne çıkan özellikleri ile cURL'i inceledik. İlerleyen flood'larda ise HTTPie ve Postman araçlarının çarpıcı ve kullanışlı özelliklerini inceleyeceğiz.