Her Yönüyle curl
Her Yönüyle curl, curl ile ilgili her şey için kapsamlı bir rehberdir. Projenin kendisi, komut satırı aracı, kütüphane, her şeyin nasıl başladığı ve bugünkü yararlı araç haline nasıl geldiği anlatılmaktadır. Onu daha da geliştirmek için nasıl çalıştığımızı, kullanmak için nelerin gerektiğini, kod veya hata raporlarıyla nasıl katkıda bulunabileceğinizi ve milyonlarca mevcut kullanıcının onu neden kullandığını açıklar.
Kısacası: her yönüyle curl.
Bu kitap, hem sıradan okuyucular hem de biraz daha deneyimli geliştiriciler için ilginç ve yararlı olmayı amaçlamaktadır. Herkesin içinden seçip alabileceği bir şeyler sunar.
Bu kitabı baştan sona okumayın. Merak ettiğiniz bölümleri veya içerikleri okuyun ve uygun gördüğünüz şekilde ileri geri göz atın.
Bu kitap kendi başına bir açık kaynak projesidir: açık, indirmesi ve okuması tamamen ücretsizdir. Herkesin yorum yapmasına açıktır ve herkesin katkıda bulunması ve yardım etmesi için uygundur. Hata raporlarınızı, fikirlerinizi, "pull request"lerinizi (çekme isteklerinizi) veya eleştirilerinizi bize gönderin; ben veya bir başkası kitabı buna göre geliştirmek için çalışacaktır.
Bu kitap asla bitmeyecek. Üzerinde çalışmaya devam etmeye niyetliyim. Bir noktada, projenin çoğu yönünü kapsayan (bu aşılmaz bir hedef gibi görünse de) oldukça eksiksiz olduğunu düşünsem bile, curl projesi ilerlemeye devam edecek, bu yüzden kitapta da her zaman güncellenecek şeyler olacaktır.
Bu kitap projesi Eylül 2015'in sonunda başladı.
Site
https://everything.curl.dev bu kitabın ingilizce orijinal sayfasıdır. Kitabın ingilizce web sürümünü içerir. Türkçe web sürümüne https://fr0stb1rd.github.io/her-yonuyle-curl adresinden ulaşılabilir.
Bu kitap ayrıca ingilizce olarak PDF ve ePUB biçimlerinde de sunulmaktadır. Türkçe sürümleri ise Releases sayfasında PDF, EPUB ve HTML/mdbook paketleri (ZIP) olarak sunulmaktadır.
İngilizce web sitesi Fastly tarafından barındırılmaktadır. Türkçe web sitesi GitHub Pages tarafından barındırılmaktadır. Kitap içeriği 18 Mart 2024'ten beri mdBook tarafından oluşturulmaktadır.
İçerik
Tüm kitap içeriği GitHub'da https://github.com/curl/everything-curl deposunda barındırılmaktadır. Türkçe içeriği ise https://github.com/fr0stb1rd/her-yonuyle-curl deposunda barındırılmaktadır.
Yazar
Bu materyalin sadece ortak yazarı olma umuduyla, ben Daniel Stenberg. curl projesini kurdum ve özünde bir geliştiriciyim; eğlence ve kazanç için. Stokholm, İsveç'te yaşıyorum ve çalışıyorum.
Daniel hakkında bilinmesi gereken her şey daniel.haxx.se adresinde bulunabilir.
Katkıda Bulunun
Bu belgede hatalar, eksiklikler, yanlışlar veya bariz yalanlar bulursanız, lütfen etkilenen paragrafın yenilenmiş bir sürümünü bize gönderin, biz de düzeltip güncelleyelim. Yardımcı olan herkesi takdir ediyor ve tanıyoruz.
Tercihen, orijinal kitabın GitHub sayfasında hatalar (errors) veya pull request'ler gönderebilirsiniz.
Çeviri
Bu kitabın Türkçe çevirisi (ve kapak fotoğrafının Türkçe tasarımı) fr0stb1rd tarafından orijinaline sadık kalınarak yapılmıştır. Çeviri ile ilgili hataları bildirmek veya katkıda bulunmak (PR göndermek) için her-yonuyle-curl deposunu kullanabilirsiniz.
Katkıda Bulunanlar
Birçok insan hata bildirdi, bölümleri geliştirdi veya bu kitabın bugünkü başarısına ulaşmasına yardımcı oldu. Bu arkadaşlar şunları içerir:
AaronChen0 on github, alawvt on github, Amin Khoshnood, amnkh on github, Anders Roxell, Angad Gill, Aris (Karim) Merchant, auktis on github, Ben Bodenmiller Ben Peachey, bookofportals on github, Bruno Baguette, Carlton Gibson, Chris DeLuca, Citizen Esosa, Dan Fandrich, Daniel Brown, Daniel Sabsay, David Piano, DrDoom74 at GitHub, Emil Hessman, enachos71 on github, ethomag on github, Fabian Keil, faterer on github, Frank Dana, Frank Hassanabad, fr0stb1rd on github, Gautham B A, Geir Hauge, Harry Wright, Helena Udd, Hubert Lin, i-ky on github, infinnovation-dev on GitHub, Jay Ottinger, Jay Satiro, Jeroen Ooms, Johan Wigert, John Simpson, JohnCoconut on github, Jonas Forsberg, Josh Vanderhook, JoyIfBam5, KJM on github, knorr3 on github, lowttl on github, Luca Niccoli, Manuel on github, Marius Žilėnas, Mark Koester, Martin van den Nieuwelaar, mehandes on github, Michael Kaufmann, Ms2ger, Mohammadreza Hendiani, Nick Travers, Nicolas Brassard, Oscar on github, Oskar Köök, Patrik Lundin, RekGRpth on github, Ryan McQuen, Saravanan Musuwathi Kesavan, Senthil Kumaran, Shusen Liu, Sonia Hamilton, Spiros Georgaras, Stephen, Steve Holme, Stian Hvatum, strupo on github, Viktor Szakats, Vitaliy T, Wayne Lai, Wieland Hoffmann, 谭九鼎
Lisans
Bu belge Creative Commons Atıf 4.0 Uluslararası lisansı altında lisanslanmıştır.
Nasıl okunmalı
İşte bu kitabın ana bölümlerine ve neleri kapsadıklarına dair bir genel bakış.
cURL projesi
Projenin nasıl başladığı, nasıl çalıştığımız, sürümlerin ne sıklıkla yapıldığı ve daha fazlası.
Ağ ve protokoller
Ağlar ve protokoller tam olarak nedir?
curl ve libcurl kurulumu
curl nereden ve nasıl edinilir ve kurulur.
Kaynak kodu
curl kaynak ağacının bir açıklaması ve kod düzeninin nasıl olduğu ve çalıştığı.
curl ve libcurl derleme
Kaynak kodundan curl ve libcurl nasıl derlenir.
Komut satırı kavramları
En baştan başlayın. Bir komut satırından curl'ü nasıl kullanırsınız?
Komut satırı transferleri
Daha derine inerek, curl komut satırı aracı ile İnternet transferlerinin nasıl yapılacağına ve kontrol edileceğine bakıyoruz.
Komut satırı HTTP
curl komut satırı aracı ile yapılacak HTTP'ye özgü eylemleri daha derinlemesine inceliyoruz.
Komut satırı FTP
Bu bölümde curl ile FTP'ye özgü işlemlerin nasıl yapılacağını öğrenin.
libcurl
libcurl nasıl çalışır ve onunla kendi uygulamalarınızı yazarken onu nasıl kullanırsınız. Temeller.
libcurl transferleri
API'yi kullanarak İnternet transferleri yapmak için libcurl nasıl kurulur ve kontrol edilir.
libcurl HTTP
libcurl ile HTTP'ye özgü transferleri yapmaya ve kontrol etmeye daha yakından bir bakış.
libcurl yardımcıları
libcurl, sadece transferlerin biraz ötesine geçen bir dizi ek API, yardımcı sağlar. Bunlar, libcurl kullanan uygulamanızın mükemmelleşmesini sağlayabilecek API'ler ve alt sistemlerdir. URL'leri yönetin, HTTP başlıklarını çıkarın ve daha fazlasını yapın.
libcurl örnekleri
İlk basit uygulamayı yazmanın ne kadar kolay olduğunu gösteren bağımsız libcurl kullanım örnekleri.
libcurl bağlayıcıları (bindings)
Popüler libcurl bağlayıcılarına ve bunların libcurl C API'sine ne kadar benzediğine dair genel bir bakış.
libcurl iç yapısı (internals)
Kaputun altında böyle çalışır...
Dizin
Dizin.
cURL projesi

Açık Kaynak (Open Source) projeleri hakkında komik bir detay, sanki zamanla sınırlıymış veya hiç bitebilecekmiş gibi projeler olarak adlandırılmalarıdır. cURL projesi, ortak bir misyonla birlikte yazılım geliştiren, gevşek bir şekilde bağlı bireysel gönüllülerin oluşturduğu bir gruptur: İnternet protokolleri ile güvenilir veri transferleri yapmak, Açık Kaynak olarak.
- Nasıl başladı
- İsim
- curl ne yapar?
- Proje iletişimi
- E-posta listesi görgü kuralları
- E-posta listeleri
- Hata bildirme
- Ticari destek
- Sürümler
- Güvenlik
- Güven
- Davranış Kuralları (Code of Conduct)
- Geliştirme
- Geliştirme ekibi
- curl kullanıcıları
- Gelecek
Nasıl başladı
1996 yılında, Daniel Stenberg boş zamanlarında bir IRC botu yazıyordu; Amiga bilgisayarına (IRC ağı EFnet üzerindeki #amiga kanalı) adanmış bir sohbet odasındaki katılımcılar için hizmetler sunacak otomatik bir program. Güncel döviz kurlarını alıp botunun sohbet odası kullanıcılarına güncel kurları sunmasının, örneğin bot'a "lütfen 200 USD'yi SEK'e çevir" veya benzeri şeyler sormanın eğlenceli olacağını düşündü.
Sağlanan döviz kurlarının mümkün olduğunca doğru olması için, bot kurları barındıran bir web sitesinden günlük olarak indirecekti. Bu görev için HTTP üzerinden veri indirmek üzere küçük bir araca ihtiyaç duyuldu. O zamanlar yapılan hızlı bir araştırma sonucunda Daniel, httpget adlı küçük bir araç buldu (Brezilyalı geliştirici Rafael Sagula tarafından yazılmıştı). İşi görüyordu, neredeyse, sadece orada burada birkaç küçük ince ayara ihtiyacı vardı.
Rafael, HttpGet 0.1'i 11 Kasım 1996'da yayınladı ve hemen bir sonraki sürümde, o yılın Aralık ayında yayınlanan 0.2 sürümünde, Daniel'in ilk değişiklikleri dahil edildi. Bundan kısa bir süre sonra, Daniel birkaç yüz satırlık kodun bakımını devraldı.
HttpGet 1.0, 8 Nisan 1997'de yepyeni HTTP vekil sunucu (proxy) desteğiyle yayınlandı.
Kısa süre sonra GOPHER üzerinden para birimlerini alma desteğini bulduk ve düzelttik. FTP indirme desteği eklendiğinde, projenin adı değiştirildi ve urlget 2.0, Ağustos 1997'de yayınlandı. Sadece HTTP günleri çoktan geride kalmıştı.
Proje yavaş yavaş büyüdü. Yükleme yetenekleri eklendiğinde ve isim bir kez daha yanıltıcı hale geldiğinde, ikinci bir isim değişikliği yapıldı ve 20 Mart 1998'de curl 4 yayınlandı. (Önceki isimlerden gelen sürüm numaralandırması korundu.)
Biz 20 Mart 1998 tarihini curl'ün doğum günü olarak kabul ediyoruz.
İsim
Bir şeyleri isimlendirmek zordur.
Araç, bir URL ile belirtilen verileri yüklemek ve indirmekle ilgiliydi. Bir istemci tarafı (client-side) programı ('c'), bir URL istemcisi (client) idi ve verileri (varsayılan olarak) gösterecekti. 'c', Client (İstemci) ve URL anlamına gelir: cURL. Ayrıca "see URL" (URL'i gör) olarak da okunabilmesi gerçeği yardımcı oldu.
Daha fazlasına gerek yoktu, bu yüzden isim seçildi ve bir daha arkamıza bakmadık.
Daha sonra, birisi curl'ün aslında zekice bir özyinelemeli kısaltma (ilk harfinin aynı kelimeye atıfta bulunduğu kısaltma) olabileceğini önerdi: Curl URL Request Library.
Bu harika olsa da, aslında orijinal düşünce bu değildi. Keşke o kadar zeki olsaydık…
curl ismini çeşitli şekillerde kullanan başka projeler de var ve vardı, ancak bizim curl'ümüz ortaya çıktığında biz bunların farkında değildik.
Büyük harf veya küçük harf
Proje, cURL gibi karışık harflerle yazılabilir, ancak biz genellikle tamamen küçük harflerle yazarız: curl. İstediğiniz sürümü kullanmakta özgürsünüz. Biz komut satırı aracı ve kütüphane hakkında yazarken tamamen küçük harf kullanma eğilimindeyiz: curl ve libcurl.
Telaffuz
Çoğumuz curl'ü İngilizce curl kelimesi gibi, baştaki k sesiyle telaffuz ederiz. Girl ve earl gibi kelimelerle kafiyelidir. Merriam Webster'ın yardımcı olması için kısa bir WAV dosyası vardır.
Karışıklıklar ve yanlış anlaşılmalar
Bizim curl'ümüz oluşturulduktan kısa bir süre sonra, bir programlama dili oluşturan başka bir curl ortaya çıktı. O curl hala mevcut.
Çeşitli programlama dilleri için çeşitli libcurl bağlayıcıları (bindings), bağlayıcılarını tanımlamak için kısmen veya tamamen curl veya CURL terimini kullanır. Bazen kullanıcıların curl hakkında konuştuğunu ancak ne komut satırı aracına ne de bu proje tarafından yapılan kütüphaneye atıfta bulunmadığını görürsünüz.
Fiil olarak
'Bir şeyi curllemek' (To curl something), bazen bir URL'den bir dosya veya kaynak indirmek için tarayıcı dışı bir araç kullanmaya atıfta bulunmak için kullanılır.
curl ne yapar?
cURL bir projedir ve birincil amacı ile odak noktası İnternet transferi ile ilgili Açık Kaynak ürünleri yapmaktır:
-
curl, komut satırı aracı
-
libcurl, C API'sine sahip transfer kütüphanesi
-
trurl, URL ayrıştırıcı ve manipülasyon aracı
-
wcurl, basit indirme aracı
İstemci taraflı (client-side) İnternet protokolü transferleriyle ilgili her şey curl'ün işi sayılabilir. Bununla ilgili olmayan şeylerden kaçınılmalı ve diğer projelere ve ürünlere bırakılmalıdır.
curl ve libcurl'ün transfer edilen gerçek verileri işlemekten kaçınmaya çalıştığını da göz önünde bulundurmak önemli olabilir. Örneğin, HTML veya HTTP üzerinden transfer edilmesi popüler olan diğer içerikler hakkında hiçbir bilgisi yoktur, ancak bu tür verilerin HTTP üzerinden nasıl transfer edileceği hakkında her şeyi bilir.
curl ürünleri, İnternet bağlantılı bir dünyada binlerce veya milyonlarca komut dosyasını ve uygulamayı çalıştırmak için sıkça kullanılmakla kalmaz, aynı zamanda sunucu testleri, protokol kurcalamaları ve yeni şeyler denemek için de yaygın olarak kullanılır.
curl, komut satırı aracı
curl'ü komut satırından çalıştırmak doğaldı ve Daniel, verileri varsayılan olarak stdout'a (standart çıktı), terminale göndermekten başka bir şey düşünmedi. Standart Unix felsefesinin "her şey bir boru (pipe) hattıdır" mantrası Daniel'in inandığı bir şeydi. curl, 'cat' veya diğer Unix araçlarından biri gibidir; ne yapmak istiyorsanız diğer araçlarla zincirlemeyi kolaylaştırmak için verileri stdout'a gönderir. Bu aynı zamanda, bir dosyadan okumaya veya bir dosyaya yazmaya izin veren neredeyse tüm curl seçeneklerinin, bunu stdout'a veya stdin'den (standart girdi) yapmayı seçme yeteneğine de sahip olmasının nedenidir.
Komut satırı araçlarının çalışma şekline ilişkin Unix tarzını takiben, curl'ün komut satırında birden fazla URL'i desteklemesi gerekip gerekmediği konusunda da hiçbir zaman bir soru işareti olmadı.
Komut satırı aracı, komut dosyalarından (scripts) veya diğer otomatik yollardan mükemmel şekilde çalışacak şekilde tasarlanmıştır. Yalnızca metin girişi ve metin çıkışı dışında başka bir GUI veya UI (Kullanıcı Arayüzü) özelliği yoktur.
libcurl, kütüphane
Komut satırı aracı önce gelse de, ağ motoru sökülüp 2000 yılında bir kütüphaneye dönüştürüldü ve bugün hala sahip olduğumuz kavramlar Ağustos 2000'de libcurl 7.1 ile tanıtıldı. O zamandan beri, komut satırı aracı, tüm ağır işi yapan kütüphanenin etrafında bir araç oluşturan ince bir mantık katmanı olmuştur.
libcurl, yazılımlarına istemci taraflı dosya transfer yetenekleri eklemek isteyen herkes için, herhangi bir platformda, herhangi bir mimaride ve herhangi bir amaçla kullanılabilir olacak şekilde tasarlanmış ve amaçlanmıştır. libcurl ayrıca bunun bir engel haline gelmesini önlemek için son derece özgürce lisanslanmıştır.
libcurl, geleneksel ve muhafazakar C ile yazılmıştır. Diğer dillerin tercih edildiği durumlarda, insanlar onlar için libcurl bağlayıcıları (bindings) oluşturmuştur.
Kütüphane, İnternet transferlerinin gerekli olduğu her türlü hayal edilebilir gömülü cihazda (embedded device) kullanılır: araç bilgi-eğlence sistemleri, televizyonlar, Blu-Ray oynatıcılar, set üstü kutular (set-top boxes), yazıcılar, yönlendiriciler, oyun sistemleri vb.
trurl, bir URL aracı
URL'leri yönetmek, ayrıştırmak ve işlemek zordur. Sadece URL'lerin yetersiz standartlaştırılmış olması ve farklı ayrıştırıcıların aynı URL'i farklı şekilde ayrıştırması nedeniyle değil, aynı zamanda sözdizimlerinin doğru anlaşılmasının zor olması nedeniyle.
trurl, kullanıcıların komut dosyalarında ve komut satırlarında URL'leri ayrıştırmasına, oluşturmasına ve değiştirmesine yardımcı olan bir komut satırı aracıdır. trurl kullanarak, komut dosyaları URL standartlarının inceliklerini çözmek zorunda kalmadan URL'lerden ayrıntıları güvenli bir şekilde çıkarabilir, URL'leri güncelleyebilir veya URL'ler oluşturabilir.
trurl'ü curl ile birlikte kullanmanın bir başka nedeni de, trurl'ün libcurl kullanılarak oluşturulmuş olmasıdır, yani her iki araç da aynı URL ayrıştırıcısını kullanır ve bu nedenle URL'leri tam olarak aynı şekilde anlar ve işler. Bu önemlidir çünkü aynı URL üzerinde karışık URL ayrıştırıcıları kullanmak güvenlik açıklarının yaygın bir nedenidir.
wcurl, bir URL indirici
Uzun yıllardır, insanların curl'ü URL indirmek için kullanmanın zor olduğunu, çünkü curl'e sadece bunu yaptırmak için (tek bir URL veya iki URL'i yerel bir dosyaya indirmek) gereken tam komut satırı seçeneklerini asla hatırlayamadıklarını söyledikleri ve bildirdikleri görülmüştür. İnsanlar, bu kullanım durumu için alternatif komut satırı araçlarını kullanmaya devam etmelerinin birincil nedeni olarak bunu gösterirlerdi.
wcurl, kullanıcının herhangi bir parametreyi hatırlamasına gerek kalmadan URL'leri basitçe indiren komut satırı aracıdır.
Proje iletişimi
cURL, dünyanın her yerinden, dünyanın çok sayıda zaman diliminde yaşayan ve çalışan gönüllü üyelerden oluşan bir Açık Kaynak projesidir. Böyle bir kurulumun gerçekten çalışması için iletişim ve açıklık kilit öneme sahiptir. Tüm iletişimi halka açık tutuyoruz ve açık iletişim kanalları kullanıyoruz. Çoğu tartışma e-posta listelerinde yapılır, tüm sorunların tartışıldığı ve bakmak isteyen herkesin tam olarak görebileceği hata takip sistemleri kullanırız.
Hepimizin projeyle ortaklaşa ilgilendiğimizi, sorunları çözdüğümüzü ve özellikler eklediğimizi fark etmek önemlidir. Bazen düzenli bir katkıda bulunan kişi sıkılır ve gözden kaybolur, bazen yeni ve hevesli bir katkıda bulunan kişi gölgelerden çıkar ve daha fazla yardım etmeye başlar. Bu gemiyi olabildiğince iyi bir şekilde ilerletmek için açık tartışmaları sürdürmemiz önemlidir ve tartışmaları özele taşıyan veya geliştirme sorunları, sorular, hata ayıklama veya her ne olursa olsun bireysel ekip üyelerine e-posta göndermeye çalışan kullanıcılara hoş bakmamamızın nedenlerinden biri de budur.
Bugünlerde e-posta listeleri eski tarz iletişim olarak kabul edilebilir — süslü web forumları veya benzerleri yoktur. Bu nedenle e-posta listesi kullanmak her yerde uygulanmayan bir sanattır ve size biraz garip ve sıra dışı gelebilir. Bu sadece, o e-postayı tüm abonelere gönderen bir adrese e-posta göndermekle ilgilidir. E-posta listelerimizin en fazla birkaç bin abonesi vardır. İlk kez e-posta gönderiyorsanız, kültürü ve neyin iyi uygulama olarak kabul edildiğini öğrenmek için önce birkaç eski e-postayı okumak iyi olabilir.
E-posta listeleri ve hata takip sistemi birkaç kez barındırma sağlayıcısı değiştirdi ve gelecekte bunun tekrar olabileceğinden şüphelenmek için nedenler var. Bu, uzun süre yaşayan bir projenin başına gelen türden bir şeydir.
Birkaç kullanıcı da libera.chat üzerindeki #curl kanalında IRC'de takılmaktadır.
E-posta listesi görgü kuralları
Birçok topluluk ve alt kültür gibi, biz de neyin doğru davranış biçimi olduğunu ve e-posta listelerinde nasıl iletişim kurulacağını düşündüğümüz kılavuzlar ve kurallar geliştirdik. curl e-posta listesi görgü kuralları (etiquette), geleneksel Açık Kaynak projelerinin stilini takip eder.
Tek bir kişiye e-posta göndermeyin
Pek çok insan bir soruyu doğrudan tek bir kişiye gönderir. Tek bir kişi çok sayıda e-posta alır ve size yanıt verebilecek sadece bir kişi vardır. Soru, diğer insanların da sormak isteyebileceği bir şey olabilir. Bu diğer insanların, tek bir kişiye soruyu sormaktan başka yanıtı okumanın bir yolu yoktur. Sonuç olarak, o tek kişi e-posta ile aşırı yüklenir.
Gerçekten bir kişiyle iletişime geçmek ve belki de hizmetleri için ödeme yapmak istiyorsanız, elbette devam edin, ancak bu sadece başka bir curl sorusuysa, bunun yerine uygun bir listeye taşıyın.
Yanıtla veya yeni e-posta
Lütfen listelere mesaj göndermek için bir kısayol olarak mevcut bir mesaja yanıt vermeyin (reply).
Pek çok e-posta programı ve web arşivleyicisi, e-postaları konular (threads) olarak, yani belirli bir konuyu tartışan gönderi koleksiyonları olarak bir arada tutmak için e-postaların içindeki bilgileri kullanır. Aynı veya benzer bir konuda yanıt vermeyi düşünmüyorsanız, mevcut bir e-postayı yanıtlayıp konuyu değiştirmeyin; yeni bir e-posta oluşturun.
Listeye yanıt verin
Liseden gelen bir mesaja yanıt verirken, yalnızca yanıtladığınız tek e-postanın yazarına değil, grup yanıtı (group reply) veya tümünü yanıtla (reply to all) yaptığınızdan emin olun.
Sadece tek bir kişiye özel olarak yanıt verilmesini aktif olarak teşvik etmiyoruz. Tartışmaların takibini listede tutun.
Mantıklı bir konu başlığı kullanın
Lütfen e-postanızın içeriğiyle ilgili ve mantıklı bir e-posta konusu kullanın. Bu, e-postanızı daha sonra bulmayı çok daha kolaylaştırır ve e-posta konularını ve başlıklarını izlemeyi kolaylaştırır.
Üstten yanıtlama yapmayın (Do not top-post)
Bir mesaja yanıt verirseniz, üstten yanıtlama (top-posting) kullanmayın. Üstten yanıtlama, yeni metni e-postanın en üstüne yazdığınız ve önceki alıntılanan e-posta görüşmesini aşağıya eklediğiniz durumdur. Bu, kullanıcıların e-postayı doğru bir şekilde anlamak için geriye doğru bir sırayla okumasına neden olur.
Üstten yanıtlamanın bu kadar kötü olmasının nedeni budur:
C: Çünkü insanların normalde metni okuma sırasını karıştırıyor.
S: Üstten yanıtlama neden bu kadar kötü bir şey?
C: Üstten yanıtlama.
S: E-postadaki en sinir bozucu şey nedir?
Okuma sırasının karışmasının yanı sıra (özellikle birisi zorunlu alttan yanıtlama stilini kullanarak yanıt verdiğinde bir konu içinde karıştığında), orijinal e-postanın yalnızca belirli kısımlarını alıntılamayı da imkansız hale getirir.
Bir e-postaya yanıt verdiğinizde, e-posta istemcisinin önceki e-postayı alıntılanmış olarak eklemesine izin verirsiniz. Ardından imleci e-postanın ilk satırına koyarsınız ve e-postanın içinde aşağı doğru ilerleyerek, yorumlarınız için bağlam oluşturmayan alıntıların tüm kısımlarını silersiniz. Bir yorum eklemek istediğinizde, yorumunuzla ilgili alıntılardan hemen sonra satır içi (inline) olarak yaparsınız. Sonra tekrar aşağı doğru devam edersiniz.
Alıntıların çoğu kaldırıldığında ve kendi sözlerinizi eklediğinizde işiniz bitmiş demektir.
HTML e-postalar için değildir
Lütfen o HTML kodlu mesajları kapatın. O komik e-postaların hepsini arkadaşlarınıza gönderebilirsiniz. Biz düz metin (plain text) e-postalarla konuşuruz.
Alıntılama
Mümkün olduğunca az alıntı yapın. Sadece dışarıda bırakamayacağınız bağlamı sağlayacak kadar. Uzun bir açıklama burada bulunabilir.
Özet (Digest)
Abonelerin e-posta listelerinin özet (digest) sürümüne abone olmalarına izin veriyoruz. Bir özet, tek bir e-postada toplanmış e-postaların bir koleksiyonudur.
Özet olarak gönderilen bir e-postaya yanıt vermeye karar verirseniz, normal şekilde abone olamıyorsanız MUTLAKA göz önünde bulundurmanız gereken iki şey vardır:
Yanıtlamak istediğiniz e-posta ile ilgili olmayan tüm e-postaları ve sohbetleri kesin.
Konu adını mantıklı ve konuyla ilgili bir şeyle, tercihen yanıtlamak istediğiniz tek e-postanın gerçek konusuyla değiştirin.
Lütfen sorunu nasıl çözdüğünüzü bize bildirin
Birçok insan listeye sorular gönderir, insanlar zamanlarının bir kısmını harcar ve bu sorulara iyi yanıtlar sağlamak için çaba gösterir.
Soruyu soran kişi sizseniz, ipuçlarından birinin sorununuzu çözüp çözmediği durumunda lütfen bir kez daha yanıt vermeyi düşünün. Yanıt yazanlar, iyi bir yanıt verdiklerini ve sorunu çözdüğünüzü bilmekten memnun olurlar. Çoğu zaman, soruyu soran kişiden bir daha haber alınamaz ve sorunun çözüldüğü için mi yoksa belki de sorun çözülemez olduğu için mi gittiğini asla bilemeyiz.
Çözümün yayınlanması, aynı sorun(lar)ı yaşayan diğer kullanıcılara da yardımcı olur. Önerilen düzeltmelerin en az bir kişiye gerçekten yardımcı olduğunu (muhtemelen web arşivlerinde) görürler.
E-posta listeleri
En önemli e-posta listelerinden bazıları şunlardır…
curl-users
curl komut satırı aracının kullanıcıları ve geliştiricileri için ana e-posta listesi; curl kavramları, komut satırı seçenekleri, curl'ün konuşabileceği protokoller ve hatta ilgili araçlar hakkında sorular ve yardım içindir. libcurl, curl'ün çoğunu çalıştıran motor olduğu için, geliştirme sorunlarını veya daha gelişmiş hata düzeltme tartışmalarını bunun yerine curl-library'e taşıma eğilimindeyiz.
Bkz. curl-users
curl-library
Ana geliştirme listesi ve aynı zamanda libcurl kullanıcıları içindir. libcurl'ün uygulamalarda nasıl kullanılacağını ve libcurl'ün geliştirilmesini tartışıyoruz. libcurl davranışı, hata ayıklama ve belgeleme sorunları vb. hakkındaki sorular.
Bkz. curl-library
curl-announce
Bu e-posta listesi yalnızca yeni sürümler ve güvenlik sorunları hakkında duyurular alır — başka bir şey değil. Bu, projeden daha gündelik bir bilgi akışı isteyenler içindir.
Bkz. curl-announce
Hata bildirme
Geliştirme ekibi çok fazla test yapar. Tüm kodu çalıştırmak ve her şeyin beklendiği gibi çalıştığından emin olmak için her gün sayısız platformda sık sık çalıştırılan koca bir test takımımız (test suite) var.
Yine de, işlerin olması gerektiği gibi çalışmadığı zamanlar olur ve insanların bunu bize bildirmesine güveniriz.
Hata (bug) bir sorundur
Herhangi bir sorun bir hata (bug) olarak kabul edilebilir. Kılavuzda bir şeyi anlamanızı engelleyen garip bir ifade bir hatadır. Birden fazla seçeneği birleştirmenin şaşırtıcı bir yan etkisi bir hata olabilir — ya da belki daha iyi belgelenmesi gerekir? Belki de seçenek hiç beklediğiniz şeyi yapmıyordur? Bu bir sorundur ve düzeltmemiz gerekir.
Düzeltilmesi için sorunların bilinmesi gerekir
Bu kulağa kolay ve karmaşık olmayan gelebilir ancak bizim ve diğer projelerde temel bir gerçektir. Sırf eski bir proje olması ve binlerce kullanıcısı olması, geliştirme ekibinin az önce tökezlediğiniz sorundan haberdar olduğu anlamına gelmez. Belki kullanıcılar ayrıntılara sizin kadar dikkat etmemiştir, ya da belki de başka hiç kimse için tetiklenmemiştir.
Sorun yaşayan kullanıcıların bunları bildirmesine güveniyoruz. Bunları düzeltebilmemiz için varlıklarından haberdar olmamız gerekir.
Sorunları düzeltme
Yazılım mühendisliği, büyük ölçüde, sorunları düzeltmekle ilgilidir. Bir sorunu düzeltmek için bir geliştiricinin onu nasıl tekrarlayacağını anlaması gerekir ve bunu yapmak için hangi koşullar kümesinin sorunu tetiklediğinin söylenmesi gerekir.
İyi bir hata raporu
İyi bir rapor, ne olduğunu ve ne olacağını düşündüğünüzü açıklar. Bize kullandığınız farklı bileşenlerin tam olarak hangi sürümlerini kullandığınızı söyleyin ve soruna ulaşmak için ne yaptığınızı adım adım anlatın.
Bir hata raporu gönderdikten sonra, geliştiricinin şüphelileri daraltabilmesi ve sorununuzun doğru bir şekilde konumlandırıldığından emin olabilmesi için takip soruları veya belki de çeşitli şeyleri denemeniz yönünde istekler olmasını bekleyebilirsiniz.
Gönderilen ve ardından gönderen tarafından terk edilen bir hata raporu, geliştirici onu anlamayı başaramazsa, yeniden üretemezse veya üzerinde çalışırken başka sorunlarla karşılaşırsa kapatılma riskiyle karşı karşıya kalır. Raporunuzu terk etmeyin.
curl hatalarını GitHub'daki curl hata takip sisteminde bildirin.
Test etme
Yazılımı kapsamlı ve düzgün bir şekilde test etmek çok iştir. Düzinelerce işletim sisteminde ve CPU mimarisinde çalışan, kendi hata kümelerine ve özelliklerin yorumlarına sahip sunucu uygulamalarıyla çalışan yazılımları test etmek daha da fazla iştir.
curl projesi, mevcut tüm test durumları üzerinde yineleme yapan, her testi çalıştıran ve sonucun doğru olduğunu ve bellek sızıntısı veya protokol katmanında şüpheli bir şey gibi başka bir sorunun olmadığını doğrulayan bir test takımına sahiptir.
Test takımı, curl'ü kendiniz derledikten sonra çalıştırılmak üzere tasarlanmıştır. Ayrıca, en son commit'lerin test edildiğinden emin olmak için test takımını günde birkaç kez otomatik olarak çalıştırarak yardımcı olan bir dizi gönüllü de vardır. Bu sayede en kötü kusurları, tanıtılmalarından kısa bir süre sonra keşfederiz.
Her şeyi test etmiyoruz ve test etmeye çalıştığımızda bile her zaman aradan sızan ince hatalar oluyor, bazıları ancak yıllar sonra keşfediliyor.
Farklı sistemlerin doğası ve İnternet'teki garip kullanım durumları nedeniyle, eninde sonunda en iyi testlerin bazıları, kullanıcılar kodu kendi kullanım durumlarını gerçekleştirmek için çalıştırdıklarında yapılır.
Test takımıyla ilgili bir başka sınırlayıcı faktör de, test kurulumunun kendisinin curl ve libcurl'den daha az taşınabilir olmasıdır, bu nedenle aslında curl'ün iyi çalıştığı ancak test takımının hiç çalışamadığı platformlar vardır.
Ticari destek
curl ve libcurl için ticari destek, wolfSSL şirketi aracılığıyla Daniel Stenberg (curl kurucusu) tarafından sunulmaktadır ve sağlanmaktadır.
wolfSSL, curl'ün ustaları tarafından yapılan curl üzerinde dünya çapında ticari destek sunar. wolfSSL; curl özelleştirmesi, yeni işletim sistemlerine bağlantı noktaları, özellik geliştirme, yama bakımı, hata düzeltme, üretime alma (upstreaming), eğitim, libcurl API kullanımının kod incelemeleri, curl kullanımınızın güvenlik taraması ve daha fazlasını gerçekleştirir - temelden tam 7/24 desteğe kadar çeşitli farklı destek seçenekleriyle. Garantili yanıt süreleriyle.
İletişim bilgileri için destek sayfasına bakın.
Sürümler
curl projesinde bir sürüm, kod deposunun (repository) master dalındaki (branch) tüm kaynak kodunu paketlemek, paketi imzalamak, kod deposundaki noktayı etiketlemek (tag) ve ardından dünyanın indirebilmesi için web sitesine koymak anlamına gelir.
curl'ün çalışabileceği tüm platformlar için tek bir kaynak kodu arşividir. Hem curl hem de libcurl için tek ve biricik pakettir.
Projeden asla herhangi bir curl veya libcurl ikili dosyası (binaries) göndermeyiz, tek istisna: Windows kullanıcıları için derlenmiş resmi curl ikili dosyalarını barındırırız. İşletim sistemleriyle veya diğer indirme sitelerinde sağlanan diğer tüm paketlenmiş ikili dosyalar, proje dışındaki nazik gönüllüler tarafından yapılır.
Birkaç yıl öncesinden itibaren, sürümlerimizi sekiz haftalık bir döngüde yapmaya çabalıyoruz ve gerçekten ciddi ve acil bir sorun ortaya çıkmadıkça bu programa sadık kalıyoruz. Bir Çarşamba günü yayınlıyoruz ve ardından sekiz hafta sonra tekrar bir Çarşamba günü ve bu böyle devam ediyor. Durmaksızın.
Her sürüm için depodaki kaynak kodunu curl sürüm numarasıyla etiketliyoruz ve değişiklik günlüğünü (changelog) güncelliyoruz.
Şubat 2025'e kadar toplam 265 sürüm yaptık. Tüm sürüm geçmişi ve değişiklik günlüğü curl sürüm günlüğümüzde (release log) mevcuttur.
Sürüm döngüsü

Günlük anlık görüntüler (snapshots)
Kaynak koda yapılan her bir değişiklik işlenir (committed) ve kaynak kod deposuna itilir (pushed). Bu depo github.com'da barındırılmaktadır ve bugünlerde git kullanmaktadır (ancak her zaman böyle değildi). Depodan curl derlerken, oluşturmanız ve ayarlamanız gereken birkaç şey vardır, bu da bazen insanların bazı sorunlar veya sadece sürtünme yaşamasına neden olur. Buna yardımcı olmak için günlük anlık görüntüler (snapshots) sağlıyoruz.
Günlük anlık görüntüler, sanki o noktada bir sürüm yapılmış gibi günlük olarak oluşturulur (zekice isimlendirme, değil mi?). Tüm kaynak kodunu ve normalde bir sürümün parçası olan tüm dosyaları içeren bir paket üretir ve ilgili kişilerin test etmek, denemek veya her neyse en son kodu almasına izin vermek için bu özel yere yükler.
Anlık görüntüler silinene kadar yaklaşık 20 gün saklanır.
Güvenlik
Güvenlik, biz curl projesi için birincil endişe kaynağıdır. Bunu ciddiye alıyoruz ve tüm protokollerin ve ilgili kodun güvenli ve emniyetli uygulamalarını sağlamak için çok çalışıyoruz. Güvenlikle ilgili bir sorun veya sadece şüphelenilen bir sorun hakkında bilgi alır almaz, onunla ilgileniriz ve bir sonraki bekleyen sürümden en geç olmamak üzere bir düzeltme ve güvenlik bildirimi sağlamaya çalışırız.
Sorumlu bir açıklama politikası (responsible disclosure policy) kullanıyoruz, yani güvenlik düzeltmeleri üzerinde halka açık olmayan bir şekilde tartışmayı ve çalışmayı tercih ediyoruz ve sorunu ve düzeltmeyi dünyaya duyurmadan birkaç gün önce openwall.org listesindeki satıcıları uyarıyoruz. Bu, kötü niyetli kişilerin düzeltilmiş bir sürüm dağıtılana kadar bir sorundan yararlanabilecekleri süreyi kısaltmak amacıyla yapılır.
Geçmiş güvenlik sorunları
Yıllar boyunca güvenlikle ilgili sorunlardan payımıza düşeni aldık. Kullanıcılara yardımcı olmak için listelenen ve açıkça belirtilen tüm ayrıntılarla her sorunu belgelemek için çok çalışıyoruz. curl kullanıcıları, kendi curl sürümlerinin ve kullanım durumlarının hangi sorunlara karşı savunmasız olduğunu anlayabilmelidir.
Buna yardımcı olmak için, tüm güvenlik açıklarının hangi curl sürümlerini nasıl etkilediğini gösteren bu şelale grafiğini (waterfall chart) sunuyoruz ve bu projenin doğuşundan bu yana bilinen tüm güvenlik sorunlarının bu tam listesine sahibiz.
Arka kapılar (Backdoors) ve tedarik zinciri riskleri
Dünyanın her yerinde milyarlarca kurulumda ve sayısız farklı ortamda kurulu ve çalışan libcurl ile, bir yerlere arka kapı (backdoor) yerleştirmek isteyen biri için ideal bir hedef olduğunun farkındayız.
Yeni veya eski bir bakıcı (maintainer), herhangi bir noktada masum ve iyi niyetli görünen ancak gizli kötü niyetli bir amacı olan bir değişiklik önerebilir.
Bu tür riskleri azaltmak için yerleşik prosedürler ve teknikler uyguluyoruz:
- GitHub. curl projesi, 2010'dan beri ana kaynak kod git deposu olarak https://github.com/curl/curl kullanmaktadır. Erişim güvenliğini yapılandırmamıza göre sağlamak için onların barındırmasına güveniyoruz.
- 2FA (İki Faktörlü Doğrulama) gerekli. Saldırganların kimliklerini taklit etme ve kaynak kod değişikliklerini itmek (push) için kimlik bilgilerini kullanma riskini azaltmak amacıyla, git'e itme (push) erişimi olan tüm bakıcıların iki faktörlü doğrulamayı etkinleştirmesini zorunlu kılıyoruz. GitHub'ın 2FA kurulumuna güveniyoruz.
- İncelemeler (Reviews). Projeye dahil edilmek üzere önerilen her katkı bir bakıcı tarafından incelenir. Tüm değişiklikler, ilgili tüm tarafların katılmasına izin vermek için her zaman halka açık olarak yapılır. Davet gerekmez. Tüm değişiklikler kabul edilmeden önce çok sayıda araç tarafından otomatik olarak kontrol edilir, test edilir ve taranır.
- Okunabilir kod. Kod stilimizi takip eden okunabilir koda inanıyoruz. Okuması kolaysa hata ayıklaması da kolaydır. Kodun okunması zorsa, okunması kolay olana kadar geliştirilmelidir. Okunması kolay kodla, kötü niyetli yükleri kaçırmak veya hain işlevleri gizlemek dayanılmaz derecede zordur.
- Testler. Sürekli büyüyen büyük bir test takımımız (test suite) var ve mevcut testleri bozan değişiklikleri kabul etmiyoruz ve yeni işlevselliğin yeni işlevsellik için yeni testler getirmesi gerekiyor. Mevcut işlevselliğin etkilenmediğinden emin olmak için önerilen her değişiklikte birkaç yüz bin test çalıştırıyoruz. Buna fuzzer'lar, statik kod analizörleri, hata enjektörleri ve daha fazlası dahildir.
- İkili (binary) blob yok. Sürüm kontrolünde, git deposunda saklanan tüm dosyalar okunabilir veya aksi takdirde küçük ve belgelenmiştir. Herhangi bir gizli şifrelenmiş yük için hiçbir yerde yer yoktur. İkili dosyaları tespit etmek için her değişiklikte tüm dosyalarda bir tarayıcı çalıştırıyoruz ve ikili görünmeye devam etmesi gereken birkaç dosya, bir sağlama toplamına (checksum) karşı manuel olarak inceleniyor ve doğrulanıyor.
- Tekrarlanabilir derlemeler (Reproducible builds). curl sürümleri, curl web sitesinde (https://curl.se) barındırılan tarball'lar (arşiv dosyaları) olarak gönderilir. Yayın derlemelerimizi kolayca yeniden üretmek isteyen herkesin aynı görüntüleri oluşturmasına izin vermek için belgeler, docker kurulumları ve yapılandırmaları vb. sağlıyoruz - gönderdiğimiz şeyin yalnızca git deposundan alınan içerikler artı diğer doğru ve uygun şekilde oluşturulmuş içerikler olduğunu kanıtlıyoruz.
- İmzalı commit'ler. Son commit'lerin %90'ından fazlası - hepsi değil - kaynağı kanıtlamaya yardımcı olmak için imzalandı. Commit'leri imzalamak, işleyenler (committers) için henüz zorunlu bir gereklilik değildir ancak zamanla payı kademeli olarak artırmayı ve yakında zorunlu hale getirmeyi umuyoruz.
- İmzalı sürümler. Her sürüm, yüklenen her tarball Daniel tarafından imzalanır. Bu, dosyaların üretildiklerinden beri kurcalanmadığını kanıtlamaya yardımcı olur. Nispeten küçük ekstra koruma için ek karmaşıklık nedeniyle bunları birden fazla kişi tarafından imzalamamayı tercih ettik.
- İmzalı etiketler (tags). Her sürüm, karşılık gelen bir imzalı etiketin ayarlandığı git ağacının tam durumundan oluşturulur. Sürüm etiketinin adı, sürüm sürümüyle aynıdır.
- Tüm güvenlik açıklarını hızla düzeltin. Bir güvenlik açığı raporu aldığımızda, bir sonraki bekleyen sürümde bir düzeltme oluştururuz ve göndeririz. Bazen daha önce planlanandan daha erken. Bir sürüm döngüsünden daha uzun sürmesi son derece nadirdir, ancak doğruluk ve kesinlik adına, doğru olanı elde etmek için araştırmaya zaman ayırma hakkımızı saklı tutarız. Düzeltilen her güvenlik açığıyla birlikte, sorunu ortaya çıkaran tam commit, kullanıcılar için öneriler ve daha fazlasını içeren kusurun ayrıntılı bir açıklamasını yayınlıyoruz. Ayrıca, güvenlik tavsiyeleri dünyaya duyurulur.
Güven
Bir yazılımın dünyayı fethetmesi için güvenilir olması gerekir. Daha fazla güven oluşturmak güven gerektirir ve eğer temelde çatlaklar olduğu kanıtlanırsa her şey çok hızlı bir şekilde yıkılabilir.
curl projesinde kullanıcılarımız için güveni birkaç farklı yolla inşa ediyoruz:
-
Her konuda tamamen şeffafız. Her karar, her tartışma, her kod satırı ve düşünülen her kod değişikliği her zaman halka açıktır ve açık bir şekilde yapılır.
-
Güvenilir kod yazmak için çok çalışıyoruz. Test durumları yazıyoruz, kodu inceliyoruz, en iyi uygulamaları belgeliyoruz ve kodu tutarlı tutmamıza yardımcı olan bir stil kılavuzumuz var.
-
Sözlere ve garantilere mümkün olduğunca sadık kalıyoruz. API'leri bozmuyoruz ve eski sistemler için desteği terk etmiyoruz.
-
Güvenlik son derece önemlidir ve bildirilen her olayı ciddiye alıyoruz ve bilinen tüm sorunları düzeltmemiz gerektiğini ve bunu sorumlu bir şekilde yapmamız gerektiğini biliyoruz. Kullanıcılarımızı tehlikeye atmamak için elimizden geleni yapıyoruz.
-
Yetişkinler gibi davranıyoruz. Aptallık edebiliriz ve şakalaşabiliriz, ancak bunu sorumlu bir şekilde yaparız ve Davranış Kurallarımıza (Code of Conduct) uyarız. Herkes davranmamız konusunda bize güvenebilmelidir.
Davranış Kuralları (Code of Conduct)
Bu projenin katkıda bulunanları ve bakıcıları (maintainers) olarak, sorunları bildirerek, özellik istekleri göndererek, belgeleri güncelleyerek, pull request'ler (çekme istekleri) veya yamalar sunarak ve diğer faaliyetlerle katkıda bulunan tüm insanlara saygı göstermeyi taahhüt ediyoruz.
Deneyim seviyesi, cinsiyet, cinsiyet kimliği ve ifadesi, cinsel yönelim, engellilik, kişisel görünüm, vücut ölçüsü, ırk, etnik köken, yaş veya din ne olursa olsun, bu projeye katılımı herkes için tacizden arındırılmış bir deneyim haline getirmeye kararlıyız.
Katılımcıların kabul edilemez davranış örnekleri arasında cinsel dil veya imgelerin kullanımı, aşağılayıcı yorumlar veya kişisel saldırılar, trolleme, kamuya açık veya özel taciz, hakaret veya diğer profesyonel olmayan davranışlar yer alır.
Proje bakıcıları, bu Davranış Kurallarına uymayan yorumları, commit'leri, kodları, wiki düzenlemelerini, sorunları ve diğer katkıları kaldırma, düzenleme veya reddetme hakkına ve sorumluluğuna sahiptir. Davranış Kurallarına uymayan proje bakıcıları proje ekibinden çıkarılabilir.
Bu davranış kuralları, hem proje alanlarında hem de bir kişi projeyi veya topluluğunu temsil ettiğinde kamusal alanlarda geçerlidir.
İstismar edici, taciz edici veya başka bir şekilde kabul edilemez davranış örnekleri, bir sorun (issue) açılarak veya proje bakıcılarından biri veya birkaçıyla iletişime geçilerek bildirilebilir.
Geliştirme
Herkesi curl ve libcurl'ün geliştirilmesine katılmaya teşvik ediyoruz. Alabileceğimiz her türlü yardımı takdir ediyoruz ve bu projenin ana kısmı kaynak kodu olsa da, sadece kodlama ve hata ayıklama yardımından çok daha fazlasına ihtiyaç duyuluyor ve faydalı oluyor.
Her şeyi açıkta, tercihen e-posta listelerinde geliştiriyor ve tartışıyoruz.
GitHub'da kaynak kodu
curl ve libcurl'ün kaynak kodu da sağlanmış ve halka açık olarak yayınlanmıştır ve her sürüm için ana web sitesine (main web site) yüklenmeye devam etmektedir.
Mart 2010'dan bu yana, curl kaynak kodu deposu (repository) github.com üzerinde barındırılmaktadır. Oradaki değişikliklerle güncel kalarak, günlük geliştirmemizi yakından takip edebilirsiniz.
Geliştirme ekibi
Daniel Stenberg, projenin kurucusu ve kendini ilan eden lideridir. Projeye katılan veya katkıda bulunan herkes daha sonraki bir noktada gelmiştir. Bazı katılımcılar bir süre çalıştı ve sonra tekrar ayrıldı. Çoğu katılımcı sadece hatasını düzeltmek veya özelliğini birleştirmek (merge) veya benzeri bir şey için kısa bir süre ortalıkta dolaşır. İsimlerini bildiğimiz tüm katılımcıları sayarsak, 3.300'den fazla kişiden yardım aldık.
1.300'den fazla kişi, kaynak kod deposuna birleştirilen commit'leri yazmıştır. Elbette, bu yazarların birçoğu şimdiye kadar sadece tek bir commit ile katkıda bulunmuştur.
Projeye katılmak için yapılması gereken resmi bir üyelik veya herhangi bir şey yoktur. İletişime veya geliştirmeye katılırsanız, projenin bir parçasısınız demektir. Her katılımcı ne kadar ve hangi yollarla katılacağına kendisi karar verir.
Projede tek bir yıl içinde on veya daha fazla commit yapan kişilerin tam listesi alfabetik sıraya göre şöyledir:
Alessandro Ghedini, Ben Greear, Benoit Neil, Bill Hoffman, Bill Nagel, Björn Stenberg, Brad Hards, Christian Schmitz, Dan Fandrich, Daniel Gustafsson, Daniel Stenberg, Dominick Meglio, Emanuele Torre, Emil Engler, Evgeny Grin, Fabian Frank, Fabian Keil, Gergely Nagy, Gisle Vanem, Guenter Knauf, Harry Sintonen, Isaac Boukris, Jacob Hoffman-Andrews, Jakub Zakrzewski, James Housley, Jan Venekamp, Jay Satiro, Jiri Hruska, Joe Mason, Johannes Schindelin, Josh Soref, Julien Chaffraix, Kamil Dudka, Marc Hoersken, Marcel Raad, Mark Salisbury, Marty Kuhrt, Max Dymond, Michael Kaufmann, Michael Osipov, Michal Marek, Michał Antoniak, Nicholas Nethercote, Nick Zitzmann, Nikos Mavrogiannopoulos, Orgad Shaneh, Patrick Monnerat, Peter Wu, Philip Heiduck, Rikard Falkeborn, Ruslan Baratov, Ryan Schmidt, Simon Warta, Stefan Eissing, Steinar H. Gunderson, Sterling Hughes, Steve Holme, Svyatoslav Mishyn, Tal Regev, Tatsuhiro Tsujikawa, Tor Arntsen, Viktor Szakats, Yang Tse
curl kullanıcıları

Dünyada yirmi milyardan fazla curl kurulumu olduğunu tahmin ediyoruz. Söylemesi iyi bir söz ama gerçekte, elbette elimizde bu kadar kesin bir sayı yok. Sadece gözlemlere ve eğilimlere dayanarak tahmin ediyor ve varsayımda bulunuyoruz. Ayrıca bu, tam olarak neyi "bir kurulum" olarak kabul ettiğimize de bağlıdır. Hadi biraz açalım.
Açık Kaynak
Projenin Açık Kaynak olması ve özgürce lisanslanması, hemen hemen herkesin curl'ü kaynak formatında veya ikili (binary) bir formda yerleşik olarak yeniden dağıtabileceği anlamına gelir.
İndirmeleri sayma
curl komut satırı aracı ve libcurl kütüphanesi, çoğu işletim sistemi için curl web sitesi aracılığıyla indirilebilir, birçoğuna üçüncü taraf yükleyiciler aracılığıyla sağlanır ve hatta daha fazla işletim sistemiyle varsayılan olarak yüklü gelir. Bu, curl web sitesinden yapılan indirmeleri saymayı bir ölçüm aracı olarak tamamen uygunsuz hale getirir.
Kullanıcıları bulma
Yani, indirmeleri sayamıyoruz ve herkes onu yeniden dağıtabilir; ve kimse bize curl kullandığını söylemek zorunda değil. Sayıları nasıl belirleyebiliriz? Kullanıcıları nasıl bulabiliriz? Cevap, makul bir doğruluk seviyesiyle gerçekten yapamayacağımızdır.
Bunun yerine tanık raporlarına, ikincil kanıtlara (circumstantial evidence), İnternet'teki bulgulara, curl'den bahseden ara sıra görülen "hakkında kutusu" veya lisans sözleşmesine ya da yazarların yardım isteyip kullanımlarından bahsetmelerine güveniyoruz.
curl lisansı, kullanıcıların bunu bir yerde, örneğin belgelerde tekrarlamaları gerektiğini söyler, ancak çoğu durumda bunu bulmamız kolay değildir ve küçük lisans gereksinimine uymamaya karar verirlerse bu konuda yapabileceğimiz bir şey de yoktur.
Komut satırı aracı kullanıcıları
Komut satırı aracı curl, dünya çapındaki programcılar tarafından kabuk (shell) ve toplu iş (batch) komut dosyalarında (scripts), sunucularda hata ayıklamak ve bir şeyleri test etmek için yaygın olarak kullanılır. Her gün milyonlarca kişi tarafından kullanıldığına şüphe yok.
Gömülü kütüphane
libcurl, projemizin gerçekten büyük bir kullanıcı hacmine ulaşmasını sağlayan şeydir. İstemci taraflı dosya transfer yeteneklerini uygulamanıza hızlı ve kolay bir şekilde dahil etme yeteneği birçok kullanıcı için arzu edilir ve ardından libcurl'ün mükemmel taşınabilirliği de yardımcı olur: Çok çeşitli platformlarda aşağı yukarı aynı uygulamayı yazabilir ve transferler için libcurl'ü kullanmaya devam edebilirsiniz.
libcurl'ün C ile yazılmış olması ve hiç veya çok az sayıda zorunlu bağımlılığa sahip olması, gömülü sistemlerde kullanılmasına da yardımcı olur.
libcurl; akıllı telefon işletim sistemlerinde, araç bilgi-eğlence sistemlerinde, televizyon setlerinde, set üstü kutularda (set-top boxes), Blu-Ray oynatıcılar ve üst düzey alıcılar gibi ses ve video ekipmanlarında popüler olarak kullanılır. Genellikle ev yönlendiricilerinde ve yazıcılarda kullanılır.
Çok sayıda en çok satan oyun da, Windows ve oyun konsollarında libcurl kullanıyor.

Web sitesi arka uçlarında (backends)
PHP için libcurl bağlayıcısı (binding), libcurl'ün gerçekten tutulması ve yaygın olarak kullanılması için ilk bağlayıcılardan biriydi, hatta belki de ilkiydi. Hızla PHP kullanıcılarının veri transfer etmesi için varsayılan bir yol olarak benimsendi. PHP artık on yılı aşkın bir süredir bu konumda ve İnternet'te oldukça popüler bir teknoloji olduğu ortaya çıktı (son rakamlar İnternet'teki tüm sitelerin yaklaşık dörtte birinin PHP kullandığını gösteriyor).
Gerçekten yüksek talep gören birkaç site PHP kullanıyor ve arka uçta libcurl kullanıyor. Facebook ve Yahoo bu tür iki sitedir.
Ünlü kullanıcılar
Hiçbir şey kullanıcıları bize hizmetlerinde veya ürünlerinde curl veya libcurl kullandıklarını söylemeye zorlamaz. Genellikle bunu tesadüfen, diyalogları, belgeleri ve lisans sözleşmelerini okuyarak öğreniriz. Elbette bazı şirketler de bize açıkça söyler.
Web sitemizde, projenin ürünlerini "ticari ortamlarda" kullanan kullanıcıların şirket ve ürün adlarını toplardık. Bunu çoğunlukla diğer büyük markalara hava atmak için yaptık; eğer bu diğer adamlar bize bağlı ürünler geliştirebiliyorsa, belki siz de yapabilirsiniz?
Şirketler listesi yüzlerce isim içeriyor, ancak daha büyük veya daha iyi bilinen markalardan bazılarını çıkarırsak, işte elbette sadece küçük bir seçim olan oldukça iyi bir liste:
Adobe, Altera, AOL, Apple, AT&T, BBC, Blackberry, BMW, Bosch, Broadcom, Chevrolet, Cisco, Comcast, Facebook, Google, Hitachi, Honeywell, HP, Huawei, HTC, IBM, Intel, LG, Mazda, Mercedes-Benz, Microsoft, Motorola, NASA, Netflix, Nintendo, Oracle, Panasonic, Philips, Pioneer, RBS, Samsung, SanDisk, SAP, SAS Institute, SEB, Sharp, Siemens, Sony, Spotify, Sun, Swisscom, Tomtom, Toshiba, VMware, Xilinx, Yahoo, Yamaha.
curl kullanan ünlü yüksek hacimli uygulamalar
Google Youtube uygulaması, Google Photos uygulaması, Spotify, Instagram, Skype (Android'de), iOS ile birlikte gelir, Grand Theft Auto V, Fortnite.
Gelecek

curl'ün geleceğinde, bildirilen hatalarda, geliştirme hızında veya İnternet protokollerinin nasıl geliştirildiği veya güncellendiği konusunda görünürde bir yavaşlama yok.
Daha fazla protokol desteğini, halihazırda desteklenen protokoller içinde daha fazla özellik desteğini ve kullanıcıların transferleri daha iyi ve daha hızlı yapmalarını sağlamak için libcurl için daha fazla ve daha iyi API'leri dört gözle bekliyoruz.
Proje, gelecekte üzerinde çalışabileceğimiz bir dizi fikri barındıran bir TODO (YAPILACAKLAR) dosyasını gayri resmi olarak korur. Ayrıca, düzeltmek istediğimiz bilinen sorunların bir listesini içeren bir KNOWN_BUGS (BİLİNEN_HATALAR) belgesi tutar.
Aktif geliştiricilerden bazılarının kısa vadede üzerinde çalışacaklarını düşündükleri bazı planları açıklayan bir ROADMAP (YOL HARİTASI) belgesi var. Elbette, her zaman buna uyacağımızı vaat edemeyiz.
Hata düzeltmeleri veya yeni özellikler olsun, nein yapılmasını istiyorlarsa ona katılıp üzerinde çalışacak geliştiricilere son derece bağımlıyız.
Ağ ve protokoller
İşin içine dalmadan ve işleri halletmek için curl'ü nasıl kullanacağımız hakkında konuşmadan önce, kolay bir genel bakış sağlamak için basitleştirmeler ve bazı küçük kısayollar kullanarak tüm bu ağ oluşturmanın ne olduğuna ve nasıl çalıştığına bir göz atalım.
Temel bilgiler, curl perspektifinden ağın ne olduğuna dair basit bir resim çizmeyi amaçlayan basitleştirilmiş ağ oluşturma bölümünde ve tam olarak bir "protokolün" ne olduğunu ve nasıl çalıştığını açıklayan protokoller bölümünde yer almaktadır.
Basitleştirilmiş ağ oluşturma
Ağ oluşturma, İnternet üzerindeki iki uç nokta (endpoint) arasında iletişim kurmak anlamına gelir. İnternet, her biri kendi bireysel adreslerini (IP adresleri olarak adlandırılır) kullanan birbirine bağlı bir grup makinedir (gerçekte bilgisayarlar). Her makinenin sahip olduğu adresler farklı türlerde olabilir ve makinelerin geçici adresleri bile olabilir. Bu bilgisayarlara ana bilgisayarlar (host) da denir.
İstemci ve sunucu (Client and Server)
Önünde oturduğunuz bilgisayar, tablet veya telefon genellikle istemci (client) olarak adlandırılır ve verileri takas etmek istediğiniz dışarıdaki makineye ise sunucu (server) denir. İstemci ve sunucu arasındaki temel fark, oynadıkları rollerdir. Rollerin sonraki bir işlemde tersine çevrilmesini engelleyen hiçbir şey yoktur.
Sunucu istemciyle iletişim kuramayacağı, ancak istemci sunucuyla iletişim kurabileceği için bir transfer girişimi her zaman istemci tarafından yapılır.
Hangi makine
Biz bir istemci olarak dışarıdaki makinelerden birinden veya birine (bir sunucu) bir transfer başlatmak istediğimizde, genellikle IP adreslerini bilmeyiz, bunun yerine genellikle ismini biliriz. İletişim kurulacak makinenin adı genellikle curl veya bir tarayıcı gibi araçları kullandığımızda çalıştığımız URL'e gömülüdür.
http://example.com/index.html gibi bir URL kullanabiliriz, bu da istemcinin example.com adlı ana bilgisayara (host) bağlanıp onunla iletişim kurduğu anlamına gelir.
Ana bilgisayar adı çözümleme (Hostname resolving)
İstemci ana bilgisayar adını bildiğinde, onunla iletişim kurabilmek için o ada sahip ana bilgisayarın hangi IP adreslerine sahip olduğunu bulması gerekir.
Adı bir IP adresine dönüştürmeye 'isim çözümleme' (name resolving) denir. Ad, bir veya bir dizi adrese çözümlenir. Bu genellikle bir DNS sunucusu tarafından yapılır; DNS, adları adreslere dönüştürebilen büyük bir arama tablosu gibidir—gerçekten de İnternet'teki tüm adlar. Bilgisayar normalde ağ kurulumunun bir parçası olduğu için DNS sunucusunu çalıştıran bilgisayarın adresini zaten bilir.
Bu nedenle ağ istemcisi DNS sunucusuna sorar: Merhaba, lütfen bana example.com için tüm adresleri ver. DNS sunucusu bir adres listesiyle yanıt verir. Veya yazım hataları durumunda, adın mevcut olmadığı yanıtını verebilir.
Bir bağlantı kurun
İletişim kurmak istediği ana bilgisayar için bir veya daha fazla IP adresiyle istemci, bir bağlantı isteği (connect request) gönderir. Oluşturmak istediği bağlantıya TCP (İletim Kontrol Protokolü) veya QUIC bağlantısı denir; bu, iki bilgisayar arasında görünmez bir ip bağlamak gibidir. Kurulduktan sonra ip, her iki yönde de bir veri akışı göndermek için kullanılabilir.
İstemci, ana bilgisayar için birden fazla adres aldıysa, bağlanırken bu adres listesini dolaşır ve bir adres başarısız olursa bir sonrakine bağlanmayı dener; bu işlem bir adres çalışana veya hepsi başarısız olana kadar tekrarlanır.
Port numaralarına bağlanın
Uzak bir sunucuya TCP veya QUIC ile bağlanırken, bir istemci bunu hangi port numarasında yapacağını seçer. Bir port numarası, belirli bir hizmet için ayrılmış bir yerdir ve bu da aynı sunucunun aynı anda diğer port numaralarındaki diğer hizmetleri dinlemesine (listen) olanak tanır.
En yaygın protokollerin istemcilerin ve sunucuların kullandığı varsayılan port numaraları vardır. Örneğin, http://example.com/index.html URL'i kullanıldığında, bu URL, istemciye varsayılan olarak sunucudaki 80 numaralı TCP portunu denemesi gerektiğini söyleyen HTTP adlı bir şema (scheme) belirtir. URL bunun yerine HTTPS kullanıyorsa, varsayılan port numarası 443'tür.
URL, özel bir port numarası içerebilir. Bir port numarası belirtilmemişse, istemci URL'de kullanılan şema için varsayılan portu kullanır.
Güvenlik
Bir TCP bağlantısı kurulduktan sonra, birçok transfer, devam etmeden önce her iki tarafın da daha iyi bir güvenlik düzeyi üzerinde anlaşmasını gerektirir (örneğin HTTPS kullanılıyorsa); bu, TLS (Taşıma Katmanı Güvenliği) ile yapılır. Eğer öyleyse, istemci ve sunucu önce bir TLS el sıkışması (handshake) yapar ve ancak o başarılı olursa daha ileriye devam eder.
Bağlantı QUIC kullanılarak yapılıyorsa, TLS el sıkışması bağlanma aşamasında otomatik olarak yapılır.
Veri transferi
Bağlanan metaforik ip uzak bilgisayara takıldığında, iki makine arasında bir bağlantı (connection) kurulmuş olur. Bu bağlantı daha sonra veri alışverişi yapmak için kullanılabilir. Bu alışveriş, bir sonraki bölümde tartışıldığı gibi bir protokol kullanılarak yapılır.
Geleneksel olarak, indirme (download), verilerin bir sunucudan bir istemciye aktarılmasıdır; tersine, yükleme (upload), verilerin istemciden sunucuya gönderilmesidir. İstemci aşağıdadır; sunucu yukarıdadır.
Bağlantıyı Kes (Disconnect)
Tek bir transfer tamamlandığında, bağlantı amacına hizmet etmiş olabilir. O zaman ya daha sonraki transferler için yeniden kullanılabilir ya da bağlantısı kesilip kapatılabilir.
Protokoller
Verilerin gönderilmesini istemek için kullanılan dile — her iki yönde de — protokol denir. Protokol tam olarak sunucudan verilerin nasıl isteneceğini veya sunucuya veri geldiğini nasıl söyleyeceğini açıklar.
Protokoller genellikle her bir protokolün tam olarak nasıl çalıştığını açıklayan RFC belgelerini barındıran IETF (İnternet Mühendisliği Görev Gücü) tarafından tanımlanır: İstemcilerin ve sunucuların nasıl davranması gerektiği, ne göndereceği vb.
curl hangi protokolleri destekler?
curl, her iki yönde veya her iki yönde de veri transferine izin veren protokolleri destekler. Ayrıca genellikle kendimizi, curl transferi belirleyen girdi anahtarı olarak öncelikle URL'lerle (gerçekte URI'ler) çalıştığı için, RFC'de açıklanan bir URI formatına sahip olan veya en azından biraz yaygın olarak kullanılan protokollerle sınırlandırıyoruz.
En son curl (bu yazının yazıldığı sırada) şu protokolleri desteklemektedir:
DICT, FILE, FTP, FTPS, GOPHER, GOPHERS, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET, TFTP, WS, WSS
İşleri daha da karmaşık hale getirmek için, protokoller genellikle farklı sürümlerde veya çeşitlerde de bulunur.
Orada başka hangi protokoller var?
Dünya hem eski hem de yeni protokollerle doludur. Eski protokoller terk edilir ve düşürülür ve yenileri tanıtılır. Hiçbir zaman bir istikrar durumu yoktur ancak durum günden güne ve yıldan yıla değişir. Gelecekte yukarıdaki listeye eklenecek yeni protokoller olacağından ve halihazırda listelenen protokollerin yeni sürümleri olacağından emin olabilirsiniz.
Elbette, curl'ün henüz desteklemediği başka protokoller de mevcuttur. Genel curl paradigmalarına uyan daha fazla protokolü desteklemeye açığız, sadece geliştiricilerin onlar için gerekli kod ayarlamalarını yazmasına ihtiyacımız var.
Protokoller nasıl geliştirilir?
Hem mevcut protokollerin yeni sürümleri hem de tamamen yeni protokoller genellikle mevcut olanların yeterince iyi olmadığını düşünen kişiler veya ekipler tarafından geliştirilir. Onlarla ilgili bir şey, onları belirli bir kullanım durumu için uygun hale getirmez veya belki de işleri iyileştirmek için uygulanabilecek yeni bir fikir ortaya çıkmıştır.
Elbette, hiç kimsenin kendi arka bahçesinde tamamen kendi zevkine göre bir protokol geliştirmesini engelleyen hiçbir şey yoktur, ancak büyük protokoller genellikle oldukça erken bir aşamada IETF'e getirilir; burada tartışılır, iyileştirilir, tartışılır ve parlatılır ve sonunda, ideal olarak, yayınlanmış bir RFC belgesine dönüştürülür.
Yazılım geliştiricileri daha sonra RFC özelliklerini (spesifikasyonlarını) okur ve kodlarını bu belgelerdeki kelimelerin yorumlarına dayanarak dünyaya dağıtırlar. Bazen bazı özelliklerin çok farklı yorumlara konu olduğu veya bazen mühendislerin sadece tembel olduğu ve özelliklerdeki sağlam tavsiyeleri görmezden geldiği ve uymayan bir şey dağıttığı ortaya çıkar. Bu nedenle, diğer özellik uygulamalarıyla birlikte çalışan yazılım yazmak zor bir iş olabilir.
Protokoller ne kadar değişir?
Yazılım gibi, protokol özellikleri de sık sık güncellenir ve yeni protokol sürümleri oluşturulur.
Çoğu protokol, zamanla yeni uzantıların (extensions) ortaya çıkmasına izin veren bir miktar genişletilebilirlik sağlar; desteklenmesi mantıklı olan uzantılar.
Bir protokolün yorumu, özellik (spec) aynı kalsa bile bazen değişir.
Bu bölümde bahsedilen protokollerin hepsi Uygulama Protokolleri'dir (Application Protocols), yani TCP, UDP ve TLS gibi daha düşük seviyeli protokoller üzerinden aktarılırlar. Ayrıca kendileri de zamanla değişen, yeni özellikler alan ve saldırıya uğrayan protokollerdir; böylece güvenlik vb. ile başa çıkmanın yeni yolları curl'ü uyum sağlamaya ve değişmeye zorlar.
Standartlara uymak ve kimin haklı olduğu hakkında
Genellikle, belirli protokoller için verilerin nasıl gönderileceğini ve alınacağını bize söyleyen protokol özellikleri vardır. İzlediğimiz protokol özellikleri, IETF tarafından bir araya getirilen ve yayınlanan RFC'lerdir.
Bazı protokoller son bir RFC'de düzgün bir şekilde belgelenmemiştir; örneğin, uygulamamızın dayandığı bir Internet-draft (taslak) olan ve son mevcut olan bile olmayan SFTP gibi.
Bununla birlikte, protokoller iki tarafça konuşulur ve herhangi bir konuşmada olduğu gibi, bir şeyi anlamanın veya bir özellikteki verilen talimatları yorumlamanın iki tarafı vardır. Ayrıca, birçok ağ yazılımı, yazarların özelliğe çok dikkat etmemesiyle yazılır, bu nedenle bazı kısayollar alırlar veya belki de metni farklı yorumlamışlardır. Bazen hatalar ve bug'lar bile yazılımın özellik tarafından zorunlu kılınmayan ve bazen özelliklerde tamamen yasaklanan şekillerde davranmasına neden olur.
curl projesinde, yayınlanan özellikleri, başka bir şey öğrenene kadar nasıl hareket edileceğine dair kurallar olarak kullanırız. Popüler alternatif uygulamalar, özelliğin söylediğini düşündüğümüzden farklı davranıyorsa ve bu alternatif davranış büyük İnternet'te yaygın olarak işe yarıyorsa, o zaman muhtemelen adım değiştiririz ve bunun yerine diğerleri gibi davranmaya karar veririz. Bir sunucu, özelliği izlediğimizi düşündüğümüzde bizimle konuşmayı reddederse ancak kuralları çok az esnettiğimizde iyi çalışıyorsa, o zaman muhtemelen onları tam olarak o şekilde esnetiriz—eğer diğer uygulamalarla hala başarılı bir şekilde çalışabilirsek.
Sonuçta, bu kişisel bir karardır ve bir şartnamenin ve gerçek dünyanın uyuşmadığını düşündüğümüz her durumda tartışmaya açıktır.
En kötü durumlarda, uygulama geliştiricilerinin ve curl kullanıcılarının curl'ün ne yapması gerektiği konusunda son söze sahip olmalarını sağlamak için seçenekler sunuyoruz. En kötüsü diyorum çünkü kullanıcılardan bu kararları vermelerini istemek genellikle gerçekten zordur çünkü genellikle karmaşık ayrıntılar ve gariplikler içerir ve kullanıcılardan çok şey istenir. Bu tür protokol kararlarını kullanıcılara itmekten kaçınmak için her zaman elimizden gelenin en iyisini yapmalıyız.
curl protokolleri
curl yaklaşık 28 protokolü destekler. Yaklaşık diyoruz çünkü bu, nasıl saydığınıza ve neleri belirgin şekilde farklı protokoller olarak kabul ettiğinize bağlıdır.
DICT
DICT bir sözlük (dictionary) ağ protokolüdür, istemcilerin sözlük sunucularına kelimelerin anlamı veya açıklaması hakkında soru sormasına olanak tanır. Bkz. RFC 2229. Dict sunucuları ve istemcileri 2628 numaralı TCP portunu kullanır.
FILE
FILE aslında bir ağ protokolü değildir. curl'e bir dosyayı uzak bir sunucudan ağ üzerinden almak yerine yerel dosya sisteminden almasını söylemenizi sağlayan bir URL şemasıdır. Bkz. RFC 1738.
FTP
FTP, Dosya Transfer Protokolü (File Transfer Protocol) anlamına gelir ve dosyaları bir istemci ile sunucu arasında ileri geri aktarmanın eski (kökeni 1970'lerin başına dayanır) bir yoludur. Bkz. RFC 959. Yıllar içinde büyük ölçüde genişletilmiştir. FTP sunucuları ve istemcileri 21 numaralı TCP portunu ve bir port daha kullanır, ancak ikincisi genellikle iletişim sırasında dinamik olarak kurulur.
HTTP'den farkı için FTP vs HTTP harici sayfasına bakın.
FTPS
FTPS, Güvenli Dosya Transfer Protokolü (Secure File Transfer Protocol) anlamına gelir. Protokolün normal FTP gibi yapıldığını ancak eklenmiş bir SSL/TLS güvenlik katmanıyla yapıldığını belirtmek için protokol adına bir 'S' ekleme geleneğini izler. Bkz. RFC 4217.
Bu protokolün güvenlik duvarları ve diğer ağ ekipmanları aracılığıyla kullanımı sorunludur.
GOPHER
"İnternet üzerinden belgeleri dağıtmak, aramak ve almak" için tasarlanan Gopher, HTTP'nin aynı kullanım durumları için çoğunlukla tamamen devralması nedeniyle HTTP'nin büyükbabası sayılır. Bkz. RFC 1436. Gopher sunucuları ve istemcileri 70 numaralı TCP portunu kullanır.
GOPHERS
TLS üzerinden Gopher. Eski protokole yeni bir uzantı.
HTTP
Hiper Metin Transfer Protokolü (Hypertext Transfer Protocol), HTTP, web'de ve İnternet üzerinden veri aktarımı için en yaygın kullanılan protokoldür. Genel HTTP Semantiği için RFC 9110, HTTP/1.1 için RFC 9112, HTTP/2 için RFC 9113 ve HTTP/3 için RFC 9114'e bakın. HTTP sunucuları ve istemcileri 80 numaralı TCP portunu kullanır.
HTTPS
Güvenli (Secure) HTTP, bir SSL/TLS bağlantısı üzerinden yapılan HTTP'dir. Bkz. RFC 2818. HTTPS sunucuları ve istemcileri, QUIC (RFC 8999) kullanan ve UDP üzerinden yapılan HTTP/3 konuşmadıkları sürece 443 numaralı TCP portunu kullanır.
IMAP
İnternet Mesaj Erişim Protokolü (Internet Message Access Protocol), IMAP, e-postaya erişmek, kontrol etmek ve "okumak" için bir protokoldür. Bkz. RFC 3501. IMAP sunucuları ve istemcileri 143 numaralı TCP portunu kullanır. Sunucuya bağlantılar açık metin (cleartext) olarak başlasa da, istemci STARTTLS komutunu kullanarak bağlantıyı yükseltmeyi (upgrade) açıkça talep ederek SSL/TLS iletişimini destekleyebilir. Bkz. RFC 2595.
IMAPS
Güvenli IMAP, bir SSL/TLS bağlantısı üzerinden yapılan IMAP'tir. Bu tür bağlantılar örtük olarak SSL/TLS kullanarak başlar ve bu nedenle sunucular ve istemciler birbirleriyle iletişim kurmak için 993 numaralı TCP portunu kullanır. Bkz. RFC 8314.
LDAP
Hafif Dizin Erişim Protokolü (Lightweight Directory Access Protocol), LDAP, dağıtılmış dizin bilgilerine erişmek ve bunları sürdürmek için bir protokoldür. Temelde bir veritabanı aramasıdır. Bkz. RFC 4511. LDAP sunucuları ve istemcileri 389 numaralı TCP portunu kullanır.
LDAPS
Güvenli LDAP, bir SSL/TLS bağlantısı üzerinden yapılan LDAP'tir.
MQTT
Mesaj Kuyruğu Telemetri Taşıma (Message Queuing Telemetry Transport), MQTT, çoğunlukla daha küçük cihazları içeren veri alışverişi için IoT sistemlerinde yaygın olarak kullanılan bir protokoldür. Sözde bir "yayınla-abone ol" (publish-subscribe) protokolüdür.
POP3
Postane Protokolü sürüm 3 (Post Office Protocol version 3 - POP3), bir sunucudan e-posta almak için bir protokoldür. Bkz. RFC 1939. POP3 sunucuları ve istemcileri 110 numaralı TCP portunu kullanır. Sunucuya bağlantılar açık metin olarak başlasa da, istemci STLS komutunu kullanarak bağlantıyı yükseltmeyi açıkça talep ederek SSL/TLS iletişimini destekleyebilir. Bkz. RFC 2595.
POP3S
Güvenli POP3, bir SSL/TLS bağlantısı üzerinden yapılan POP3'tür. Bu tür bağlantılar örtük olarak SSL/TLS kullanarak başlar ve bu nedenle sunucular ve istemciler birbirleriyle iletişim kurmak için 995 numaralı TCP portunu kullanır. Bkz. RFC 8314.
RTMP
Gerçek Zamanlı Mesajlaşma Protokolü (Real-Time Messaging Protocol - RTMP), ses, video ve veri akışı (streaming) için bir protokoldür. RTMP sunucuları ve istemcileri 1935 numaralı TCP portunu kullanır.
RTSP
Gerçek Zamanlı Akış Protokolü (Real Time Streaming Protocol - RTSP), akış ortamı (streaming media) sunucularını kontrol etmek için bir ağ kontrol protokolüdür. Bkz. RFC 2326. RTSP sunucuları ve istemcileri 554 numaralı TCP ve UDP portunu kullanır.
SCP
Güvenli Kopyalama (Secure Copy - SCP) protokolü, dosyaları uzak bir SSH sunucusuna ve sunucusundan kopyalamak için tasarlanmıştır. SCP sunucuları ve istemcileri 22 numaralı TCP portunu kullanır.
SFTP
Güvenilir bir veri akışı üzerinden dosya erişimi, dosya transferi ve dosya yönetimi sağlayan SSH Dosya Transfer Protokolü (SSH File Transfer Protocol - SFTP). SFTP sunucuları ve istemcileri 22 numaralı TCP portunu kullanır.
SMB
Sunucu Mesaj Bloğu (Server Message Block - SMB) protokolü CIFS olarak da bilinir. Esas olarak dosyalara, yazıcılara ve seri portlara paylaşımlı erişim sağlamak ve bir ağdaki düğümler arasında çeşitli iletişimler için kullanılan bir uygulama katmanı ağ protokolüdür. SMB sunucuları ve istemcileri 445 numaralı TCP portunu kullanır.
SMBS
TLS üzerinden yapılan SMB.
SMTP
Basit Posta Transfer Protokolü (Simple Mail Transfer Protocol - SMTP), e-posta iletimi için bir protokoldür. Bkz. RFC 5321. SMTP sunucuları ve istemcileri 25 numaralı TCP portunu kullanır. Sunucuya bağlantılar açık metin olarak başlasa da, istemci STARTTLS komutunu kullanarak bağlantıyı yükseltmeyi açıkça talep ederek SSL/TLS iletişimini destekleyebilir. Bkz. RFC 3207.
SMTPS
Güvenli SMTP, bir SSL/TLS bağlantısı üzerinden yapılan SMTP'dir. Bu tür bağlantılar örtük olarak SSL/TLS kullanarak başlar ve bu nedenle sunucular ve istemciler birbirleriyle iletişim kurmak için 465 numaralı TCP portunu kullanır. Bkz. RFC 8314.
TELNET
TELNET, sanal bir terminal bağlantısı kullanarak çift yönlü etkileşimli metin odaklı bir iletişim tesisi sağlamak için ağlar üzerinden kullanılan bir uygulama katmanı protokolüdür. Bkz. RFC 854. TELNET sunucuları ve istemcileri 23 numaralı TCP portunu kullanır.
TFTP
Önemsiz Dosya Transfer Protokolü (Trivial File Transfer Protocol - TFTP), uzak bir ana bilgisayardan dosya almak veya dosya koymak için UDP üzerinden basit dosya transferleri yapmak için bir protokoldür. TFTP sunucuları ve istemcileri 69 numaralı UDP portunu kullanır.
WS
WebSocket, bir HTTP(S) isteği üzerinden kurulan çift yönlü TCP benzeri bir protokoldür. WS, düz HTTP üzerinden yapılan açık metin sürümü için şemadır.
WSS
WebSocket, bir HTTP(S) isteği üzerinden kurulan çift yönlü TCP benzeri bir protokoldür. WSS, HTTPS üzerinden yapılan güvenli sürüm için şemadır.
HTTP temelleri
HTTP, temellerini öğrenmesi kolay bir protokoldür. Bir istemci bir sunucuya bağlanır — ve inisiyatifi alan her zaman istemcidir — bir istek gönderir ve bir yanıt alır. Hem istek hem de yanıt, başlıklar (headers) ve bir gövdeden (body) oluşur. Her iki yönde de çok az veya çok fazla bilgi gidebilir.
Bir istemci tarafından gönderilen bir HTTP isteği, bir istek satırı (request line), ardından başlıklar ve isteğe bağlı olarak bir gövde ile başlar. En yaygın HTTP isteği muhtemelen sunucudan belirli bir kaynağı (resource) döndürmesini isteyen ve bir gövde içermeyen GET isteğidir.
Bir istemci 'example.com'a bağlandığında ve '/' kaynağını istediğinde, istek gövdesi olmayan bir GET gönderir:
GET / HTTP/1.1
User-agent: curl/2000
Host: example.com
…sunucu, yanıt başlıkları ve bir yanıt gövdesi ('hello') ile aşağıdaki gibi bir yanıt verebilir. Yanıttaki ilk satır ayrıca yanıt kodunu ve sunucunun desteklediği belirli sürümü de içerir:
HTTP/1.1 200 OK
Server: example-server/1.1
Content-Length: 5
Content-Type: plain/text
hello
İstemci bunun yerine küçük bir istek gövdesi ('hello') içeren bir istek gönderirse, şuna benzeyebilir:
POST / HTTP/1.1
Host: example.com
User-agent: curl/2000
Content-Length: 5
hello
Bir şeyler ters gitmediği sürece bir sunucu her zaman bir HTTP isteğine yanıt verir.
URL'in bir isteğe dönüştürülmesi
Bir HTTP istemcisine üzerinde işlem yapması için bir URL verildiğinde, bu URL daha sonra kullanılır, parçalarına ayrılır ve bu parçalar sunucuya giden istekte çeşitli yerlerde kullanılır. Örnek bir URL alalım:
https://www.example.com/path/to/file
-
https, curl'ün 443 numaralı uzak porta TLS kullandığı anlamına gelir (URL'de belirtilmediğinde varsayılan port numarası budur).
-
www.example.com, curl'ün bağlanmak için bir veya daha fazla IP adresine çözümlediği ana bilgisayar adıdır (hostname). Bu ana bilgisayar adı, HTTP isteğindeki
Host:başlığında da kullanılır. -
/path/to/file, HTTP isteğinde sunucuya curl'ün hangi belgeyi/kaynakları almak istediğini söylemek için kullanılır.
curl ve libcurl kurulumu
curl tamamen ücretsiz, açık ve ulaşılabilirdir. Çoğu işletim sistemi ve mimari için onu edinmenin ve kurmanın sayısız yolu vardır. Bu bölüm size başlamanız için bazı yanıtlar verir, ancak tam bir referans değildir.
Bazı işletim sistemleri curl'ü varsayılan olarak gönderir. Bazıları göndermez.
Ek olarak, her zaman curl.se adresinden kaynağı indirebilir veya oradan indirmek için ikili (binary) paketler bulabilirsiniz.
Genellikle libcurl, curl ile aynı anda kurulur.
Linux
Linux dağıtımları, sundukları yazılımları kurmanızı sağlayan paket yöneticileriyle gelir. Çoğu Linux dağıtımı, varsayılan olarak kurulu değilse curl ve libcurl'ün kurulmasını önerir.
Ubuntu ve Debian
apt, Debian Linux ve Ubuntu Linux dağıtımlarında ve türevlerinde önceden oluşturulmuş paketleri kurmak için kullanılan bir araçtır.
curl komut satırı aracını kurmak için genellikle sadece şunu yaparsınız:
apt install curl
…ve bu daha sonra bağımlılıkların kurulduğundan emin olur ve genellikle libcurl de ayrı bir paket olarak kurulur.
libcurl'e karşı uygulamalar geliştirmek istiyorsanız, dahil etme (include) başlıklarını ve bazı ek belgeleri vb. almak için kurulu bir geliştirme paketine ihtiyacınız vardır. Daha sonra tercih ettiğiniz TLS arka ucuna sahip bir libcurl seçebilirsiniz:
apt install libcurl4-openssl-dev
veya
apt install libcurl4-gnutls-dev
Redhat ve CentOS
Redhat Linux ve CentOS Linux türevlerinde paketleri kurmak için yum kullanırsınız. Komut satırı aracını şununla kurun:
yum install curl
libcurl geliştirme paketini (include dosyaları ve bazı belgeler vb. ile birlikte) şununla kurarsınız:
yum install libcurl-devel
Fedora
Fedora Workstation ve diğer Fedora tabanlı dağıtımlar paketleri kurmak için dnf kullanır.
Komut satırı aracını şununla kurun:
dnf install curl
libcurl geliştirme paketini kurmak için şunu çalıştırırsınız:
dnf install libcurl-devel
Değişmez (Immutable) Fedora dağıtımları
Silverblue, Kinoite, Sericea, Onyx vb. gibi dağıtımlar paketleri kurmak için rpm-ostree kullanır.
Kurulumdan sonra sistemi yeniden başlatmayı unutmayın.
rpm-ostree install curl
libcurl geliştirme paketini kurmak için şunu çalıştırırsınız:
rpm-ostree install libcurl-devel
nix
Nix, NixOS dağıtımı için varsayılan paket yöneticisidir, ancak herhangi bir Linux dağıtımında da kullanılabilir.
Komut satırı aracını kurmak için:
nix-env -i curl
Arch Linux
curl, Arch Linux'un çekirdek (core) deposunda bulunur. Bu, normal kurulum prosedürünü izlerseniz otomatik olarak kurulması gerektiği anlamına gelir.
curl kurulu değilse, Arch Linux paketleri kurmak için pacman kullanır:
pacman -S curl
SUSE ve openSUSE
SUSE Linux ve openSUSE Linux ile paketleri kurmak için zypper kullanırsınız. curl komut satırı yardımcı programını kurmak için:
zypper install curl
libcurl geliştirme paketini kurmak için şunu çalıştırırsınız:
zypper install libcurl-devel
SUSE SLE Micro ve openSUSE MicroOS
SUSE/openSUSE Linux'un bu sürümleri değişmez (immutable) işletim sistemleridir ve salt okunur bir kök dosya sistemine sahiptir, paketleri kurmak için zypper yerine transactional-update kullanırsınız. curl komut satırı yardımcı programını kurmak için:
transactional-update pkg install curl
libcurl geliştirme paketini kurmak için:
transactional-update pkg install libcurl-devel
Gentoo
Bu paket aracı, libcurl'ü, başlıkları ve pkg-config dosyalarını vb. kurar.
emerge net-misc/curl
Void Linux
Void Linux ile paketleri kurmak için xbps-install kullanırsınız.
curl komut satırı yardımcı programını kurmak için:
xbps-install curl
libcurl geliştirme paketini kurmak için:
xbps-install libcurl-devel
Windows
Windows 10, sürüm 1804'ten bu yana işletim sistemiyle birlikte gelen curl aracıyla birlikte gelir. Daha eski bir Windows sürümünüz varsa veya curl projesi tarafından gönderilen en son sürüme yükseltmek istiyorsanız, Windows için en son resmi curl sürümünü curl.se/windows adresinden indirin ve onu kurun.
Windows sistemlerinize curl ve libcurl'ü edinmenin birkaç farklı yolu vardır:
MSYS2
MSYS2, mingw-w64 tabanlı Windows için popüler bir derleme (build) sistemidir ve hem gcc hem de clang derleyicilerini içerir. MSYS2, pacman (arch-linux'tan bir port) adında bir paket yöneticisi kullanır ve yaklaşık 2000 önceden derlenmiş mingw-paketine sahiptir. MSYS2, bağımsız yazılımlar oluşturmak için tasarlanmıştır: mingw-w64 derleyicileri ile oluşturulan ikili dosyalar (binaries), MSYS2'ye bağlı değildir[^1].
MSYS2'de curl ve libcurl edinin
mingw-w64-curl paketi hakkında güncel bilgiler msys2 web sitesinde bulunabilir: https://packages.msys2.org/base/mingw-w64-curl. Burada ayrıca çeşitli mevcut çeşitler için kurulum talimatlarını da bulabiliriz. Örneğin curl için varsayılan x64 ikili dosyasını kurmak için şunu çalıştırırız:
pacman -Sy mingw-w64-x86_64-curl
Bu paket, hem curl komut satırı aracını hem de libcurl başlıklarını ve paylaşılan kütüphanelerini içerir. Varsayılan curl paketleri OpenSSL arka ucu ile oluşturulmuştur ve bu nedenle mingw-w64-x86_64-openssle bağlıdır. Ayrıca mingw-w64-x86_64-curl-gnutls ve mingw-w64-x86_64-curl-gnutls paketleri de vardır, daha fazla ayrıntı için msys2 web sitesine bakın.
Tıpkı Linux'ta olduğu gibi, libcurl'e karşı derleme yapmak için gereken bayrakları (flags) sorgulamak için pkg-config kullanabiliriz. mingw64 kabuğunu (shell) kullanarak msys2'yi başlatın (bu, /mingw64'ü dahil edecek yolu otomatik olarak ayarlar) ve çalıştırın:
pkg-config --cflags libcurl
# -IC:/msys64/mingw64/include
pkg-config --libs libcurl
# -LC:/msys64/mingw64/lib -lcurl
pacman paket yöneticisi önceden derlenmiş ikili dosyaları kurar. Sırada, örneğin yapılandırmayı özelleştirmek için curl'ü yerel olarak derlemek amacıyla pacman'i nasıl kullanacağımızı açıklıyoruz.
MSYS2 üzerinde libcurl derleme
Pacman ile paket oluşturmak neredeyse kurulum kadar basittir. Tüm süreç, mingw-w64-curl paketinden PKGBUILD dosyasında yer almaktadır. Paketi kendimiz yeniden oluşturmak için dosyayı kolayca değiştirebiliriz.
Temiz bir msys2 kurulumuyla başlarsak, önce autoconf, patch ve git gibi bazı derleme araçlarını kurmak isteriz. msys2 kabuğunu başlatın ve çalıştırın:
# Depoları senkronize edin (Sync the repositories)
pacman -Syu
# git, autoconf, patch, vb. kurun
pacman -S git base-devel
# x86_64 için GCC kurun
pacman -S mingw-w64-x86_64-toolchain
Şimdi mingw-packages deposunu klonlayın ve mingw-w64-curl paketine gidin:
git clone https://github.com/msys2/MINGW-packages
cd MINGW-packages/mingw-w64-curl
Bu dizin, curl'ü oluşturmak için kullanılan PKGBUILD dosyasını ve yamaları içerir. Neler olup bittiğini görmek için PKGBUILD dosyasına bir göz atın. Şimdi derlemek için şunları yapabiliriz:
makepkg-mingw --syncdeps --skippgpcheck
İşte bu kadar. --syncdeps parametresı, mingw-w64-curl bağımlılıklarını henüz kurulu değilse otomatik olarak kontrol eder ve kurulmasını ister. İşlem tamamlandığında, geçerli dizinde 3 yeni dosyanız olur, örneğin:
pacman -U mingw-w64-x86_64-curl-7.80.0-1-any.pkg.tar.zstpacman -U mingw-w64-x86_64-curl-gnutls-7.80.0-1-any.pkg.tar.zstpacman -U mingw-w64-x86_64-curl-winssl-7.80.0-1-any.pkg.tar.zst
Böyle bir yerel paket dosyasını kurmak için pacman -u komutunu kullanın:
pacman -U mingw-w64-x86_64-curl-winssl-7.80.0-1-any.pkg.tar.zst
pacman ve msys2 ile derleme hakkında daha fazla bilgi edinmek için msys2 belgelerine bir göz atın veya gitter'a katılın.
[^1]: mingw-w64-curl mingw-paketi ile curl ve curl-devel msys-paketlerini karıştırmamaya dikkat edin. İkincisi, msys2 ortamının kendisinin bir parçasıdır (örneğin pacman indirmelerini desteklemek için), ancak yeniden dağıtım için uygun değildir. MSYS2'ye bağlı olmayan yeniden dağıtılabilir yazılımlar oluşturmak için her zaman mingw-w64-… paketlerine ve araç zincirlerine ihtiyacınız vardır.
vcpkg
Vcpkg, Windows, Linux ve MacOS üzerinde C ve C++ kütüphanelerini yönetmenize yardımcı olur.
vcpkg üzerinde curl paketi yoktur, sadece libcurl vardır.
libcurl kurulumu
vcpkg.exe install curl:x64-windows
macOS
macOS, uzun yıllardır işletim sistemiyle birlikte gelen curl aracıyla birlikte gelir. curl projesi tarafından gönderilen en son sürüme yükseltmek istiyorsanız, homebrew (bir macOS yazılım paket yöneticisi) kurmanızı ve ardından curl paketini onlardan kurmanızı öneririz:
brew install curl
curl'ü kurarken, brew'in macOS sürümüyle çakışmaları önlemek için varsayılan homebrew klasöründe bir curl sembolik bağı (symlink) oluşturmadığını unutmayın.
brew curl'ü kabuğunuzda (shell) varsayılan yapmak için aşağıdakini çalıştırın:
echo 'export PATH="$(brew --prefix)/opt/curl/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
macOS için libcurl edinin
Yukarıda açıklandığı gibi homebrew ile curl aracını kurduğunuzda, libcurl'ü de ilgili başlıklarıyla birlikte kurar.
libcurl ayrıca macOS'un kendisiyle birlikte kurulur ve her zaman mevcuttur. Apple'dan XCode geliştirme ortamını kurarsanız, curl include dosyaları orada paketlendiğinden ekstra bir şey kurmanıza gerek kalmadan libcurl'ü doğrudan kullanabilirsiniz.
Konteyner (Container)
Hem docker hem de podman konteynerleştirme araçlarıdır. Docker imajı (image) şurada barındırılmaktadır:
https://hub.docker.com/r/curlimages/curl
Aşağıdaki komutla curl'ün en son sürümünü çalıştırabilirsiniz:
docker için komut:
docker run -it --rm docker.io/curlimages/curl www.example.com
podman için komut:
podman run -it --rm docker.io/curlimages/curl www.example.com
Konteynerde curl'ü sorunsuz çalıştırma
curl'ü, ana bilgisayar (host) işletim sisteminde yüklü yerel bir uygulamaymış gibi bir konteyner içinde sorunsuz bir şekilde çalıştırmak için bir takma ad (alias) oluşturmak mümkündür.
Bash, ZSH, Fish kabuğunda (shell) curl'ü konteynerleştirme aracınız için bir takma ad olarak tanımlama komutu:
Bash veya zsh
docker ile curl çağırın:
alias curl='docker run -it --rm docker.io/curlimages/curl'
podman ile curl çağırın:
alias curl='podman run -it --rm docker.io/curlimages/curl'
Fish
docker ile curl çağırın:
alias -s curl='docker run -it --rm docker.io/curlimages/curl'
podman ile curl çağırın:
alias -s curl='podman run -it --rm docker.io/curlimages/curl'
Bir istekte bulunmak için sadece curl www.example.com komutunu çağırın
kubernetes içinde curl çalıştırma
Bazen tıpkı bunun gibi k8s ağ sorunlarını curl ile gidermek yararlı olabilir:
kubectl run -i --tty curl --image=curlimages/curl --restart=Never \
-- "-m 5" www.example.com
Kaynak kodu
Kaynak kodu, elbette, bu projenin gerçek motor parçalarıdır. Sonuçta, bu bir yazılım projesidir.
curl ve libcurl C ile yazılmıştır.
Barındırma ve indirme
En son curl ve libcurl sürümünün kaynak kodunu her zaman resmi curl web sitesi curl.se'de bulabilirsiniz. Dosyaları indirdiğinizde yerel sisteminize inen şeyin, curl ekibi tarafından oraya orijinal olarak yüklenen aynı bytelar ve aynı sırada olduğunu doğrulamanıza yardımcı olmak için sağlanan sağlama toplamları (checksums) ve dijital imzalar da vardır.
Doğrudan kaynak kodu deposundan curl kaynak koduyla çalışmayı tercih ederseniz, tüm ayrıntıları curl GitHub deposunda bulabilirsiniz.
Kodu klonlayın
git clone https://github.com/curl/curl.git
Bu, en son curl kodunun indirilmesini ve yerel sisteminizdeki bir dizine açılmasını sağlar.
- Açık Kaynak (Open Source)
- Kod düzeni
- Derleme seçeneklerini yönetme
- Kod stili
- Katkıda bulunma
- Güvenlik açıklarını bildirme
- Web sitesi
Açık Kaynak (Open Source)
Açık Kaynak Nedir?
Genel olarak, Açık Kaynak yazılım, herkes tarafından serbestçe erişilebilen, kullanılabilen, değiştirilebilen ve paylaşılabilen (değiştirilmiş veya değiştirilmemiş biçimde) yazılımdır. Açık Kaynak yazılım, tipik olarak birçok kişi tarafından yapılır ve tanıma uyan lisanslar altında dağıtılır.
Özgür Yazılım (Free Software), tüm niyet ve amaçlarımız için çoğunlukla aynı şeyi söyleyen daha eski ve ilgili bir terimdir, ancak basitlik sağlamak için bu belgede Açık Kaynak terimine bağlı kalacağız.
Lisans
curl ve libcurl, MIT lisansı türevi olarak bilinen bir Açık Kaynak lisansı altında dağıtılır. Kısa, basit ve anlaşılması kolaydır. Tamamı aşağıdadır:
COPYRIGHT AND PERMISSION NOTICE
Copyright © 1996 - 2025, Daniel Stenberg, <daniel@haxx.se>, and many
contributors, see the THANKS file.
All rights reserved.
Permission to use, copy, modify, and distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
THIRD PARTY RIGHTS. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Except as contained in this notice, the name of a copyright holder shall
not be used in advertising or otherwise to promote the sale, use or
other dealings in this Software without prior written authorization of
the copyright holder.
Bu, kodu değiştirmenize, kodu yeniden dağıtmanıza, koddan oluşturulan ikili dosyaları yeniden dağıtmanıza ve onunla tescilli (proprietary) kod oluşturmanıza izin verildiğini söyleyen hukuk dilidir; kimse sizden proje değişikliklerini geri vermenizi talep etmez—ancak onu sizin yazdığınızı iddia edemezsiniz.
Projenin başlarında, buna karar vermeden önce birkaç farklı lisans üzerinde durduk. GPL ile başladık, sonra MPL'i denedik ve bu MIT türevine indik. Lisansı bir daha asla değiştirmeyi düşünmüyoruz.
Telif Hakkı
Telif hakkı, bir ülkenin kanunları tarafından verilen, orijinal bir eserin yaratıcısına kullanımı ve dağıtımı için münhasır haklar veren yasal bir haktır.
Telif hakkı sahibi (sahipleri), başkalarının eserlerini lisanslayarak kullanmalarına izin vermeyi kabul edebilir. curl projesinde yaptığımız budur. Telif hakkı, lisanslamanın üzerinde çalıştığı temeldir.
Daniel Stenberg, curl projesindeki çoğu telif hakkının sahibidir.
Bağımsız
Birçok Açık Kaynak projesi çatı kuruluşlar bünyesinde yürütülmektedir. Bu tür organizasyonlar arasında GNU projesi, Apache Yazılım Vakfı, projeyi finanse eden daha büyük bir şirket veya benzerleri bulunur. curl projesi bu tür daha büyük bir organizasyonun parçası değildir, tamamen bağımsız ve özgürdür.
Hiçbir şirket curl'ün kaderini kontrol etmez ve curl projesinin herhangi bir şemsiye organizasyonun yönergelerini izlemesi gerekmez.
curl resmi bir şirket, organizasyon veya herhangi bir tür yasal varlık değildir. curl, bir yazılım projesinde birlikte çalışan, dünyaya dağılmış insanlardan oluşan gayri resmi bir topluluktur.
Yasal
curl projesi, içinde çalıştığı ülkelerin ulusal yasalarına uyar. Ancak, oldukça görünür bir uluslararası projedir, dünya üzerindeki hemen hemen her ülkede indirilebilir ve kullanılabilir, bu nedenle curl kullanırken bazı yerel yasalar çiğnenebilir. Bu sadece doğası gereğidir ve emin değilseniz kendi yerel durumunuzu kontrol etmelisiniz.
curl'ün sağladığı teknolojiyi içeren davalar olmuştur. Yazarın bildiği bu tür durumlardan biri, ABD'de devam ettirilen dosya transferleri (resumed file transfers) haklarına sahip olduklarını iddia eden bir patent davasıydı.
Herkese her yerde kullanılabilen genel bir yazılım bileşeni olarak, libcurl'ün — özellikle — kötü niyetli veya tamamen kötü amaçlı şekillerde kullanıldığı zamanlar vardır. Örnekler arasında virüs ve kötü amaçlı yazılımlarda kullanılması yer alır. Bu talihsiz bir durumdur ancak önleyebileceğimiz bir şey değildir.
Kod düzeni
curl kaynak kodu ağacı ne büyük ne de karmaşıktır. Hatırlanması gereken önemli bir şey, libcurl'ün kütüphane olduğu ve bu kütüphanenin curl komut satırı aracının en büyük bileşeni olduğudur.
kök (root)
Kaynak ağacı kökündeki dosya sayısını minimumda tutmaya çalışıyoruz. Bir sürüm arşivini git deposunda saklananla karşılaştırırsanız, sürüm komut dosyaları (scripts) tarafından birkaç dosya oluşturulduğundan dosyalarda küçük bir fark görebilirsiniz.
Daha dikkate değer olanlardan bazıları şunlardır:
buildconf: (kullanımdan kaldırıldı) git deposundan kaynağı kullanarak curl derlerken yapılandırma (configure) ve daha fazlasını oluşturmak için kullanılan komut dosyası.buildconf.bat: buildconf'un Windows sürümü. Tam kaynak kodunu git'ten çektikten (checkout) sonra bunu çalıştırın.CHANGES: sürümde oluşturulur ve sürüm arşivine konur. Kaynak deposundaki en son 1000 değişikliği içerir.configure: curl derlerken bir kurulum oluşturmak için Unix benzeri sistemlerde kullanılan oluşturulmuş bir komut dosyası.COPYING: kodu kullanmanızla ilgili kuralları detaylandıran lisans.GIT-INFO: sadece git'te bulunur ve kodu git'ten çektikten sonra curl'ün nasıl derleneceği hakkında bilgi içerir.maketgz: sürüm arşivleri ve günlük anlık görüntüler (snapshots) üretmek için kullanılan komut dosyası.README: curl ve libcurl'ün ne olduğuna dair kısa bir özet.RELEASE-NOTES: en son sürüm için yapılan değişiklikleri içerir; git'te bulunduğunda, önceki sürümden bu yana yapılan ve gelecek sürüme girmesi hedeflenen değişiklikleri içerir.
lib
Bu dizin, libcurl için tam kaynak kodunu içerir. Tüm platformlar için aynı kaynak kodudur—yüzden fazla C kaynak dosyası ve birkaç tane daha özel başlık dosyası. libcurl'e karşı uygulamalar derlenirken kullanılan başlık dosyaları bu dizinde saklanmaz; onlar için include/curl dizinine bakın.
Kendi derlemenizde hangi özelliklerin etkinleştirildiğine ve platformunuzun hangi işlevleri sağladığına bağlı olarak, kaynak dosyaların bazıları veya kaynak dosyaların bölümleri, sizin özel derlemenizde kullanılmayan kodlar içerebilir.
lib/vtls
libcurl içindeki VTLS alt bölümü, libcurl'ün desteklemek üzere derlenebileceği tüm TLS arka uçlarının evidir. "Sanal" (virtual) TLS dahili API'si, ana kodun hangi özel TLS kütüphanesinin kullanıldığını bilmeden TLS ve kripto işlevlerine erişmek için dahili olarak kullanılan, arka uçtan bağımsız bir API'dir. Bu, libcurl'ü derleyen kişinin derleme yapmak için çok çeşitli TLS kütüphaneleri arasından seçim yapmasına olanak tanır.
Kullanıcılara yardımcı olmak için web sitesinde bir SSL karşılaştırma tablosu da tutuyoruz.
- AmiSSL: AmigaOS için yapılmış bir OpenSSL çatalı (
openssl.ckullanır) - BearSSL
- BoringSSL: Google tarafından bakımı yapılan bir OpenSSL çatalı. (
openssl.ckullanır) - GnuTLS
- LibreSSL: OpenBSD ekibi tarafından bakımı yapılan bir OpenSSL çatalı. (
openssl.ckullanır) - mbedTLS
- OpenSSL
- rustls: rust ile yazılmış bir TLS kütüphanesi
- Schannel: Windows üzerindeki yerel (native) TLS kütüphanesi.
- Secure Transport: macOS üzerindeki yerel (native) TLS kütüphanesi
- wolfSSL
src
Bu dizin, curl komut satırı aracı için kaynak kodunu tutar. Aracı çalıştıran tüm platformlar için aynı kaynak kodudur.
Komut satırı aracının yaptığı şeylerin çoğu, verilen komut satırı seçeneklerini karşılık gelen libcurl seçeneklerine veya seçenek setine dönüştürmek ve ardından kullanıcının isteklerine göre ağ transferini yönlendirmek için bunları doğru bir şekilde verdiğinden emin olmaktır.
Bu kod, libcurl'ü tıpkı diğer herhangi bir uygulamanın yaptığı gibi kullanır.
include/curl
Burada libcurl kullanan uygulamalar için sağlanan halka açık başlık dosyaları bulunmaktadır. Bazıları yapılandırma (configure) veya sürüm sırasında oluşturulur, bu nedenle git deposunda bir sürüm arşivinde göründükleri gibi görünmezler.
Modern libcurl ile, bir uygulamanın C kaynak koduna dahil etmesi beklenen tek şey #include <curl/curl.h> satırıdır.
docs
Ana dokümantasyon konumu. Bu dizindeki metin dosyaları tipik olarak düz metin dosyalarıdır. Yavaş yavaş Markdown formatına geçmeye başladık, bu nedenle birkaç (ancak artan sayıda) dosya bunu belirtmek için .md uzantısını kullanıyor.
Bu belgelerin çoğu curl web sitesinde de otomatik olarak metinden web dostu bir formata/görünüme dönüştürülerek gösterilir.
BINDINGS: bilinen tüm libcurl dil bağlayıcılarını ve bunların nerede bulunacağını listelerBUGS: hataların nasıl ve nereye bildirileceğiCODE_OF_CONDUCT.md: bu projede insanların nasıl davranmasını beklediğimizCONTRIBUTE: projeye katkıda bulunurken nelere dikkat edilmelicurl.1: nroff formatında curl komut satırı aracı kılavuz (man) sayfasıcurl-config.1: nroff formatında curl-config kılavuz sayfasıFAQ: curl ile ilgili çeşitli konular hakkında sıkça sorulan sorularFEATURES: curl özelliklerinin eksik bir listesiHISTORY: projenin nasıl başladığını ve yıllar içinde nasıl geliştiğini açıklarHTTP2.md: curl ve libcurl ile HTTP/2 kullanımıHTTP-COOKIES: curl HTTP çerezlerini (cookies) nasıl destekler ve onlarla nasıl çalışırindex.html: dokümantasyon dizin sayfası olarak temel bir HTML sayfasıINSTALL: curl ve libcurl'ün kaynaktan nasıl derleneceği ve kurulacağıINSTALL.cmake: CMake ile curl ve libcurl nasıl derlenirINSTALL.devcpp: devcpp ile curl ve libcurl nasıl derlenirINTERNALS: curl ve libcurl iç yapılarını detaylandırırKNOWN_BUGS: bilinen hatalar ve sorunların listesiLICENSE-MIXING: farklı üçüncü taraf modüllerinin ve bunların bireysel lisanslarının nasıl birleştirileceğini açıklarMAIL-ETIQUETTE: posta listelerimizde nasıl iletişim kurulacağıMANUAL: curl'ün nasıl kullanılacağına dair öğretici benzeri bir rehbermk-ca-bundle.1: nroff formatında mk-ca-bundle aracı kılavuz sayfasıREADME.cmake: CMake ayrıntılarıREADME.netware: Netware ayrıntılarıREADME.win32: win32 ayrıntılarıRELEASE-PROCEDURE: bir curl ve libcurl sürümü nasıl yapılırRESOURCES: curl'ün neyi, neden ve nasıl yaptığına dair daha fazla okuma için ek kaynaklarROADMAP.md: gelecekte üzerinde çalışmak istediğimiz şeylerSECURITY: güvenlik açıkları üzerinde nasıl çalıştığımızSSLCERTS: TLS sertifika işleme belgelendiSSL-PROBLEMS: yaygın SSL sorunları ve nedenleriTHANKS: bu kapsamlı dost canlısı insanlar listesi sayesinde, curl bugün var.TheArtOfHttpScripting: curl ile HTTP komut dosyası oluşturmaya (scripting) giriş dersiTODO: bizim veya sizin uygulayabileceğiniz şeylerVERSIONS: libcurl sürüm numaralandırmasının nasıl çalıştığı
docs/libcurl
Tüm libcurl işlevleri, bu dizinde nroff formatında, .3 uzantılı ayrı dosyalarda kendi kılavuz sayfalarına sahiptir. Aşağıda açıklanan birkaç başka dosya da vardır.
ABIindex.htmllibcurl.3libcurl-easy.3libcurl-errors.3libcurl.m4libcurl-multi.3libcurl-share.3libcurl-thread.3libcurl-tutorial.3symbols-in-versions
docs/libcurl/opts
Bu dizin, üç farklı libcurl işlevi için bireysel seçeneklerin kılavuz sayfalarını içerir.
curl_easy_setopt() seçenekleri CURLOPT_ ile başlar,
curl_multi_setopt() seçenekleri CURLMOPT_ ile başlar ve
curl_easy_getinfo() seçenekleri CURLINFO_ ile başlar.
docs/examples
Okuyucuların libcurl'ün nasıl kullanılabileceğini anlamalarına yardımcı olmayı amaçlayan yaklaşık 100 bağımsız örnek içerir.
Ayrıca bu kitabın libcurl örnekleri bölümüne de bakın.
scripts
Kullanışlı komut dosyaları.
contributors.sh: belirli bir hash/etiketten bu yana tüm katkıda bulunanları git deposundan çıkarır. Amaç, RELEASE-NOTES dosyası için bir liste oluşturmak ve manuel olarak eklenen isimlerin güncellemelerde bile orada kalmasına izin vermektir. Komut dosyası, bazı isimleri yeniden yazmak içinTHANKS-filterdosyasını kullanır.contrithanks.sh: belirli bir hash/etiketten bu yana katkıda bulunanları git deposundan çıkarır,THANKSdosyasında zaten belirtilen tüm isimleri filtreler ve ardından yeni katkıda bulunanların listesini sona ekleyerekTHANKSdosyasını stdout'a (standart çıktı) verir; THANKS belgesinin daha kolay güncellenmesini sağlamak içindir. Komut dosyası, bazı isimleri yeniden yazmak içinTHANKS-filterdosyasını kullanır.log2changes.pl: sürüm komut dosyası tarafından kullanıldığı gibi, sürümler içinCHANGESdosyasını oluşturur. Basitçe git log çıktısını dönüştürür.zsh.pl: zsh kabuğu kullanıcılarına curl komut satırı tamamlamaları sağlamak için yardımcı komut dosyası.
Derleme seçeneklerini yönetme
curl ve libcurl kaynak kodu, mevcut hemen hemen her bilgisayar platformunda derlenmek ve çalışmak üzere dikkatlice yazılmıştır. Bu ancak sıkı bir çalışmayla ve birkaç yönergeye (ve tabii ki makul miktarda teste) bağlı kalarak yapılabilir.
Altın kural, her zaman belirli özellikleri kontrol eden #ifdef'ler eklemek ve ardından kurulum komut dosyalarının (configure veya CMake veya sabit kodlanmış) program orada derlenmeden önce kullanıcının bilgisayar kurulumunda söz konusu özelliklerin varlığını kontrol etmesini sağlamaktır. Ek olarak ve bir bonus olarak, kodu bu şekilde yazma sayesinde, bazı özellikler sistemde mevcut olsalar ve kullanılabilecek olsalar bile açıkça kapatılabilir. Buna örnek olarak, kullanıcıların örneğin daha küçük bir ayak izine sahip veya belirli protokoller için desteği devre dışı bırakılmış vb. bir kütüphane sürümü derlemek istemeleri verilebilir.
Proje bazen, örneğin tek bir dosya belirli bir işletim sistemi veya belki de her zaman mevcut olmayan belirli bir özellik için sağlandığında, tüm kaynak dosyaların etrafında #ifdef koruması kullanır. Bu, tüm platformların her zaman tüm dosyaları derlemesini mümkün kılmak içindir—derleme komut dosyalarını ve makefile'larını çok basitleştirir. Tamamen #ifdef ile dışarıda bırakılan bir dosya, zaten derleme süresine neredeyse hiçbir şey eklemez.
Kodun içine #ifdef'ler serpiştirmek yerine, mümkün olduğu ölçüde, kodun mevcut özelliklerden bağımsız olarak aynı görünmesini ve çalışmasını sağlayan işlevler ve makrolar sağlarız. Bunların bazıları, özelliklerden yoksun derlemeler için boş makrolardır.
Hem TLS işleme hem de isim çözümleme, belirli uygulamayı ve 3. taraf yazılım kütüphanesi seçimini gizleyen dahili bir API ile gerçekleştirilir. Bu şekilde, çoğu iç yapı, libcurl'e hangi TLS kütüphanesini veya isim çözümleme sistemini kullanması söylendiğinden bağımsız olarak aynı şekilde çalışır.
Kod stili
Ortak bir stile sahip kaynak kodunun okunması, farklı yerlerde farklı stiller kullanan koddan daha kolaydır. Kodun tek bir sürekli kod tabanı gibi hissettirmesine yardımcı olur. Okunması kolay olmak kodun önemli bir özelliğidir ve yeni şeyler eklendiğinde gözden geçirmeyi kolaylaştırmaya yardımcı olur ve geliştiriciler işlerin neden ters gittiğini anlamaya çalışırken kodda hata ayıklamaya yardımcı olur. Birleşik bir stil, bireysel katılımcıların kendi kişisel zevklerinin tatmin edilmesinden daha önemlidir.
C kodumuzun birkaç stil kuralı vardır. Bunların çoğu checksrc.pl komut dosyası tarafından doğrulanır ve desteklenir. make checksrc ile veya ./configure --enable-debug kullanıldıktan sonra derlendiğinde derleme sistemi tarafından varsayılan olarak çağrılır.
Kaynak kodunda zaten kullanılan stili kopyalamanız gerektiğinden ve kural setimizde özellikle alışılmadık kurallar olmadığından, yönergeleri takip etmek normalde kimse için bir sorun değildir.
Ayrıca tüm büyük platformlarda ve genel olarak mümkün olduğunca çok platformda uyarısız (warning-free) kod yazmak için çok çalışıyoruz. Açıkça uyarılara neden olan kod olduğu gibi kabul edilmez.
İsimlendirme
Yeni işlevleriniz ve değişken isimleriniz için kafa karıştırıcı olmayan bir isimlendirme şeması kullanmayı deneyin. Bu mutlaka kodun diğer yerlerindekiyle aynısını kullanmanız gerektiği anlamına gelmez, sadece isimlerin mantıklı, anlaşılır ve ne için kullanıldıklarına göre isimlendirilmesi gerektiği anlamına gelir. Dosya-yerel işlevler statik (static) yapılmalıdır. Küçük harfli isimleri severiz.
Tüm halka açık kullanım amaçlı semboller curl ile başlamalıdır. Küresel dahili semboller Curl ile başlar.
Girintileme (Indentation)
Girintileme için sadece boşluk kullanırız, asla TAB kullanmayız. Her yeni açık parantez için iki boşluk kullanırız.
if(something_is_true) {
while(second_statement == fine) {
moo();
}
}
Yorumlar
C89 kodu yazdığımız için, // yorumlarına izin verilmez. Bunlar C99'a kadar C standardına dahil edilmemiştir. Sadece /* comments */ kullanırız.
/* bu bir yorumdur */
Uzun satırlar
curl'deki kaynak kodu asla 79 sütundan daha geniş olamaz. Büyük ve yüksek çözünürlüklü ekranların olduğu modern çağda bile bunu sürdürmenin iki nedeni vardır:
-
Daha dar sütunların okunması geniş olanlardan daha kolaydır. Gazetelerin on yıllardır veya yüzyıllardır sütun kullanmasının bir nedeni var.
-
Daha dar sütunlar, geliştiricilerin kodun birden fazla parçasını farklı pencerelerde yan yana daha kolay görüntülemesine olanak tanır. Ben sıklıkla aynı ekranda yan yana iki veya üç kaynak kodu penceresinin yanı sıra birden fazla terminal ve hata ayıklama penceresine sahibim.
Parantezler (Braces)
if/while/do/for ifadelerinde, açık parantezi (süslü parantez) anahtar kelimeyle aynı satıra yazarız ve ardından kapanış parantezini ilk anahtar kelimeyle aynı girinti düzeyine koyarız. Şunun gibi:
if(yas < 40) {
/* açıkça bir genç */
}
Sadece tek satırlık bir ifade içereceklerse parantezleri atlayabilirsiniz:
if(!x)
continue;
Fonksiyonlar için açılış parantezi ayrı bir satırda olmalıdır:
int main(int argc, char **argv)
{
return 1;
}
Sonraki satırda else
Parantez kullanarak koşullu bir ifadeye bir else cümlesi eklerken, onu kapanış parantezinden sonra yeni bir satıra ekleriz. Şunun gibi:
if(yas < 40) {
/* açıkça bir genç */
}
else {
/* muhtemelen zeki */
}
Parantezlerden önce boşluk yok
if/while/do/for kullanarak ifadeler yazarken, anahtar kelime ile açık parantez arasında boşluk olmamalıdır. Şunun gibi:
while(1) {
/* sonsuza kadar döngü */
}
Mantıksal (Boolean) koşullar kullanın
if/while koşullarında bool gibi koşullu bir değeri TRUE veya FALSE'a karşı, bir işaretçiyi (pointer) NULL veya != NULL'a karşı ve bir int'i sıfır veya sıfır olmayana karşı test etmek yerine şunları tercih ederiz:
sonuc = bir_sey_yap();
if(!sonuc) {
/* bir şeyler ters gitti */
return sonuc;
}
Koşullarda atama yok
Okunabilirliği artırmak ve koşulların karmaşıklığını azaltmak için if/while koşulları içinde değişken atamaktan kaçınırız. Bu stile hoş bakmayız:
if((ptr = malloc(100)) == NULL)
return NULL;
Bunun yerine yukarıdaki sürümün daha net bir şekilde yazılmasını teşvik ediyoruz:
ptr = malloc(100);
if(!ptr)
return NULL;
Yeni bloğu yeni bir satırda
Kısa if() koşulları için bile olsa, aynı kaynak satırına asla birden fazla ifade yazmayız.
if(a)
return TRUE;
else if(b)
return FALSE;
Asla:
if(a) return TRUE;
else if(b) return FALSE;
Operatörler etrafında boşluk
Lütfen C ifadelerinde operatörlerin her iki tarafında da boşluk kullanın. Sontakı (Postfix) (), [], ->, ., ++, -- ve Tekil (Unary) +, -, !, ~, & operatörleri hariç, bunlarda boşluk olmamalıdır.
Örnekler:
bla = func();
who = name[0];
age += 1;
true = !false;
size += -2 + 3 * (a + b);
ptr->member = a++;
struct.field = b--;
ptr = &address;
contents = *pointer;
complement = ~bits;
empty = (!*string) ? TRUE : FALSE;
Dönüş değerleri için parantez yok
'return' ifadesini değerin etrafında fazladan parantez olmadan kullanırız:
int calisir(void)
{
return TRUE;
}
sizeof argümanları için parantezler
Kodda sizeof operatörünü kullanırken, argümanı etrafında parantezlerle yazılmasını tercih ederiz:
int size = sizeof(int);
Sütun hizalama
Bazı ifadeler tek bir satırda tamamlanamaz çünkü satır çok uzun olur, ifadenin okunması çok zor olur veya yukarıdaki diğer stil yönergeleri nedeniyle. Böyle bir durumda ifade birden çok satıra yayılır.
Bir devam satırı bir ifadenin veya alt ifadenin parçasıysa, o zaman uygun sütunda hizalamalısınız, böylece ifadenin hangi parçası olduğunu söylemek kolay olur. Operatörler devam satırlarını başlatmamalıdır. Diğer durumlarda 2 boşluklu girinti kılavuzunu izleyin. İşte libcurl'den bazı örnekler:
if(Curl_pipeline_wanted(handle->multi, CURLPIPE_HTTP1) &&
(handle->set.httpversion != CURL_HTTP_VERSION_1_0) &&
(handle->set.httpreq == HTTPREQ_GET ||
handle->set.httpreq == HTTPREQ_HEAD))
/* did not ask for HTTP/1.0 and a GET or HEAD */
return TRUE;
Parantez yoksa, varsayılan girintiyi kullanın:
data->set.http_disable_hostname_check_before_authentication =
(0 != va_arg(param, long)) ? TRUE : FALSE;
Açık bir parantez ile fonksiyon çağırma:
if(option) {
result = parse_login_details(option, strlen(option),
(userp ? &user : NULL),
(passwdp ? &passwd : NULL),
NULL);
}
"Mevcut açık" parantez ile hizalama:
DEBUGF(infof(data, "Curl_pp_readresp_ %d bytes of trailing "
"server response left\n",
(int)clipamount));
Platforma bağımlı kod
Koşullu kod yapmak için #ifdef HAVE_FEATURE kullanın. #ifdef satırlarında belirli işletim sistemlerini veya donanımları kontrol etmekten kaçınırız. HAVE_FEATURE, unix benzeri sistemler için configure betiği tarafından oluşturulmalı ve diğerleri için config-[system].h dosyalarında sabit olarak kodlanmalıdır.
Ayrıca, kodu sorunsuz hale getirmek için, libcurl o özellik olmadan oluşturulduğunda muhtemelen boş olan veya sabitlere tanımlanan makroların/işlevlerin kullanılmasını teşvik ediyoruz. magic() işlevinin bir derleme zamanı koşuluna (build-time conditional) bağlı olarak farklı çalıştığı bu örnek gibi:
#ifdef HAVE_MAGIC
void magic(int a)
{
return a + 2;
}
#else
#define magic(x) 1
#endif
int content = magic(3);
Typedef edilmiş struct'lar yok
Struct'ları kesinlikle kullanın, ancak onları typedef yapmayın. Onları tanımlamanın struct name yolunu kullanın:
struct something {
void *valid;
size_t way_to_write;
};
struct something instance;
Uygun değil:
typedef struct {
void *wrong;
size_t way_to_write;
} something;
something instance;
Katkıda bulunma
Katkıda bulunmak, yardım etmek demektir.
Projeye herhangi bir şekilde katkıda bulunduğunuzda—kod, dokümantasyon, hata düzeltmeleri, öneriler veya sadece iyi tavsiyeler—bunu izinle yaptığınızı ve bize bu katkıyı sağlarken herhangi bir sözleşmeyi veya yasayı ihlal etmediğinizi varsayıyoruz. İzniniz yoksa, katkıda bulunmayın.
curl gibi bir projeye katkıda bulunmak birçok farklı şey olabilir. Kaynak kodu ürünleri oluşturmak için gereken şey olsa da, aynı zamanda iyi dokümantasyona, test etmeye (hem test kodu hem de test altyapısı), web içeriğine, kullanıcı desteğine ve daha fazlasına da güveniyoruz.
Değişikliklerinizi veya önerilerinizi ekebe gönderin ve birlikte çalışarak sorunları çözebilir, işlevselliği geliştirebilir, belgeleri netleştirebilir, özellikler ekleyebilir veya yardım ettiğiniz diğer her şeyin doğru yere ulaşmasını sağlayabiliriz. İyileştirilmiş kodun ve belgelerin kaynak ağacına düzgün bir şekilde birleştirildiğinden (merge) ve diğer katkı türlerinin uygun şekilde alındığından emin oluruz.
Katkılarınızı bir posta listesine gönderin, bir sorun (issue) açın veya bir çekme isteği (pull request) gönderin.
Öneriler
Fikirler kolaydır, uygulamalar zordur. Evet, ne yapılması gerektiği ve nasıl yapılması gerektiği konusundaki iyi fikirleri ve önerileri takdir ediyoruz, ancak fikri gerçeğe dönüştürmeye katılmaya gönüllü olursanız, fikirlerin gerçek özelliklere dönüşme şansı önemli ölçüde artar.
Zaten TODO belgesinde fikirleri topluyoruz ve genel olarak popüler ağ protokollerindeki mevcut trendlerin farkındayız, bu yüzden genellikle bunları bize hatırlatmanıza gerek yoktur.
Ne eklenmeli
curl veya libcurl'e herhangi bir şey eklemek için en iyi yaklaşım, elbette, önce fikri ve öneriyi curl proje ekibi üyelerine getirmek ve onlarla fikrin dahil edilmesinin mümkün olup olmadığını ve ardından bir uygulamanın en iyi nasıl yapılacağını—ve istediğiniz buysa kaynak kodu deposuna birleştirilmek için mümkün olan en iyi şekilde nasıl yapılacağını—tartışmaktır.
Proje genellikle mevcut protokoller için desteği iyileştiren işlevleri, özellikle popüler istemcilerin veya tarayıcıların sahip olduğu ancak curl'ün hala eksik olduğu özellikleri onaylar.
Elbette, projeye kod olmayan içerikler de ekleyebilirsiniz; dokümantasyon, grafikler veya web sitesi içerikleri gibi, ancak genel kurallar bunlar için de aynı şekilde geçerlidir.
Sahip olduğunuz bir sorunu veya başkalarının bildirdiği bir sorunu düzeltiyorsanız, düzeltmelerinizi almaktan ve bunları mümkün olan en kısa sürede birleştirmekten heyecan duyarız.
Ne eklenmemeli
Hangi özellikleri ekleyip ekleyemeyeceğinizi veya neleri asla kabul etmeyeceğimizi söyleyen iyi kurallar yoktur, ancak daha az sürtünme yaşamak ve daha hızlı başarılı olmak için kaçınmanız gereken birkaç şeyden bahsetmeye çalışayım:
-
Önce devasa bir yama (patch) yazıp sonra tartışmak için listeye göndermeyin. Her zaman listede tartışarak başlayın ve tasarımınız ve yaklaşımınız hakkında geri bildirim almak için ilk inceleme isteklerinizi erken gönderin. Bu, sonunda yeniden yazılması gerekebilecek bir yolda zaman kaybetmenizi önler.
-
Koda yeni şeyler eklerken, zaten var olan stili ve mimariyi takip etmeniz gerekir. Normal transfer kodu yoluna (code path) kod eklediğinizde, örneğin, engellemeyen (non-blocking) bir şekilde asenkron olarak çalışması gerekir. Engelleme davranışları getiren yeni kodları kabul etmiyoruz—henüz kaldıramadığımız bunlardan zaten çok fazla var.
-
Çalıştırmadığınız platformlarda veya bilmediğiniz mimarilerde çalışmama riski yüksek olan hızlı hack'ler veya kirli çözümler. Aceleniz olup olmaması veya sizin için çalışıyor olması umrumuzda değil. Yüksek riskli kodu veya okunması veya anlaşılması zor kodu kabul etmiyoruz.
-
Derlemeyi (build) bozan kod. Elbette, bazen belirli alanlara, yeni işlevselliğin belki de belirli bir 3. taraf kütüphanesine veya belirli bir işletim sistemine ve benzerlerine bağlı olmasını sağlayan kod eklememiz gerektiğini kabul ediyoruz, ancak bunu asla diğer tüm sistemler pahasına yapamayız. Derlemeyi bozmuyoruz ve tüm testlerin başarıyla çalışmaya devam ettiğinden emin oluyoruz.
git
Tercih ettiğimiz kaynak kontrol aracımız git'tir.
git bazen öğrenmesi ve ustalaşması en kolay araç olmasa da, sıradan bir geliştiricinin ve katkıda bulunan kişinin bilmesi gereken tüm temel adımlar basittir ve öğrenmesi çok fazla zaman veya çaba gerektirmez.
Bu kitap size git öğrenmenizde yardımcı olmaz. Bu devirde tüm yazılım geliştiricileri zaten git öğrenmelidir.
curl git ağacına https://github.com/curl/curl adresindeki GitHub sayfamızdan bir web tarayıcısı ile göz atılabilir.
curl kaynak kodunu git'ten çekmek (check out) için şu şekilde klonlayabilirsiniz:
git clone https://github.com/curl/curl.git
Çekme isteği (Pull request)
Kendi değişikliklerinizi yapmanın ve bunları projeye geri katkıda bulunmanın popüler ve kullanışlı bir yolu, GitHub üzerinde sözde bir çekme isteği (pull request) yapmaktır.
İlk olarak, Github web sitesinde kaynak ağacının kendi sürümünü, yani bir çatalını (fork) oluşturursunuz. Bu sayede, yerel bir kopyaya klonlayabileceğiniz curl git ağacının kendi sürümüne sahip olursunuz.
Kendi yerel kopyanızı düzenler, değişiklikleri işler (commit), bunları Github'daki git deposuna gönderir (push) ve ardından Github web sitesinde orijinal curl deposunun yerel depo klonuna yaptığınız değişikliklere dayanarak bir çekme isteği oluşturmayı seçebilirsiniz.
Çekme isteği için tasarladığınız çalışmanızı master dalında (branch) değil, ayrı bir özel dalda yapmanızı öneririz; bu sadece bir çekme isteğini güncellemenizi, örneğin incelemeden sonra veya bunun bir çıkmaz sokak olduğunu fark edip sadece çöpe atmaya karar verirseniz, daha kolay hale getirmek içindir.
Posta listesi için bir yama yapın
Bir çekme isteği yapmamayı tercih etseniz ancak yamayı curl-library posta listesine gönderme şeklindeki eski moda ve güvenilir yöntemi tercih etseniz bile, yerel bir git dalında çalışmak ve değişikliklerinizi orada işlemek (commit) yine de iyi bir uygulamadır.
Bir dal, değiştirmeler gerektiğinde düzenlemeyi ve yeniden temellendirmeyi (rebase) kolaylaştırır ve yukarı akışta (upstream) güncellemeler olduğunda master dalıyla senkronize kalmayı kolaylaştırır.
İşlemeleriniz (commits) posta listesine gönderilecek kadar iyi olduğunda, git format-patch ile yamalar oluşturur ve gönderirsiniz. Daha da meraklı kullanıcılar doğrudan git send-email'e gider ve e-postanın kendisini git'e gönderttirir.
git işleme (commit) stili
Git'e bir yama işlediğinizde (commit), ona işlediğiniz değişikliği açıklayan bir işleme mesajı verirsiniz. Projede kullanmanızı istediğimiz belirli bir stilimiz var:
[alan]: [ana etkiyi açıklayan kısa satır]
[yukarıdaki tek satırı geri kalanından boş bir satırla ayırın]
[bu değişikliğin neden yapıldığına ve muhtemelen neleri düzelttiğine
ve ilgili diğer her şeye dair mümkün olduğunca çok şeyi açıklayan,
72 sütundan geniş olmayan tam açıklama]
[Bug: raporun kaynağına bağlantı veya daha fazla ilgili tartışma]
[Reported-by: John Doe—raporlayan kişiye atıf]
[whatever-else-by: tüm yardımcılara, bulanlara, yapanlara atıf]
Başkasının çalışmasını işliyorsanız git commit --author="Jane Doe <jane@example.com>" kullanmayı unutmayın ve aşağıdaki komutlarla işlemeden önce git'te kendi Github kullanıcı adınızın ve e-postanızın doğru ayarlandığından emin olun:
git config --global user.name "johndoe"
git config --global user.email "johndoe@example.com"
Yazar ve *-by: satırları elbette projede uygun krediyi verdiğimizden emin olmak içindir. Başkasının çalışmasını, nereden geldiğini açıkça belirtmeden almak istemiyoruz. Doğru krediyi vermek son derece önemlidir.
İçeriye neyin gireceğine kim karar verir?
İlk olarak, herkes için açık olmayabilir ancak işlemeleri (commits) gerçek resmi git deposuna birleştirebilen (merge) sadece sınırlı sayıda insan vardır. Onlara çekirdek ekip (core team) diyelim.
Diğer herkes değişiklikleri işleyip (commit) gönderebileceği (push), çevrimiçi barındırabileceği ve kendi curl sürümlerini oluşturabileceği kendi curl deposunu çatallayabilir (fork), ancak değişiklikleri resmi depoya almak için güvenilir bir kişi tarafından gönderilmeleri (push) gerekir.
Çekirdek ekip, birkaç yıldır buralarda olan, yetenekli geliştiriciler olduklarını ve bu projede yaptığımız geliştirme değerlerini ve stilini tam olarak kavradıklarını gösteren küçük bir curl geliştiricileri kümesidir. Onlar Geliştirme ekibi bölümünde listelenen kişilerden bazılarıdır.
Her zaman bir tartışmayı posta listesine getirebilir ve değişikliklerinizin neden kabul edilmesi gerektiğini tartışabilir veya belki de içeri giren diğer değişikliklere itiraz edebilirsiniz vb. Kendinizi veya başka birini "gönderme hakları" (push rights) verilmesi ve o ekipteki seçilmiş birkaç kişiden biri olması için bile önerebilirsiniz.
Daniel proje lideri olmaya devam ediyor ve nadiren ihtiyaç duyulsa da, her iki yöne de sallanmayan veya fikir birliğine varılamayan tartışmalarda son sözü o söylüyor.
Güvenlik açıklarını bildirme
Bilinen ve halka açık tüm curl veya libcurl ile ilgili güvenlik açıkları curl web sitesi güvenlik sayfasında listelenmiştir.
Soruna erişimi yalnızca raporlayan kişi ve projenin güvenlik ekibiyle sınırlayacak gerekli yapılandırma mevcut olmadığı sürece, güvenlik açıkları projenin halka açık hata izleyicisine (bug tracker) girilmemelidir.
Güvenlik açığı yönetimi
Yeni bir güvenlik açığını ele almanın tipik süreci aşağıdaki gibidir.
Bu sürecin sonunda resmi olarak duyurulana kadar bir güvenlik açığı hakkında hiçbir bilgi halka açıklanmamalıdır. Bu, örneğin, sorunu izlemek için bir hata izleyici girişinin OLUŞTURULMAMASI gerektiği anlamına gelir çünkü bu sorunu halka açık hale getirir ve projenin halka açık posta listelerinde tartışılmamalıdır. Ayrıca, halka açık duyurudan önce yapıldıysa, herhangi bir işlemeyle (commit) ilişkili mesajlar, işlemenin güvenlik doğasına herhangi bir atıfta bulunmamalıdır.
-
Sorunu keşfeden kişi, raporlayan, güvenlik açığını https://hackerone.com/curl adresinde bildirir. Oraya dosyalanan sorunlar bir avuç seçilmiş ve güvenilir kişiye ulaşır.
-
curl veya libcurl'deki açıklanmamış bir güvenlik açığının raporlanması veya yönetilmesiyle ilgili olmayan mesajlar yok sayılır ve başka bir işlem gerekmez.
-
Güvenlik ekibinden bir kişi, raporu aldığını bildirmek için orijinal raporlayıcıya bir e-posta gönderir.
-
Güvenlik ekibi raporu araştırır ve reddeder ya da kabul eder.
-
Rapor reddedilirse, ekip raporlayıcıya nedenini açıklamak için yazar.
-
Rapor kabul edilirse, ekip raporlayıcıya kabul edildiğini ve bir düzeltme üzerinde çalıştıklarını bildirmek için yazar.
-
Güvenlik ekibi sorunu tartışır, bir düzeltme geliştirir, sorunun etkisini değerlendirir ve bir yayın takvimi önerir. Bu tartışma, raporlayıcıyı mümkün olduğunca dahil etmelidir.
-
Bilginin yayınlanması mümkün olan en kısa sürede olmalıdır ve en sık olarak düzeltmeyi içeren yaklaşan bir sürümle senkronize edilir. Raporlayan veya başka biri bir sonraki planlanan sürümün çok uzak olduğunu düşünürse, güvenlik nedenleriyle ayrı bir erken sürüm düşünülebilir.
-
Sorunun ne olduğunu, etkisini, hangi sürümleri etkilediğini, herhangi bir çözümü veya geçici çözümü ve düzeltmenin ne zaman yayınlandığını açıklayan, tüm katkıda bulunanlara düzgün bir şekilde atıfta bulunulan sorun hakkında bir güvenlik tavsiyesi taslağı yazın.
-
HackerOne'ın bu amaçla formunu kullanarak bir CVE numarası (Common Vulnerabilities and Exposures) isteyin.
-
Güvenlik tavsiyesini CVE numarası ile güncelleyin.
-Yaklaşan halka açık güvenlik açığı duyurusu hakkında onları hazırlamak için distros@openwall'u bilgilendirmeyi düşünün - bilgi için tavsiye taslağını ekleyin. 'Distros'un 14 günden uzun bir ambargoyu kabul etmediğini ve Windows'a özgü kusurları umursamadığını unutmayın.
-
Güvenlik ekibi, düzeltmeyi özel bir dalda (private branch) işler (commits). İşleme mesajı ideal olarak CVE numarasını içermelidir. Bu düzeltme genellikle halka açık duyurudan önce düzeltmeyi kullanmalarına izin vermek için 'distros' posta listesine de dağıtılır.
-
Bir sonraki sürüm gününde, özel dal master dalına birleştirilir (merged) ve gönderilir (pushed). Gönderildikten sonra, bilgi halka erişilebilir olur ve gerçek sürüm hemen ardından gelmelidir.
-
Proje ekibi, düzeltmeyi içeren bir sürüm oluşturur.
-
Proje ekibi, sürümü ve güvenlik açığını dünyaya her zaman sürümleri duyurduğumuz şekilde duyurur—curl-announce, curl-library ve curl-users posta listelerine gönderilir.
-
Web sitesindeki güvenlik web sayfası yeni güvenlik açığından bahsetmelidir.
curl-security@haxx.se
Bu listede kimler var? Karşılamanız gereken birkaç kriter var ve ardından listeye katılmanızı isteyebiliriz veya siz katılmayı isteyebilirsiniz. Gerçekten resmi değil. Sadece curl projesinde uzun vadeli bir varlığınız olmasını ve projeyi ve çalışma şeklini anladığınızı göstermenizi istiyoruz. İyi bir süredir buralarda olmalısınız ve yakın gelecekte ortadan kaybolma planlarınız olmamalı.
Katılımcı listesini halka açık yapmıyoruz çünkü çoğunlukla zamanla biraz değişme eğilimindedir ve bir yerdeki liste sadece güncelliğini yitirme riski taşır.
Web sitesi
curl web sitesinin çoğu, genellikle aynı kişiler için ilginç olmadığından ve gönderme haklarına (push rights) sahip farklı bir kişi listesini sürdürebildiğimizden vb., kaynak kodu deposundan ayrı olsa da, genel bir git deposunda da mevcuttur.
Web sitesi git deposu GitHub'da şu URL'de mevcuttur: https://github.com/curl/curl-www ve web kodunun bir kopyasını şu şekilde klonlayabilirsiniz:
git clone https://github.com/curl/curl-www.git
Web sitesini oluşturma (Building the web)
Web sitesi, çoğunlukla bir dizi kaynak dosyadan statik HTML dosyaları oluşturan özel yapım bir kurulumdur. Kaynak dosyalar, fcpp adı verilen güçlendirilmiş bir C önişlemcisi ve bir dizi perl komut dosyası ile ön işleme tabi tutulur. Kılavuz (man) sayfaları, roffit ile HTML'e dönüştürülür. fcpp, perl, roffit, make ve curl'ün $PATH yolunuzda olduğundan emin olun.
Git deposunu ilk kez klonladığınızda, bir sembolik bağ ve bazı ilk yerel dosyaların kurulumunu almak için sh bootstrap.sh komutunu bir kez çağırın ve ardından kaynak kök ağacında make komutunu çağırarak web sitesini yerel olarak oluşturabilirsiniz.
Bunun sizi tam bir web sitesi aynası (mirror) yapmadığını, bazı komut dosyalarının ve dosyaların yalnızca gerçek sitede mevcut olduğunu unutmayın, ancak çoğu HTML sayfasını yerel olarak görüntülemenize izin verecek kadarını vermelidir.
Yerel bir klon çalıştırın
Web sitesi, üretimdeki resmi siteye göndermeden (push) önce değişikliklere göz atmak ve test etmek için yerel bir kopyayı barındırmayı kolay ve rahat hale getirecek bir şekilde oluşturulmuştur. Daha sonra siteye curl.local adını vermenizi ve bunu yerel /etc/hosts dosyanıza bir giriş olarak eklemenizi öneririz. Ardından HTTP sunucunuzun belge kökünü (document root) curl-www kaynak kodu köküne yönlendirin.
Web sitesi altyapısı
- Halka açık curl web sitesi curl.se adresinde barındırılmaktadır.
- Alan adı Daniel Stenberg'e aittir
- Ana kaynak makine Haxx tarafından desteklenmektedir (sponsor)
- curl.se alanı, Kirei tarafından desteklenen herhangi bir noktaya dağıtılmış (anycast distributed) DNS sunucuları tarafından sunulmaktadır
- Site dünyaya Fastly tarafından işletilen bir CDN aracılığıyla sunulmaktadır
- Web sitesi her N dakikada bir GitHub'dan kendini günceller. CDN ön uçları içeriği Y dakika önbelleğe alır (farklı türler içeriği farklı sürelerde önbelleğe alır)
curl ve libcurl derleme
Bu projenin kaynak kodu, mümkün olduğunca az kısıtlama ve gereksinimle hemen hemen her işletim sisteminde ve platformda derlenmesine ve oluşturulmasına izin verecek şekilde yazılmıştır.
32 bit (veya daha büyük) bir CPU mimarisine sahipseniz, C89 uyumlu bir derleyiciniz varsa ve kabaca POSIX destekleyen bir soket API'niz varsa, o zaman muhtemelen hedef sisteminiz için curl ve libcurl derleyebilirsiniz.
En popüler platformlar için curl projesi, kendi başınıza kolayca derlemenize izin vermek için zaten yapılmış ve hazırlanmış derleme sistemleriyle birlikte gelir.
Ayrıca curl ve libcurl'ün ikili (binary) paketlerini bir araya getiren ve bunları indirmeye sunan dost canlısı insanlar ve kuruluşlar da vardır. Farklı seçenekler aşağıda incelenmiştir.
En son sürüm?
curl web sitesine bakarak projeden yayınlanan en son curl ve libcurl sürümünü görebilirsiniz. Bu, alabileceğiniz en son kaynak kodu sürüm paketidir.
İşletim sisteminiz veya tercih ettiğiniz dağıtım için önceden oluşturulmuş ve paketlenmiş bir sürümü tercih ettiğinizde, her zaman en son sürümü bulamayabilirsiniz, ancak birisinin ortamınız için paketlediği en son sürümle yetinmeniz veya kaynaktan kendiniz derlemeniz gerekebilir.
curl projesi ayrıca şu URL'de biraz daha makine tarafından okunabilir bir formatta en son sürüm hakkında bilgi sağlar: https://curl.se/info.
Sürüm (Releases) kaynak kodu
curl projesi, iki ürün olan curl ve libcurl'ü üretmek için derlenebilen kaynak kodu oluşturur. Kaynak kodundan ikili dosyalara (binaries) dönüştürme işlemine genellikle "derleme" (building) denir. curl ve libcurl'ü kaynaktan derlersiniz.
curl projesi herhangi bir derlenmiş ikili dosya sağlamaz — sadece kaynak kodunu gönderir. curl web sitesinin indirme sayfasında bulunan ve İnternet'teki diğer yerlerden yüklenen ikili dosyaların tümü, diğer dost canlısı insanlar ve kuruluşlar tarafından derlenmiş ve dünyaya sunulmuştur.
Kaynak kodu, C kodu içeren çok sayıda dosyadan oluşur. Genel olarak konuşursak, curl'ün desteklediği tüm platformlar ve bilgisayar mimarileri için ikili dosyalar oluşturmak üzere aynı dosya seti kullanılır. curl çok sayıda platformda derlenebilir ve çalıştırılabilir. Nadir bir işletim sistemi kullanıyorsanız, curl'ü kaynaktan derlemek, curl'ü edinmenin en kolay veya belki de tek yolu olabilir.
Her zaman başarılı olamasak da, curl'ü derlemeyi kolaylaştırmak curl projesi için bir önceliktir.
git vs sürüm tarball'ları
Sürüm tarball'ları oluşturulduğunda, birkaç dosya oluşturulur ve son sürüm paketine dahil edilir. Bu oluşturulan dosyalar git deposunda mevcut değildir, çünkü bunlar oluşturulmuştur ve bunları git'te saklamaya gerek yoktur.
Elbette, git deposunda bulunan en son sürümü derlemeyi de tercih edebilirsiniz. Ancak bu biraz daha kırılgandır ve muhtemelen ayrıntılara biraz daha fazla dikkat gerektirir.
curl'ü bir git checkout'undan derlerseniz, derlemeden önce bazı dosyaları kendiniz oluşturmanız gerekir. Linux ve Unix benzeri sistemlerde bunu autoreconf -fi çalıştırarak, Windows'ta ise buildconf.bat çalıştırarak yapın.
Linux ve Unix benzeri sistemlerde
Linux ve diğer Unix benzeri sistemlerde curl derlemenin belirgin şekilde iki farklı yolu vardır; biri configure betiğini kullanan yol, diğeri ise CMake yaklaşımıdır.
İnsanların farklı görüşlerine ve zevklerine hitap etmek için iki farklı derleme ortamı vardır. Configure tabanlı derleme, tartışmasız daha olgun ve daha kapsamlı derleme sistemidir ve muhtemelen varsayılan olarak kabul edilmelidir.
Windows'ta
Windows'ta derleme yapmanın en az dört farklı yolu vardır. Yukarıda belirtilen yollar, CMake yaklaşımı ve msys ile configure kullanmak işe yarar, ancak daha popüler ve yaygın yöntemler muhtemelen Microsoft'un Visual Studio derleyicisini nmake veya proje dosyaları kullanarak derlemektir. windows üzerinde derleme bölümüne bakın.
Daha fazlasını öğrenin
- Autotools - configure ile derleme
- CMake
- Ayrı kurulum (Separate install)
- Windows'ta - Windows'a özgü derleme yolları
- Bağımlılıklar
- TLS kütüphaneleri
Autotools
Autotools, configure betiğini oluşturmak için birlikte kullanılan farklı araçlardan oluşan bir koleksiyondur. Configure betiği, curl derlemek isteyen kullanıcı tarafından çalıştırılır ve bir sürü şey yapar:
-
Sisteminizde bulunan özellikleri ve işlevleri kontrol eder.
-
Bir derleyici (builder) olarak derlemede neyi etkinleştireceğinize ve devre dışı bırakacağınıza karar verebilmeniz için komut satırı seçenekleri sunar. Özellikler ve protokoller vb., hatta derleyici uyarı seviyeleri ve daha fazlası açılıp kapatılabilir.
-
Derleyicinin (builder), curl'ün kullanmak üzere derlenebileceği çeşitli üçüncü taraf bağımlılıkları için belirli kurulum yollarını işaret etmesine izin veren komut satırı seçenekleri sunar.
-
Sonuçta derleme yapıldığında ve
make installçağrıldığında oluşturulan kurulumun hangi dosya yoluna yerleştirileceğini belirtir.
En temel kullanımda, kaynak dizininde sadece ./configure çalıştırmak yeterlidir. Betik tamamlandığında, algıladığı/etkinleştirdiği seçeneklerin ve hala devre dışı olan özelliklerin bir özetini verir; bunlardan bazıları muhtemelen bu işlevlerin çalışması için gereken gerekli üçüncü taraf bağımlılıklarının varlığını algılayamadığı içindir. Özet beklediğiniz gibi değilse, configure'u yeni seçeneklerle veya daha önce kullanılan seçenekleri ayarlayarak tekrar çağırın.
Configure tamamlandıktan sonra, her şeyi derlemek için make komutunu ve son olarak curl, libcurl ve ilgili şeyleri kurmak için make install komutunu çağırırsınız. make install, sisteminizde kurulum dizininde dosya oluşturmak ve yazmak için doğru haklara sahip olmanızı gerektirir, aksi takdirde bir hata görüntülenir.
Çapraz derleme (Cross-compiling)
Çapraz derleme, kaynağı bir mimaride derlediğiniz ancak çıktının farklı bir mimaride çalıştırılmak üzere oluşturulduğu anlamına gelir. Örneğin, kaynağı bir Linux makinesinde derleyebilir ancak çıktının bir Windows makinesinde çalışmasını sağlayabilirsiniz.
Çapraz derlemenin çalışması için, derlemek istediğiniz belirli hedef sistem için özel bir derleyici ve derleme sistemi kurulumuna ihtiyacınız vardır. Bu sistemin nasıl edinileceği ve kurulacağı bu kitapta ele alınmamaktadır.
Bir çapraz derleyiciniz olduğunda, configure'a curl derlerken yerel (native) derleyici yerine o derleyiciyi kullanmasını söyleyebilirsiniz, böylece sonuç diğer makineye taşınabilir ve orada kullanılabilir.
Statik bağlama (Static linking)
Varsayılan olarak, configure derleme dosyalarını, aşağıdaki 'make' komutunun libcurl'ün hem paylaşılan hem de statik sürümlerini oluşturacağı şekilde ayarlar. Bunu configure'a --disable-static veya --disable-shared seçeneklerini vererek değiştirebilirsiniz.
Paylaşılan kütüphaneler yerine üçüncü taraf kütüphanelerin statik sürümleriyle derlemek isterseniz, kendinizi yokuş yukarı bir savaşa hazırlamanız gerekir. curl'ün configure betiği, paylaşılan kütüphanelerle kurulum yapmaya ve derlemeye odaklanmıştır.
Statik bir kütüphane ile bağlama ile paylaşılan bir kütüphane ile bağlama arasındaki farklardan biri, paylaşılan kütüphanelerin kendi bağımlılıklarını nasıl ele aldığı, statik olanların ise almadığıdır. xyz kütüphanesini paylaşılan bir kütüphane olarak bağlamak için, xyz'nin kendisinin kullanmak üzere oluşturulduğu diğer kütüphaneler ne olursa olsun, bağlayıcı (linker) komut satırına -lxyz eklemek temel olarak yeterlidir. Ancak, eğer bu xyz bunun yerine statik bir kütüphaneyse, xyz'nin her bir bağımlılığını da bağlayıcı komut satırında belirtmemiz gerekir. curl'ün configure betiği, birlikte derlenebileceği tüm kütüphaneler için tüm olası bağımlılıklara ayak uyduramaz veya bunları bilemez, bu nedenle statik kütüphanelerle derlemek isteyen kullanıcıların çoğunlukla bağlanacak kütüphanelerin listesini sağlaması gerekir.
TLS arka ucunu seçin
Configure tabanlı derleme, kullanıcıya derleme sırasında çok çeşitli farklı TLS kütüphaneleri arasından seçim yapma olanağı sunar. Doğru komut satırı seçeneklerini kullanarak bunları seçersiniz. curl 7.77.0'dan önce, configure betiği OpenSSL'i otomatik olarak kontrol ederdi, ancak modern sürümler etmez.
- AmiSSL:
--with-amissl - AWS-LC:
--with-openssl - BearSSL:
--with-bearssl - BoringSSL:
--with-openssl - GnuTLS:
--with-gnutls - LibreSSL:
--with-openssl - mbedTLS:
--with-mbedtls - OpenSSL:
--with-openssl - Rustls:
--with-rustls(rustls-ffi kurulum yolunu gösterin) - Schannel:
--with-schannel - Secure Transport:
--with-secure-transport - wolfSSL:
--with-wolfssl
Hangi TLS kütüphanesinin kullanılacağını belirtmezseniz, configure betiği başarısız olur. TLS desteği olmadan derlemek isterseniz, bunu --without-ssl ile açıkça istemeniz gerekir.
Bu --with-* seçenekleri, configure'un belirli kütüphaneyi söylediğiniz yerde araması için kurulum önekini (install prefix) sağlamanıza da olanak tanır. Şunun gibi:
./configure --with-gnutls=/home/user/custom-gnutls
Configure komut satırında birden fazla --with-* seçeneği belirterek birden fazla TLS kütüphanesi desteğiyle derlemeyi seçebilirsiniz. --with-default-ssl-backend=[ISIM] ile hangisinin varsayılan TLS arka ucu olacağını seçin. Örneğin, hem GnuTLS hem de OpenSSL desteğiyle derleyin ve OpenSSL'i varsayılan yapın:
./configure --with-openssl --with-gnutls \
--with-default-ssl-backend=openssl
SSH arka ucunu seçin
Configure tabanlı derleme, kullanıcıya derleme sırasında çeşitli farklı SSH kütüphaneleri arasından seçim yapma olanağı sunar. Doğru komut satırı seçeneklerini kullanarak bunları seçersiniz.
- libssh2:
--with-libssh2 - libssh:
--with-libssh - wolfSSH:
--with-wolfssh
Bu --with-* seçenekleri, configure'un belirli kütüphaneyi söylediğiniz yerde araması için kurulum önekini sağlamanıza da olanak tanır. Şunun gibi:
./configure --with-libssh2=/home/user/custom-libssh2
HTTP/3 arka ucunu seçin
Configure tabanlı derleme, kullanıcıya derleme sırasında farklı HTTP/3 kütüphaneleri arasından seçim yapma olanağı sunar. Doğru komut satırı seçeneklerini kullanarak bunları seçersiniz.
- quiche:
--with-quiche - ngtcp2:
--with-ngtcp2 --with-nghttp3 - msh3:
--with-msh3
CMake
CMake, Windows dahil çoğu modern platformda çalışan alternatif bir derleme yöntemidir. Bu yöntemi kullanarak önce derleme makinenizde cmake kurulu olması gerekir, derleme dosyalarını oluşturmak için cmake'i çağırın ve ardından derleyin. cmake'in -G bayrağıyla, dosyaların hangi derleme sistemi için oluşturulacağını seçersiniz. cmake kurulumunuzun desteklediği "oluşturucuların" (generators) listesi için cmake --help komutuna bakın.
Cmake komut satırında, ilk argüman cmake kaynak dosyalarının nerede bulunacağını belirtir; aynı dizindeyse bu . (tek bir nokta) olur.
Linux'ta aynı dizindeki CMakeLists.txt ile düz make kullanarak derlemek için şunları yapabilirsiniz:
cmake -G "Unix Makefiles" .
make
Veya orada unix makefile'larının varsayılan olduğu gerçeğine güvenebilirsiniz:
cmake .
make
Derleme için bir alt dizin oluşturmak ve orada make çalıştırmak için:
mkdir build
cd build
cmake ..
make
Ayrı kurulum
Bazen curl ve libcurl'ü kaynaktan derlediğinizde, bunu deneme, test etme veya belki de hata ayıklama amacıyla yaparsınız. Bu senaryolarda, sistem genelindeki libcurl kurulumunuzu değiştirmeye hazır olmayabilirsiniz.
Birçok modern sistemde zaten sistemde kurulu libcurl vardır, bu nedenle test sürümünüzü derleyip kurduğunuzda, amaçlarınız için yeni derlemenizin kullanıldığından emin olmanız gerekir.
Kendi curl ve libcurl sürümünü derleyip kuran ancak daha sonra yeni curl derlemelerini çağırdıklarında yeni aracın sistemde daha eski bir libcurl bulup onun yerine onu kullandığını söyleyen insanlardan çok sayıda rapor alıyoruz. Bu durum kullanıcıların kafasını karıştırma eğilimindedir.
Statik bağlama
Bunun yerine libcurl ile statik olarak bağlayarak curl'ün daha eski bir dinamik libcurl kütüphanesi bulması sorunundan kaçınabilirsiniz. Ancak bu, bunun yerine bir yığın başka zorluğu tetikler çünkü modern kütüphaneleri birkaç üçüncü taraf bağımlılığıyla statik olarak bağlamak zor bir iştir. Statik olarak bağladığınızda, tüm bağımlılıkları bağlayıcıya (linker) sağladığınızdan emin olmanız gerekir. Bu önerdiğimiz bir yöntem değildir.
Dinamik bağlama
Modern bir sistemde curlü çağırdığınızda, yürütülebilir dosyanın kullanmak üzere oluşturulduğu paylaşılan kütüphaneleri yükleyen bir çalışma zamanı bağlayıcısı (genellikle ld.so olarak adlandırılır) vardır. Paylaşılan kütüphaneler bir dizi yolda (paths) aranır ve yüklenir.
Sorun genellikle sistem libcurl kütüphanesinin o yolda mevcut olması, ancak yeni derlediğiniz libcurl'ün olmamasıdır. Veya her ikisi de yolda mevcuttur ancak önce sistemdeki bulunur.
Çalışma zamanı bağlayıcı yol sırası genellikle Linux sistemlerinde /etc/ld.so.conf dosyasında tanımlanır. Sıralamayı değiştirebilir ve aranacak dizinler listesine yeni dizinler ekleyebilirsiniz. Bir güncellemeden sonra ldconfig çalıştırmayı unutmayın.
Geçici kurulumlar
Bir libcurl derlerseniz ve bir yere kurarsanız ve sadece tek bir uygulama için kullanmak isterseniz veya belki de sadece bir şeyi biraz test etmek isterseniz, dinamik kütüphane yolunu düzenlemek ve değiştirmek çok müdahaleci olabilir.
Normal bir unix, önerdiğimiz birkaç başka alternatif sunar.
LD_LIBRARY_PATH
Çalışma zamanı bağlayıcısının belirli bir dizine bakmasını sağlamak için kabuğunuzda bu ortam değişkenini ayarlayabilirsiniz. Bu, bu değişkenin ayarlandığı yerde yüklenen tüm yürütülebilir dosyaları etkiler.
Hızlı kontroller için veya hatta dönüşümlü olarak kullanmak ve tek curl yürütülebilir dosyanızın farklı çağrılarda farklı libcurl'ler kullanmasını sağlamak istiyorsanız kullanışlıdır.
Yeni curl derlemenizi $HOME/install dizinine kurduğunuzda şöyle görünebilir:
export LD_LIBRARY_PATH=$HOME/install/lib
$HOME/install/bin/curl https://example.com/
rpath
Genellikle, sisteminki yerine kendi ayrı libcurl'ünüzü yüklemeye zorlamanın daha iyi bir yolu, derlediğiniz belirli curl yürütülebilir dosyasının rpathini ayarlamaktır. Bu, çalışma zamanı bağlayıcısına bu belirli yürütülebilir dosya için kontrol etmesi gereken belirli bir yol verir.
Bu, bağlama zamanında (link time) yapılır ve uygulamanızı kullanarak kendi libcurl'ünüzü derlerseniz, özel libcurl derlemenizi bunun gibi yüklemesini sağlayabilirsiniz:
gcc -g example.c -L$HOME/install/lib -lcurl -Wl,-rpath=$HOME/install/lib
rpath ayarlandığında, $HOME/install/lib/libcurl.soya karşı bağlanan yürütülebilir dosya, çalışma zamanı bağlayıcısının o belirli yolu ve kütüphaneyi kullanmasını sağlarken, sisteminizdeki diğer ikili dosyalar sistem libcurl'ünü kullanmaya devam eder.
Kendi özel curl derlemenizin kendi libcurl'ünü kullanmasını istediğinizde ve bunları $HOME/install dizinine kurduğunuzda, bunun için bir configure komut satırı şuna benzer:
LDFLAGS="-Wl,-rpath,$HOME/install/lib" ./configure ...
Sisteminiz rpath'in runpath biçimini destekliyorsa, bunun yerine onu kullanmak genellikle daha iyidir çünkü LD_LIBRARY_PATH ortam değişkeni tarafından geçersiz kılınabilir. Ayrıca curl'ün ağaç içi (in-tree) derlemelerini test ederken libtool hatalarını da önleyebilir, çünkü o zaman libtool LD_LIBRARY_PATH kullanabilir. Daha yeni bağlayıcılar, rpath belirtildiğinde varsayılan olarak rpath'in runpath biçimini kullanabilir ancak diğerlerinin bunun gibi ek bir bağlayıcı bayrağına -Wl,--enable-new-dtags ihtiyacı vardır:
LDFLAGS="-Wl,-rpath,$HOME/install/lib -Wl,--enable-new-dtags" \
./configure ...
Windows
Windows üzerinde curl'ü birkaç farklı yolla derleyebilirsiniz. Microsoft'un MSVC derleyicisini veya ücretsiz ve açık kaynaklı mingw derleyicisini kullanmanızı öneririz. Ancak derleme süreci bunlarla sınırlı değildir.
Mingw kullanıyorsanız, autotools derleme sistemini kullanmak isteyebilirsiniz.
Visual C++ proje dosyaları
CMake kullanarak bir dizi Visual Studio proje dosyası oluşturabilirsiniz:
cmake -B build -G 'Visual Studio 17 2022'
Oluşturulduktan sonra bunları içe aktarır ve normal şekilde Visual Studio ile derlersiniz.
Bunları 32-bit Windows için bile oluşturabilirsiniz:
cmake -B build -G 'Visual Studio 17 2022' \
-DCMAKE_GENERATOR_PLATFORM=x86
Mingw
curl'ü mingw derleyici paketi ile derleyebilirsiniz. Sizin için Makefile setini oluşturmak üzere CMake kullanın:
cmake -B build -G "MinGW Makefiles"
Bağımlılıklar
İyi yazılım yapmanın anahtarı, diğer harika yazılımların üzerine inşa etmektir. Birçok kişinin kullandığı kütüphaneleri kullanarak, aynı şeyleri daha az kez yeniden icat ederiz ve aynı kodu kullanan daha fazla insan olduğu için daha güvenilir yazılımlar elde ederiz.
curl'ün sağladığı bir yığın özellik, bir veya daha fazla harici kütüphaneyi kullanacak şekilde derlenmesini gerektirir. Bunlar o zaman curl'ün bağımlılıklarıdır. Hiçbiri gerekli değildir ancak çoğu kullanıcı en azından bazılarını kullanmak ister.
HTTP Sıkıştırma
curl, uygun 3. taraf kütüphanelerle derlenirse HTTP üzerinden aktarılan verilerin otomatik olarak açılmasını (decompression) yapabilir. curl'ü bu kütüphanelerden birini veya daha fazlasını kullanacak şekilde derleyebilirsiniz:
Sıkıştırılmış verileri kablo üzerinden almak daha az bant genişliği kullanır, bu da daha kısa aktarım sürelerine neden olabilir.
c-ares
curl, asenkron isim çözümlemesi yapabilmek için c-ares ile derlenebilir. Asenkron isim çözümlemesini etkinleştirmenin bir başka seçeneği de, curl'ü iş parçacıklı isim çözümleyici arka ucuyla (threaded name resolver backend) derlemektir; bu, her isim çözümlemesi için ayrı bir yardımcı iş parçacığı oluşturur. c-ares hepsini aynı iş parçacığı içinde yapar.
nghttp2
Bu, HTTP/2 çerçevelemesini (framing) işlemek için bir kütüphanedir ve curl'ün HTTP sürüm 2'yi desteklemesi için bir ön koşuldur.
openldap
Bu kütüphane, curl'ün LDAP ve LDAPS URL şemaları için destek almasına izin veren bir seçenektir. Windows'ta, curl'ü winldap kütüphanesini kullanacak şekilde derlemeyi de tercih edebilirsiniz.
librtmp
https://rtmpdump.mplayerhq.hu/
curl'ün RTMP URL şeması desteğini etkinleştirmek için, curl'ü RTMPDump projesinden gelen librtmp kütüphanesiyle derlemelisiniz.
libpsl
https://rockdaboot.github.io/libpsl/
curl'ü libpsl desteğiyle derlediğinizde, çerez ayrıştırıcı Public Suffix List (Kamu Sonek Listesi) hakkında bilgi sahibi olur ve bu tür çerezleri uygun şekilde işler.
libidn2
https://www.gnu.org/software/libidn/libidn2/manual/libidn2.html
curl, Uluslararası Alan Adlarını (IDN) libidn2 kütüphanesinin yardımıyla işler.
SSH kütüphaneleri
curl'ün SCP ve SFTP desteğine sahip olmasını istiyorsanız, bu SSH kütüphanelerinden biriyle derleyin:
TLS kütüphaneleri
Aralarından seçim yapabileceğiniz birçok farklı TLS kütüphanesi vardır, bu yüzden bunlar ayrı bir bölümde ele alınmıştır.
QUIC ve HTTP/3
curl'ü HTTP/3 desteğiyle derlemek için şu setlerden birine ihtiyacınız vardır:
TLS kütüphaneleri
curl'ün HTTPS, FTPS, SMTPS, POP3S, IMAPS ve daha fazlası gibi TLS tabanlı protokolleri desteklemesini sağlamak için, curl TLS protokolünü kendisi uygulamadığından, üçüncü taraf bir TLS kütüphanesi ile derlemeniz gerekir.
curl, çok sayıda TLS kütüphanesi ile çalışmak üzere yazılmıştır:
- AmiSSL
- AWS-LC
- BearSSL
- BoringSSL
- GnuTLS
- libressl
- mbedTLS
- OpenSSL
- rustls
- Schannel (yerel Windows)
- Secure Transport (yerel macOS)
- WolfSSL
curl ve libcurl'ü bu kütüphanelerden birini kullanacak şekilde derlediğinizde, kütüphanenin ve include başlıklarının derleme makinenizde kurulu olması önemlidir.
configure
Aşağıda, configure'a farklı kütüphaneleri kullanmasını nasıl söyleyeceğinizi öğrenirsiniz. Configure betiği varsayılan olarak herhangi bir TLS kütüphanesi seçmez. Bir tane seçmelisiniz veya --without-ssl kullanarak configure'a TLS desteği olmadan derlemek istediğinizi belirtmelisiniz.
OpenSSL, BoringSSL, libressl
./configure --with-openssl
configure varsayılan olarak OpenSSL'i varsayılan yolunda algılar. İsteğe bağlı olarak configure'a OpenSSL'i bulabileceği özel bir kurulum yolu öneki gösterebilirsiniz:
./configure --with-openssl=/home/user/installed/openssl
Alternatifler BoringSSL ve libressl, configure'un onları OpenSSL ile aynı şekilde algılayacağı kadar benzer görünür. Daha sonra belirli türlerden hangisini kullandığını anlamak için ek önlemler kullanır.
GnuTLS
./configure --with-gnutls
configure varsayılan olarak GnuTLS'i varsayılan yolunda algılar. İsteğe bağlı olarak configure'a gnutls'i bulabileceği özel bir kurulum yolu öneki gösterebilirsiniz:
./configure --with-gnutls=/home/user/installed/gnutls
WolfSSL
./configure --with-wolfssl
configure varsayılan olarak WolfSSL'i varsayılan yolunda algılar. İsteğe bağlı olarak configure'a WolfSSL'i bulabileceği özel bir kurulum yolu öneki gösterebilirsiniz:
./configure --with-wolfssl=/home/user/installed/wolfssl
mbedTLS
./configure --with-mbedtls
configure varsayılan olarak mbedTLS'i varsayılan yolunda algılar. İsteğe bağlı olarak configure'a mbedTLS'i bulabileceği özel bir kurulum yolu öneki gösterebilirsiniz:
./configure --with-mbedtls=/home/user/installed/mbedtls
Secure Transport
./configure --with-secure-transport
configure varsayılan olarak Secure Transport'u varsayılan yolunda algılar. İsteğe bağlı olarak configure'a Secure Transport'u bulabileceği özel bir kurulum yolu öneki gösterebilirsiniz:
./configure --with-secure-transport=/home/user/installed/darwinssl
Schannel
./configure --with-schannel
configure varsayılan olarak Schannel'i varsayılan yolunda algılar.
(WinSSL daha önce Schannel için alternatif bir isimdi ve önceki curl sürümleri bunun yerine --with-winssl gerektiriyordu)
BearSSL
./configure --with-bearssl
configure varsayılan olarak BearSSL'i varsayılan yolunda algılar. İsteğe bağlı olarak configure'a BearSSL'i bulabileceği özel bir kurulum yolu öneki gösterebilirsiniz:
./configure --with-bearssl=/home/user/installed/bearssl
Rustls
./configure --with-rustls
rustls kullanması söylendiğinde, curl aslında rustls kütüphanesi için C API'si olan rustls-ffi kütüphanesini bulmaya ve kullanmaya çalışır. configure varsayılan olarak rustls-ffi'yi varsayılan yolunda algılar. İsteğe bağlı olarak configure'a rustls-ffi'yi bulabileceği özel bir kurulum yolu öneki gösterebilirsiniz:
./configure --with-rustls=/home/user/installed/rustls-ffi
BoringSSL
boringssl derleme
$HOME/src, bu örnekte kodu koyduğum yerdir. Siz istediğiniz yeri seçebilirsiniz.
$ cd $HOME/src
$ git clone https://boringssl.googlesource.com/boringssl
$ cd boringssl
$ mkdir build
$ cd build
$ cmake -DCMAKE_POSITION_INDEPENDENT_CODE=on ..
$ make
curl'ün configure betiği tarafından algılanması için derleme ağacını ayarlama
boringssl kaynak ağacı kökünde, bir lib ve bir include dizini bulunduğundan emin olun. lib dizini iki kütüphaneyi içermelidir (ben onları build dizinine sembolik bağlar (symlinks) yaptım). include dizini zaten varsayılan olarak mevcuttur. lib dizinini şu şekilde oluşturun ve doldurun (komutlar build/ alt dizininde değil, kaynak ağacı kökünde verilmiştir).
$ mkdir lib
$ cd lib
$ ln -s ../build/ssl/libssl.a
$ ln -s ../build/crypto/libcrypto.a
curl'ü yapılandırma (configure)
LIBS=-lpthread ./configure --with-ssl=$HOME/src/boringssl (boringssl ağacının kökünü işaret ettiğim yer)
Yapılandırmanın sonunda, kullanılacak BoringSSL'i algıladığını doğrulayın.
curl derleme
curl kaynak ağacında make çalıştırın.
Şimdi make install vb. ile curl'ü normal şekilde kurabilirsiniz.
Komut satırı kavramları
curl bir komut satırı aracı olarak başladı ve yıllar boyunca sayısız kullanıcı tarafından kabuk istemlerinden (shell prompts) ve komut dosyalarının içinden çağrıldı.
Çöp girerse çöp çıkar (Garbage in gives garbage out)
curl'ün kendi iradesi pek yoktur. Sizi ve isteklerinizi büyük ölçüde memnun etmeye çalışır. Bu aynı zamanda ona ne verirseniz onunla oynamaya çalıştığı anlamına gelir. Bir seçeneği yanlış yazarsanız, istenmeyen bir şey yapabilir. Biraz geçersiz bir URL verirseniz, curl'ün yine de onunla ilgilenmesi ve devam etmesi muhtemeldir. Bu, bazı seçeneklerde çılgın veriler iletebileceğiniz ve curl'ün bu çılgın verileri transfer işleminde aktarmasını sağlayabileceğiniz anlamına gelir.
Bu bir tasarım tercihidir, çünkü curl'ün protokol iletişimlerini nasıl yaptığını gerçekten ince ayar yapmanıza olanak tanır ve sunucu uygulamalarınıza en yaratıcı yollarla masaj yapmasını sağlayabilirsiniz.
- Farklılıklar
- Komut satırı seçenekleri
- Yardım
- Sürüme bağlı seçenekler
- URL'ler
- Yapılandırma dosyası (Config file)
- Değişkenler
- Parolalar
- İlerleme göstergesi
- Sürüm
- Çıkış kodu (Exit code)
- curl olarak kopyala
Farklılıklar
İkili dosyalar (Binaries) ve farklı platformlar
Komut satırı aracı curl, ikili (binary) yürütülebilir bir dosyadır. curl projesi kendi başına ikili dosyalar dağıtmaz veya sağlamaz. İkili dosyalar büyük ölçüde sisteme özgüdür ve genellikle belirli sistem sürümlerine de bağlıdır.
Farklı platformlarda farklı kişiler tarafından, farklı derleme zamanı seçenekleriyle farklı üçüncü taraf kütüphaneler kullanılarak oluşturulan farklı curl sürümleri, aracın farklı yerlerde farklı özellikler sunmasına neden olur. Ayrıca, curl sürekli olarak geliştirilmektedir, bu nedenle aracın daha yeni sürümlerinin eski sürümlerden daha fazla ve daha iyi özelliklere sahip olması muhtemeldir.
Komut satırları, tırnak işaretleri ve takma adlar (aliases)
curl'ün kullanılabileceği birçok farklı komut satırı ortamı, kabuğu ve istemi vardır. Hepsi, uyulması gereken kendi sınırlamaları, kuralları ve yönergeleriyle birlikte gelir. curl aracı, sorun çıkarmadan bunlardan herhangi biriyle çalışacak şekilde tasarlanmıştır ancak özel komut satırı sisteminizin başkalarının kullandığıyla veya başka şekilde belgelenenle uyuşmadığı zamanlar olabilir.
Komut satırı sistemlerinin farklılık gösterdiği bir yol, örneğin, boşlukları veya özel sembolleri gömmek gibi argümanların etrafına nasıl tırnak işareti koyabileceğinizdir. Çoğu Unix benzeri kabukta, tırnak içine alınmış dize içinde değişken genişletmelerine (variable expansions) izin verip vermemek istediğinize bağlı olarak çift tırnak (") ve tek tırnak (') kullanırsınız, ancak Windows'ta tek tırnak sürümü için destek yoktur.
Windows'taki PowerShell gibi bazı ortamlarda, komut satırı sisteminin yazarları daha iyisini bildiklerine karar verdiler ve bir komut satırı çalıştırıldığında öncelik alan bir takma ad sağlayarak, curl yazıldığında kullanıcının curl yerine başka bir aracı kullanmasına "yardımcı" olduzar. curl'ü PowerShell ile düzgün bir şekilde kullanmak için, uzantı dahil tam adını yazmanız gerekir: curl.exe veya takma adı kaldırın.
Farklı komut satırı ortamları farklı maksimum komut satırı uzunluklarına sahiptir ve kullanıcıları tek bir satıra ne kadar büyük miktarda veri konulacağını sınırlamaya zorlar. curl, -K seçeneğini kullanarak bir dosya veya stdin (standart girdi) aracılığıyla komut satırı seçenekleri sağlama yolu sunarak buna uyum sağlar.
Komut satırı seçenekleri
curl'e bir şey yapmasını söylediğinizde, curl'ü, transferin hakkında olmasını istediğiniz URL veya URL setine eşlik edecek sıfır, bir veya birkaç komut satırı seçeneğiyle çağırırsınız. curl iki yüzden fazla farklı seçeneği destekler.
Kısa seçenekler
Komut satırı seçenekleri, curl'e nasıl davranmasını istediğiniz hakkında bilgi aktarır. Örneğin, -v seçeneğiyle curl'den ayrıntılı (verbose) modunu açmasını isteyebilirsiniz:
curl -v http://example.com
-v burada bir "kısa seçenek" olarak kullanılır. Bunları eksi sembolü ve hemen ardından gelen tek bir harfle yazarsınız. Birçok seçenek, bir şeyi açan veya iki bilinen durum arasında bir şeyi değiştiren anahtarlardır. Sadece o seçenek adıyla kullanılabilirler. Ayrıca eksiden sonra birkaç tek harfli seçeneği birleştirebilirsiniz. Hem ayrıntılı mod hem de curl'ün HTTP yönlendirmelerini takip etmesini istemek için:
curl -vL http://example.com
curl'deki komut satırı ayrıştırıcısı her zaman tüm satırı ayrıştırır ve seçenekleri istediğiniz yere koyabilirsiniz; URL'den sonra da görünebilirler:
curl http://example.com -Lv
ve iki ayrı kısa seçenek elbette ayrı ayrı da belirtilebilir, şöyle:
curl -v -L http://example.com
Uzun seçenekler
Tek harfli seçenekler, yazılması ve kullanılması hızlı olduğu için uygundur, ancak alfabede yalnızca sınırlı sayıda harf olduğundan ve kontrol edilecek çok şey olduğundan, tüm seçenekler bu şekilde mevcut değildir. Bu nedenle bunlar için uzun seçenek adları sağlanmıştır. Ayrıca, kolaylık olması ve betiklerin daha okunabilir olması için, çoğu kısa seçeneğin daha uzun isim takma adları vardır.
Uzun seçenekler her zaman iki eksi (veya onlara ne demek isterseniz tire) ve ardından isimle yazılır ve çift eksi başına yalnızca bir seçenek adı yazabilirsiniz. Uzun seçenek formatını kullanarak ayrıntılı mod istemek şöyle görünür:
curl --verbose http://example.com
ve uzun formatı kullanarak HTTP yönlendirmelerini de istemek şöyle görünür:
curl --verbose --location http://example.com
Seçeneklere verilen argümanlar
Tüm seçenekler özellikleri etkinleştiren veya devre dışı bırakan basit boole bayrakları değildir. Bazıları için, belki bir kullanıcı adı veya bir dosyaya giden yol gibi veriler aktarmanız gerekir. Bunu önce seçeneği sonra argümanı, aralarında bir boşluk bırakarak yazarak yaparsınız. Örneğin, bir sunucuya HTTP POST ile rastgele bir veri dizesi göndermek istiyorsanız:
curl -d arbitrary http://example.com
ve seçeneğin uzun formunu kullansanız bile aynı şekilde çalışır:
curl --data arbitrary http://example.com
Kısa seçenekleri argümanlarla kullandığınızda, aslında verileri boşluk ayırıcı olmadan da yazabilirsiniz:
curl -darbitrary http://example.com
Boşluklu argümanlar
Bazen bir seçeneğe bir argüman iletmek istersiniz ve bu argüman bir veya daha fazla boşluk içerir. Örneğin, curl'ün kullandığı kullanıcı aracısı (user-agent) alanını, o üç boşluk dahil olmak üzere tam olarak I am your father olacak şekilde ayarlamak istersiniz. O zaman komut satırında curl'e iletirken dizenin etrafına tırnak işaretleri koymanız gerekir. Kullanılacak tam tırnak işaretleri kabuğunuza/komut isteminize bağlı olarak değişir, ancak genellikle çoğu yerde çift tırnak işe yarar:
curl -A "I am your father" http://example.com
Tırnak işareti kullanmamak, örneğin komut satırını şöyle yazarsanız:
curl -A I am your father http://example.com
… curl'ün kullanıcı aracısı dizesi olarak yalnızca 'I' kullanmasına neden olur ve am, your ve father dizeleri, seçenek olduklarını belirtmek için - ile başlamadıkları ve curl yalnızca seçenekleri ve URL'leri işlediği için bunun yerine ayrı URL'ler olarak ele alınır.
Dizenin kendisinin çift tırnak içermesini sağlamak için (örneğin sunucuya bir JSON dizesi göndermek istediğinizde yaygındır), tek tırnak kullanmanız gerekebilir (tek tırnakların aynı şekilde çalışmadığı Windows hariç). JSON dizesi { "name": "Darth" } gönderelim:
curl -d '{ "name": "Darth" }' http://example.com
Veya tek tırnak olayından kaçınmak isterseniz, verileri curl'e bir dosya aracılığıyla göndermeyi tercih edebilirsiniz, bu da ekstra tırnak içine almayı gerektirmez. Yukarıda belirtilen verileri içeren dosyaya 'json' dediğimizi varsayalım:
curl -d @json http://example.com
Negatif seçenekler
Bir şeyi açan seçenekler için, onu kapatmanın da bir yolu vardır. O zaman seçeneğin uzun formunu, ismin önünde bir no- öneki ile kullanırsınız. Örnek olarak, ayrıntılı modu kapatmak için:
curl --no-verbose http://example.com
Kısa seçenekler
Komut satırı seçenekleri, curl'e nasıl davranmasını istediğiniz hakkında bilgi aktarır. Örneğin, -v seçeneğiyle curl'den ayrıntılı (verbose) modunu açmasını isteyebilirsiniz:
curl -v http://example.com
-v burada bir "kısa seçenek" olarak kullanılır. Bunları eksi sembolü ve hemen ardından gelen tek bir harfle yazarsınız. Birçok seçenek, bir şeyi açan veya iki bilinen durum arasında bir şeyi değiştiren anahtarlardır. Sadece o seçenek adıyla kullanılabilirler. Ayrıca eksiden sonra birkaç tek harfli seçeneği birleştirebilirsiniz. Hem ayrıntılı mod hem de curl'ün HTTP yönlendirmelerini takip etmesini istemek için:
curl -vL http://example.com
curl'deki komut satırı ayrıştırıcısı her zaman tüm satırı ayrıştırır ve seçenekleri istediğiniz yere koyabilirsiniz; URL'den sonra da görünebilirler:
curl http://example.com -Lv
ve iki ayrı kısa seçenek elbette ayrı ayrı da belirtilebilir, şöyle:
curl -v -L http://example.com
Uzun seçenekler
Tek harfli seçenekler, yazılması ve kullanılması hızlı olduğu için uygundur, ancak alfabede yalnızca sınırlı sayıda harf olduğundan ve kontrol edilecek çok şey olduğundan, tüm seçenekler bu şekilde mevcut değildir. Bu nedenle bunlar için uzun seçenek adları sağlanmıştır. Ayrıca, kolaylık olması ve betiklerin daha okunabilir olması için, çoğu kısa seçeneğin daha uzun isim takma adları vardır.
Uzun seçenekler her zaman iki eksi (veya onlara ne demek isterseniz tire) ve ardından isimle yazılır ve çift eksi başına yalnızca bir seçenek adı yazabilirsiniz. Uzun seçenek formatını kullanarak ayrıntılı mod istemek şöyle görünür:
curl --verbose http://example.com
ve uzun formatı kullanarak HTTP yönlendirmelerini de istemek şöyle görünür:
curl --verbose --location http://example.com
Seçeneklere verilen argümanlar
Tüm seçenekler özellikleri etkinleştiren veya devre dışı bırakan basit boole bayrakları değildir. Bazıları için, belki bir kullanıcı adı veya bir dosyaya giden yol gibi veriler aktarmanız gerekir. Bunu önce seçeneği sonra argümanı, aralarında bir boşluk bırakarak yazarak yaparsınız. Örneğin, bir sunucuya HTTP POST ile rastgele bir veri dizesi göndermek istiyorsanız:
curl -d arbitrary http://example.com
ve seçeneğin uzun formunu kullansanız bile aynı şekilde çalışır:
curl --data arbitrary http://example.com
Kısa seçenekleri argümanlarla kullandığınızda, aslında verileri boşluk ayırıcı olmadan da yazabilirsiniz:
curl -darbitrary http://example.com
Boşluklu argümanlar
Bazen bir seçeneğe bir argüman iletmek istersiniz ve bu argüman bir veya daha fazla boşluk içerir. Örneğin, curl'ün kullandığı kullanıcı aracısı (user-agent) alanını, o üç boşluk dahil olmak üzere tam olarak I am your father olacak şekilde ayarlamak istersiniz. O zaman komut satırında curl'e iletirken dizenin etrafına tırnak işaretleri koymanız gerekir. Kullanılacak tam tırnak işaretleri kabuğunuza/komut isteminize bağlı olarak değişir, ancak genellikle çoğu yerde çift tırnak işe yarar:
curl -A "I am your father" http://example.com
Tırnak işareti kullanmamak, örneğin komut satırını şöyle yazarsanız:
curl -A I am your father http://example.com
… curl'ün kullanıcı aracısı dizesi olarak yalnızca 'I' kullanmasına neden olur ve am, your ve father dizeleri, seçenek olduklarını belirtmek için - ile başlamadıkları ve curl yalnızca seçenekleri ve URL'leri işlediği için bunun yerine ayrı URL'ler olarak ele alınır.
Dizenin kendisinin çift tırnak içermesini sağlamak için (örneğin sunucuya bir JSON dizesi göndermek istediğinizde yaygındır), tek tırnak kullanmanız gerekebilir (tek tırnakların aynı şekilde çalışmadığı Windows hariç). JSON dizesi { "name": "Darth" } gönderelim:
curl -d '{ "name": "Darth" }' http://example.com
Veya tek tırnak olayından kaçınmak isterseniz, verileri curl'e bir dosya aracılığıyla göndermeyi tercih edebilirsiniz, bu da ekstra tırnak içine almayı gerektirmez. Yukarıda belirtilen verileri içeren dosyaya 'json' dediğimizi varsayalım:
curl -d @json http://example.com
Negatif seçenekler
Bir şeyi açan seçenekler için, yani boole seçenekleri için, onları kapatmanın da bir yolu vardır. O zaman seçeneğin uzun formunu, ismin önünde bir no- öneki ile kullanırsınız. Örnek olarak, ayrıntılı modu kapatmak için:
curl --no-verbose http://example.com
Yardım
curl'ün iki yüz altmıştan fazla komut satırı seçeneği vardır ve seçeneklerin sayısı zamanla artmaya devam etmektedir. Seçenek sayısının önümüzdeki yıllarda üç yüze ulaşması ve hatta aşması muhtemeldir.
Seçenekleri listeleme
Belirli bir eylemi gerçekleştirmek için hangi seçeneklere ihtiyacınız olduğunu bulmak için, curl'ün bunları listelemesini sağlayabilirsiniz. İlk olarak, curl --help veya basitçe curl -h, size en önemli ve sık kullanılan seçeneklerin bir listesini verir. O belirli alan için daha fazla seçeneğin listelenmesini sağlamak üzere -h'ye ek bir "kategori" sağlayabilirsiniz. Mevcut tüm kategorileri listelemek için curl -h category veya tüm mevcut seçenekleri listelemek için curl -h all kullanın.
Belirli bir seçenekle ilgili yardım
curl'ün tek bir belirli komut satırı seçeneği hakkındaki belgeleri görüntülemesini sağlamak için, seçeneği -h'den sonra ekleyin. Tek tire (-) ile kısa adı veya iki tire (--) ile uzun sürümü kullanın.
Örneğin, -U'nun ne yaptığını şunu çalıştırarak öğrenin:
curl -h -U
Veya --insecure açıklamasını şu şekilde alın:
curl -h --insecure
Tam kılavuz (manual)
curl --manual seçeneği, curl için tüm man sayfasını (kılavuz sayfası) çıktılar. Bu, her seçeneğin nasıl çalıştığına dair birkaç bin satırlık dokümantasyonu bir araya getiren kapsamlı ve eksiksiz bir belgedir. Bunların içinden geçmek de sıkıcı bir iştir ve bu metin yığınları arasında bir arama işlevinin kullanılmasını teşvik ediyoruz. Bazı insanlar man sayfasının web sürümünü de takdir edebilir.
Sürüme bağlı seçenekler
curl ilk olarak 1998 yılının o şanlı senesinde bir komut satırına yazıldı. O zamanlar bile belirtilen URL üzerinde ve ona verilen hiç, bir veya daha fazla komut satırı seçeneğiyle çalışıyordu.
O zamandan beri daha fazla seçenek ekledik. İlerledikçe seçenekler ekliyoruz ve curl'ün neredeyse her yeni sürümü, kullanıcıların çalışmasının belirli yönlerini değiştirmelerine izin veren bir veya birkaç yeni seçeneğe sahiptir.
curl projesinin her sekiz haftada bir yeni bir sürüm gönderen oldukça hızlı sürüm zinciriyle, en azından her zaman curl'ün en son yayınlanan sürümünü kullanmamanız neredeyse kaçınılmazdır. Bazen birkaç yıl eski bir curl sürümü bile kullanıyor olabilirsiniz.
Bu kitapta açıklanan tüm komut satırı seçenekleri, elbette curl'e bir noktada eklendi ve bunların sadece küçük bir kısmı curl'ün ilk gönderildiği 1998'deki o güzel bahar gününde mevcuttu. curl sürümünüzü kontrol etmek ve belirli seçeneklerin ne zaman eklendiği konusunda curl man sayfasıyla çapraz kontrol yapmak için nedeniniz olabilir. Modern bir curl sürümünü kullanan bir curl komut satırını, daha eski bir kurulum çalıştırıyor olabilecek eski bir sisteme geri götürmek istiyorsanız bu özellikle önemlidir.
curl geliştiricileri mevcut davranışı değiştirmemek için çok çalışıyorlar. 1998, 2003 veya 2010'da curl kullanmak için yazılan komut satırlarının hepsi bugün bile değiştirilmeden çalıştırılabilir olmalıdır.
URL'ler
curl'e curl denir çünkü adının içinde URL (Uniform Resource Locator - Tekdüzen Kaynak Bulucu) alt dizesi geçer. URL'ler üzerinde çalışır. URL, HTTP:// ile öneklenmiş veya www ile başlayanlar gibi web adresi dizeleri için gündelik olarak kullandığımız addır.
URL, tam konuşmak gerekirse, bunların eski adıdır. URI (Uniform Resource Identifier - Tekdüzen Kaynak Tanımlayıcı), bunlar için daha modern ve doğru addır. Sözdizimi RFC 3986'da tanımlanmıştır.
curl'ün girdi olarak bir "URL" kabul ettiği yerde, bu aslında bir "URI"dir. curl'ün anladığı protokollerin çoğu, o belirli URI formatının nasıl çalıştığını açıklayan karşılık gelen bir URI sözdizimi belgesine de sahiptir.
- Şema (Scheme)
- İsim ve parola
- Ana bilgisayar (Host)
- Port numarası
- Yol (Path)
- Sorgu (Query)
- FTP türü
- Bölüm (Fragment)
- Tarayıcılar
- Birçok seçenek ve URL
- URL globbing
- Bağlantı yeniden kullanımı
- Paralel transferler
- trurl
Şema (Scheme)
URL'ler, http:// kısmının resmi adı olan "şema" ile başlar. Bu, URL'nin hangi protokolü kullandığını söyler. Şema, curl'ün bu sürümünün desteklediği bilinen bir şema olmalıdır, aksi takdirde bir hata mesajı gösterir ve durur. Ayrıca, şema ne boşlukla başlamalı ne de herhangi bir boşluk içermelidir.
Şema ayırıcı
Şema tanımlayıcısı, URL'nin geri kalanından :// dizisi ile ayrılır. Bu iki nokta üst üste ve iki eğik çizgidir. Yalnızca bir eğik çizgi içeren URL formatları mevcuttur, ancak curl bunlardan hiçbirini desteklemez. Eğik çizgi sayısı hakkında bilinmesi gereken iki ek not vardır:
curl bazı geçersiz sözdizimlerine izin verir ve bunları dahili olarak düzeltmeye çalışır; bu nedenle, aslında düzgün biçimlendirilmiş URL'ler olmamasına rağmen, bir veya üç eğik çizgili URL'leri de anlar ve kabul eder. curl bunu yapar çünkü tarayıcılar bu uygulamayı başlattı, bu yüzden bu tür URL'lerin arada sırada vahşi doğada kullanılmasına yol açtı.
file:// URL'leri file://<anabilgisayar>/<yol> olarak yazılır ancak kullanılması uygun olan tek ana bilgisayar adları (hostnames) localhost, 127.0.0.1 veya boş (hiçbir şey) olanlardır:
file://localhost/path/to/file
file://127.0.0.1/path/to/file
file:///path/to/file
Oraya başka bir ana bilgisayar adı eklemek, curl'ün son sürümlerinin bir hata döndürmesine neden olur.
Yukarıdaki üçüncü örneğe (file:///path/to/file) özellikle dikkat edin. Bu, yoldan önce üç eğik çizgidir. Bu yine yaygın hataların olduğu ve tarayıcıların kullanıcıların yanlış sözdizimini kullanmasına izin verdiği bir alandır, bu nedenle özel bir istisna olarak Windows'ta curl bu yanlış formata da izin verir:
file://X:/path/to/file
… burada X, windows tarzı bir sürücü harfidir.
Şema olmadan
Kolaylık sağlamak için, curl kullanıcıların URL'lerden şema kısmını çıkarmasına da izin verir. O zaman ana bilgisayar adının ilk kısmına göre hangi protokolün kullanılacağını tahmin eder. Bu tahmin basittir, çünkü sadece ana bilgisayar adının ilk kısmının bir protokol setiyle eşleşip eşleşmediğini kontrol eder ve o protokolü kullanmak istediğinizi varsayar. Bu buluşsal yöntem, sunucuların geleneksel olarak böyle adlandırıldığı gerçeğine dayanmaktadır. Bu şekilde algılanan protokoller FTP, DICT, LDAP, IMAP, SMTP ve POP3'tür. Şemasız bir URL'deki diğer herhangi bir ana bilgisayar adı, curl'ün varsayılan olarak HTTP kullanmasını sağlar.
Örneğin, bu bir FTP sitesinden bir dosya alır:
curl ftp.funet.fi/README
Bu ise hır HTTP sunucusundan veri alırken:
curl example.com
--proto-default seçeneği ile varsayılan protokolü HTTP dışında bir şeye değiştirebilirsiniz.
Desteklenen şemalar
curl aşağıdaki transfer şemalarını ve protokollerini destekler veya desteklemesi sağlanabilir (eğer öyle derlenmişse):
DICT, FILE, FTP, FTPS, GOPHER, GOPHERS, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, POP3, POP3S, RTMP, RTMPS, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET, TFTP, WS ve WSS
İsim ve parola
Bir URL'deki şemanın ardından, gömülü olası bir kullanıcı adı ve parola alanı olabilir. Bu sözdiziminin kullanımı, bu bilgileri betiklerde veya başka şekilde kolayca sızdırabileceğiniz için bugünlerde genellikle hoş karşılanmaz. Örneğin, belirli bir isim ve parola kullanarak bir FTP sunucusunun dizinini listelemek:
curl ftp://user:password@example.com/
URL'de kullanıcı adı ve parolanın varlığı tamamen isteğe bağlıdır. curl, bu bilgilerin URL'nin dışında normal komut satırı seçenekleriyle sağlanmasına da izin verir.
Kullanıcı adı ve/veya parolanın bir parçası olarak ASCII olmayan bir harf veya belki bir : veya @ istiyorsanız, o harfi URL kodlamayı (URL encode) unutmayın: HHnin onaltılık bayt değeri olduğu %HH olarak yazın. : %3a ve @ %40'tır.
Ana bilgisayar (Host)
URL'nin ana bilgisayar adı kısmı, elbette, sayısal bir IP adresine çözümlenebilen basit bir ad veya sayısal adresin kendisidir.
curl http://example.com
Sayısal bir adres belirtirken, IPv4 adresleri için noktalı sürümü kullanın:
curl http://127.0.0.1/
…ve IPv6 adresleri için sayısal sürümün köşeli parantez içinde olması gerekir:
curl http://[2a04:4e42::561]/
Bir ana bilgisayar adı kullanıldığında, adın bir IP adresine dönüştürülmesi tipik olarak sistemin çözümleyici (resolver) işlevleri kullanılarak yapılır. Bu normalde bir sistem yöneticisinin /etc/hosts dosyasında (veya eşdeğerinde) yerel ad aramaları sağlamasına izin verir.
Uluslararası Alan Adları (IDN)
curl, IDN adlarıyla nasıl başa çıkacağını bilir ve bunları normal bir ad gibi iletirsiniz:
curl https://räksmörgås.se
Port numarası
Her protokolün, belirtilen bir port numarası verilmediği sürece curl'ün kullandığı varsayılan bir port numarası vardır. İsteğe bağlı port numarası, ana bilgisayar adı kısmından sonra, iki nokta üst üste ve ondalık olarak yazılmış port numarası olarak URL içinde sağlanabilir. Örneğin, 8080 numaralı portta bir HTTP belgesi istemek:
curl http://example.com:8080/
Ad bir IPv4 adresi olarak belirtildiğinde:
curl http://127.0.0.1:8080/
Ad bir IPv6 adresi olarak verildiğinde:
curl http://[fdea::1]:8080/
Port numarası işaretsiz 16 bitlik bir sayıdır, bu nedenle 0 ila 65535 aralığında olması gerekir.
TCP vs UDP
Verilen port numarası, URL'de belirtilen sunucuyla bağlantı kurulurken kullanılır. Port, kullanılan gerçek temel taşıma protokolüne bağlı olarak bir TCP port numarası veya bir UDP port numarasıdır. TCP en yaygın olanıdır, ancak TFTP ve HTTP/3 UDP kullanır.
file:// şemasını kullanan URL'ler bir port numarasına sahip olamaz.
Yol (Path)
Her URL bir yol içerir. Hiçbir yol verilmezse, / ima edilir. Örneğin sadece ana bilgisayar adını kullandığınızda:
curl https://example.com
Yol, tam olarak hangi kaynağın istendiğini veya sağlandığını tanımlamak için belirtilen sunucuya gönderilir.
Yolun tam kullanımı protokole bağlıdır. Örneğin, README dosyasını varsayılan anonim kullanıcıdan bir FTP sunucusundan almak:
curl ftp://ftp.example.com/README
Dizin kavramına sahip protokoller için, URL'yi eğik çizgi (slash) ile sonlandırmak, bunun bir dosya değil bir dizin olduğu anlamına gelir. Bu nedenle bir FTP sunucusundan bir dizin listesi istemek böyle bir eğik çizgi ile ima edilir:
curl ftp://ftp.example.com/tmp/
Yol alanının bir parçası olarak ASCII olmayan bir harf veya hatta boşluk ( ) istiyorsanız, o harfi "URL kodlamayı" (URL-encode) unutmayın: HHnin onaltılık bayt değeri olduğu %HH olarak yazın. %20dir.
Sorgu (Query)
Bir URL'nin sorgu kısmı, soru işaretinin (?) sağında ancak kare (#) ile başlayan bölümün (fragment) solunda yer alan veridir.
Sorgu, URL kodlanmış olduğu sürece herhangi bir karakter dizesi olabilir. Ve (&) işaretleriyle ayrılmış bir anahtar/değer çiftleri dizisi kullanmak yaygın bir uygulamadır. https://example.com/?name=daniel&tool=curl örneğinde olduğu gibi.
Kullanıcıların bu tür sorgu kümelerini düzgün bir şekilde kodlanmış olarak oluşturmalarına yardımcı olmak için curl, --url-query [content] komut satırı seçeneğini sunar. Bu seçenek, sağlanan URL'nin sorgu kısmının sonuna içerik, genellikle bir ad + değer çifti ekler.
Sorgu parçaları eklerken, curl ve (&) ayırıcıları ekler.
Sözdizimi, bir uzantı ile --data-urlencode tarafından kullanılanla aynıdır: + öneki. Aşağıya bakın.
-
content: İçeriği URL kodlayın ve bunu sorguya ekleyin. Sözdiziminin aşağıdaki diğer durumlardan biriyle eşleşmesine neden olduğundan, içeriğin herhangi bir=veya@sembolü içermemesine dikkat edin. -
=content: İçeriği URL kodlayın ve bunu sorguya ekleyin. Başlangıçtaki=sembolü verilere dahil edilmez. -
name=content: İçerik kısmını URL kodlayın ve bunu sorguya ekleyin. İsim kısmının zaten URL kodlanmış olmasının beklendiğini unutmayın. -
@filename: Verilen dosyadan (yeni satırlar dahil) verileri yükleyin, verileri URL kodlayın ve bunu sorguya ekleyin. -
name@filename: Verilen dosyadan (yeni satırlar dahil) verileri yükleyin, verileri URL kodlayın ve bunu sorguya ekleyin. İsim kısmına bir eşittir işareti eklenir ve sonuçname=urlencoded-file-contentolur. İsim kısmının zaten URL kodlanmış olmasının beklendiğini unutmayın. -
+content: İçeriği herhangi bir kodlama yapmadan sorguya ekleyin.
FTP türü
Bu yaygın olarak kullanılan bir özellik değildir.
FTP sunucularındaki dosyaları tanımlayan URL'ler, istemciye (bu durumda curl) kaynağın hangi dosya türü olduğunu söylemenize de izin veren özel bir özelliğe sahiptir. Bunun nedeni FTP'nin biraz özel olması ve bir transfer için mod değiştirebilmesi ve böylece dosyayı başka bir mod kullanıyormuş gibi farklı şekilde işleyebilmesidir.
URL'ye ;type=A ekleyerek curl'e FTP kaynağının bir ASCII türü olduğunu söylersiniz. example.comun kök dizininden foo dosyasını ASCII kullanarak almak şu şekilde yapılabilir:
curl "ftp://example.com/foo;type=A"
curl, FTP için ikili transferleri varsayılan olarak kullanır, ancak URL formatı type=I ile ikili türü belirtmenize olanak tanır:
curl "ftp://example.com/foo;type=I"
Son olarak, ilettiğiniz tür D ise, curl'e tanımlanan kaynağın bir dizin olduğunu söyleyebilirsiniz:
curl "ftp://example.com/foo;type=D"
…bu, yukarıda belirtildiği gibi yolu eğik çizgiyle (trailing slash) sonlandırmak yerine alternatif bir format olarak çalışabilir.
Bölüm (Fragment)
URL'ler bir bölüm parçası sunar. Bu genellikle tarayıcılarda bir web sayfası içindeki belirli bir ad için bir kare sembolü (#) ve bir ad olarak görülür. Böyle bir URL'nin bir örneği şuna benzer:
https://www.example.com/info.html#the-plot
curl, kendisine bir URL iletildiğinde bölümleri iyi destekler, ancak bölüm kısmı asla kablo üzerinden gönderilmez, bu nedenle mevcut olup olmaması curl'ün işlemleri için bir fark yaratmaz.
# karakterini bölümü ayıran değil de yolun bir parçası yapmak istiyorsanız, onu URL kodlu olarak, %23 şeklinde ilettiğinizden emin olun:
curl https://www.example.com/info.html%23the-plot
Bir bölüm hilesi
Bölüm kısmının aslında ağ üzerinden kullanılmadığı gerçeği, komut satırları oluştururken avantaj olarak kullanılabilir.
Örneğin, bir sunucudan aynı URL'yi 10 kez istemek istiyorsanız, bir döngü yapabilir ve döngü talimatını bölüm kısmına koyabilirsiniz. Şunun gibi:
curl https://example.com/#[1-10]
Tarayıcılar
Tarayıcılar tipik olarak curl'ün kullandığından farklı bir URL standardını destekler ve kullanır. curl rehberlik için RFC 3986 kullanırken, tarayıcılar WHATWG URL Spesifikasyonunu kullanır.
Bu önemlidir çünkü iki URL standardı aynı değildir. Çoğu günlük kullanımda bu farklılıklar nadiren ortaya çıksa da tamamen uyumlu değildirler. Bazen, spesifikasyonlardan birine göre yorumlanan bir URL, diğer spesifikasyon tarafından yorumlandığında farklı şekilde işlenir. Bu nedenle, curl ve tarayıcılar URL'lere her zaman aynı şekilde davranmaz.
WHATWG spesifikasyonu da zamanla değişmektedir.
curl bir tarayıcının yapabileceği aynı işlemleri yapabilmek için geliştirildiğinden, curl URL ayrıştırıcısı bazı farklılıklara hitap etmek için biraz ayarlanmıştır. Örneğin, gelen HTTP başlıklarından okunduğunda URL'deki boşlukları kabul eder ve şema ile ana bilgisayar adı arasında ayırıcı olarak bir, iki veya üç eğik çizgi kabul eder. Bu yüzden bazen curl'ün ayrıştırıcısının RFC 3986+ uyumlu olduğunu söylüyoruz.
curl mevcut davranışı bozmamak için çok çabalar, bu da hala 1998'de desteklediği URL'leri ve URL formatını desteklemesini sağlar. Tarayıcılar bunu yapmaz.
Tarayıcıların adres çubuğu
Modern bir web tarayıcısı kullandığınızda, ana pencerelerinin üst kısmında yer alan adres çubuğu URL'leri ve hatta URI'leri kullanmaz. Aslında çoğunlukla Latin olmayan semboller ve daha fazlası gibi uluslararasılaştırmaya izin vermek için URI'lerin bir üst kümesi olan IRI'leri kullanırlar, ancak genellikle bunun ötesine de geçerler; örneğin, boşlukları işlerler ve yüzde kodlamasında (percent encoding) belirtilen spesifikasyonların hiçbirinin bir istemcinin yapması gerektiğini söylemediği şekillerde sihirli şeyler yaparlar.
Adres çubuğu, insanların URI benzeri dizeleri girmesi ve görmesi için oldukça basit bir arayüzdür.
Bazen bir tarayıcının adres çubuğunda gördüğünüz ile curl'e iletebileceğiniz arasındaki farklar önemlidir.
Birçok seçenek ve URL
Yukarıda belirtildiği gibi, curl yüzlerce komut satırı seçeneğini destekler ve aynı zamanda sınırsız sayıda URL'yi de destekler. Kabuğunuz veya komut satırı sisteminiz destekliyorsa, curl'e iletebileceğiniz komut satırının uzunluğunun gerçekten bir sınırı yoktur.
curl önce tüm komut satırını ayrıştırır, kullanılan komut satırı seçeneklerinden gelen istekleri uygular ve ardından işlemleri gerçekleştirmek için URL'lerin üzerinden tek tek (soldan sağa sırayla) geçer.
Bazı seçenekler için (örneğin curl'e transferi nerede saklayacağını söyleyen -o veya -O), komut satırındaki her URL için bir seçenek belirtmek isteyebilirsiniz.
curl, kullanılan son URL üzerindeki işlemi için bir çıkış kodu döndürür. Bunun yerine curl'ün kümedeki başarısız olan ilk URL'de bir hatayla çıkmasını istiyorsanız, --fail-early seçeneğini kullanın.
Verilen her URL için bir çıktı
İki URL içeren bir komut satırı kullanıyorsanız, curl'e her ikisini de nasıl işleyeceğini söylemelisiniz. -o ve -O seçenekleri, curl'e çıktıyı URL'lerden biri için nasıl kaydedeceğini söyler, bu nedenle komut satırında URL'leriniz olduğu kadar bu seçeneklere sahip olmak isteyebilirsiniz.
Komut satırında çıktı seçeneklerinden daha fazla URL'niz varsa, karşılık gelen bir çıktı talimatı olmayan URL içeriği bunun yerine stdout'a (standart çıktı) gönderilir.
--remote-name-all bayrağını kullanmak, curl'ün otomatik olarak herhangi bir çıktı seçeneğine sahip olmayan tüm verilen URL'ler için -O kullanılmış gibi davranmasını sağlar.
URL başına ayrı seçenekler
Önceki bölümlerde curl'ün her zaman tüm komut satırındaki tüm seçenekleri nasıl ayrıştırdığını ve bunları transfer ettiği tüm URL'lere nasıl uyguladığını anlattık.
Bu bir basitleştirmeydi: curl ayrıca, seçenekleri uyguladığı bir dizi seçenek ve URL arasına bir sınır ekleyen bir seçenek (-:, --next) sunar. Komut satırı ayrıştırıcısı bir --next seçeneği bulduğunda, aşağıdaki seçenekleri bir sonraki URL setine uygular. --next seçeneği böylece bir dizi seçenek ve URL arasında bir ayırıcı olarak çalışır. İstediğiniz kadar --next seçeneği kullanabilirsiniz.
Örnek olarak, bir URL'ye HTTP GET yapıyoruz ve yönlendirmeleri izliyoruz, sonra farklı bir URL'ye ikinci bir HTTP POST yapıyoruz ve bunu üçüncü bir URL'ye bir HEAD isteği ile tamamlıyoruz. Hepsi tek bir komut satırında:
curl --location http://example.com/1 --next
--data sendthis http://example.com/2 --next
--head http://example.com/3
Komut satırında --next seçenekleri olmadan böyle bir şey denemek, curl hem POST hem de HEAD'i birleştirmeye çalışacağı için geçersiz bir komut satırı oluşturacaktır:
Warning: You can only select one HTTP request method! You asked for both
Warning: POST (-d, --data) and HEAD (-I, --head).
URL globbing
Bazen, istekler arasında yalnızca küçük bir kısmı değişen, çoğunlukla aynı olan bir dizi URL almak istersiniz. Belki sayısal bir aralıktır veya belki bir dizi isimdir. curl, bunlar gibi birçok URL'yi kolayca belirtmenin bir yolu olarak "globbing" sunar.
Globbing bunun için [] ve {} ayrılmış sembollerini kullanır; bu semboller normalde yasal bir URL'nin parçası olamaz (sayısal IPv6 adresleri hariç ancak curl bunları zaten iyi işler). Globbing yolunuza çıkarsa, -g, --globoff ile devre dışı bırakın.
Bir komut satırı isteminden çağrıldığında [] veya {} dizilerini kullanırken, kabuğun buna müdahale etmesini önlemek için muhtemelen tam URL'yi çift tırnak içine almanız gerekir. Bu aynı zamanda '&', '?' ve '*' gibi özel işlem gören diğer karakterler için de geçerlidir.
curl'deki transferle ilgili çoğu işlevsellik libcurl kütüphanesi tarafından sağlanırken, URL globbing özelliği sağlanmaz.
Sayısal aralıklar
[N-M] sözdizimi ile sayısal bir aralık isteyebilirsiniz, burada N başlangıç indeksidir ve M'ye kadar ve M dahil olmak üzere gider. Örneğin, sayısal olarak adlandırılmış 100 görüntüyü tek tek isteyebilirsiniz:
curl -O "http://example.com/[1-100].png"
ve hatta sıfır önekleriyle aralıklar yapabilir, örneğin sayı her zaman üç basamaklıysa:
curl -O "http://example.com/[001-100].png"
Veya belki de sadece çift sayılı görüntüleri istiyorsunuz, bu yüzden curl'e bir adım sayacı da söylersiniz. Bu örnek aralık 0'dan 100'e 2'lik artışlarla gider:
curl -O "http://example.com/[0-100:2].png"
Alfabetik aralıklar
curl, bir sitenin a'dan z'ye adlandırılmış bölümleri olduğu zamanki gibi alfabetik aralıklar da yapabilir:
curl -O "http://example.com/section[a-z].html"
Liste
Bazen parçalar bu kadar kolay bir deseni takip etmez ve o zaman bunun yerine tam listeyi kendiniz verebilirsiniz ancak o zaman aralıklar için kullanılan köşeli parantezler yerine süslü parantezler içinde:
curl -O "http://example.com/{one,two,three,alpha,beta}.html"
Kombinasyonlar
Aynı URL'de birkaç glob kullanabilirsiniz, bu da curl'ün bunlar üzerinde de yineleme yapmasını sağlar. Ben, Alice ve Frank'in görüntülerini hem 100 x 100 hem de 1000 x 1000 çözünürlüklerinde indirmek için bir komut satırı şuna benzeyebilir:
curl -O "http://example.com/{Ben,Alice,Frank}-{100x100,1000x1000}.jpg"
Veya bir satranç tahtasının tüm görüntülerini, 0 ila 7 aralığındaki iki koordinatla indekslenmiş olarak indirin:
curl -O "http://example.com/chess-[0-7]x[0-7].jpg"
Elbette aralıkları ve serileri karıştırabilirsiniz. Hem web sunucusu hem de posta sunucusu için bir haftalık günlükleri (logs) alın:
curl -O "http://example.com/{web,mail}-log[0-6].txt"
Globbing için çıktı değişkenleri
Bu bölümdeki önceki tüm globbing örneklerinde, curl'ün kullanılan URL'nin dosya adı kısmını kullanarak hedef dosyayı kaydetmesini sağlayan -O / --remote-name seçeneğini kullanmayı seçtik.
Bazen bu yeterli değildir. Birden fazla dosya indiriyorsunuz ve belki de bunları farklı bir alt dizine kaydetmek veya kaydedilen dosya adlarını farklı şekilde oluşturmak istiyorsunuz. curl'ün elbette bu durumlar için de bir çözümü var: çıktı dosya adı değişkenleri.
URL'de kullanılan her "glob" ayrı bir değişken alır. Bunlara #[num] olarak başvurulur - bu, tek karakter # ve ardından ilk glob için 1 ile başlayıp son glob ile biten glob numarası anlamına gelir.
İki farklı sitenin ana sayfalarını kaydedin:
curl "http://{one,two}.example.com" -o "file_#1.txt"
Bir alt dizindeki iki glob ile bir komut satırından çıktıları kaydedin:
curl "http://{site,host}.host[1-5].example.com" -o "subdir/#1_#2"
URL'lerde []{} kullanma
1990'larda curl'e globbing kavramı eklendiğinde, hepimiz URL sözdiziminin nasıl tanımlandığına dair aynı İnternet standardını kullanıyorduk ve bu standartta bu dört sembol ayrılmış (reserved) olarak belgelenmişti. Bunları kullanmak istiyorsanız URL'de URL kodlamanız gerekiyordu (%HH stili). Bu semboller bu nedenle URL'lerde kullanılmadı ve globbing amaçları için kullanılması düpedüz çekiciydi.
Daha sonra, URL sözdizimi yavaş yavaş gevşetildi ve değiştirildi ve bugünlerde arada sırada dört sembolden []{} birinin URL kodlaması olmadan olduğu gibi kullanıldığı URL'lerin kullanıldığını görüyoruz. Böyle bir URL'yi curl'e iletmek, glob ayrıştırıcısı çıldırdığında sözdizimi hataları kusmasına neden olur.
Bu sorunu aşmak için iki ayrı seçeneğiniz vardır. Sembolleri kendiniz kodlarsınız ya da globbing'i kapatırsınız.
Sembolleri şu şekilde kodlayın:
| sembol | kodlama |
|---|---|
[ | %5b |
] | %5d |
{ | %7b |
} | %7d |
Veya -g veya --globoff ile globbing'i kapatın.
Bağlantı yeniden kullanımı
Sitelere bağlantılar kurarken, curl eski bağlantıları bir süre ortalıkta tutar, böylece bir sonraki transfer önceki bir transferle aynı ana bilgisayarı kullanılarak yapılırsa, aynı bağlantıyı tekrar kullanabilir ve böylece çok fazla zaman kazanabilir. Buna kalıcı (persistent) bağlantılar diyoruz. curl her zaman bağlantıları canlı tutmaya çalışır ve mevcut bağlantıları elinden geldiğince yeniden kullanır.
Bağlantılar bağlantı havuzunda (connection pool), bazen bağlantı önbelleği (connection cache) olarak da adlandırılır, tutulur.
Ancak curl komut satırı aracı, bağlantıları yalnızca çalıştığı sürece canlı tutabilir, bu nedenle komut satırınıza geri döner dönmez o anda açık olan tüm bağlantıları kapatmak (ve ayrıca sonraki işlemlerin süresini azaltmak için kullandığı diğer tüm önbellekleri serbest bırakmak ve temizlemek) zorundadır. Canlı bağlantılar havuzuna bağlantı önbelleği diyoruz.
Aynı ana bilgisayara veya aynı temel URL'ye karşı N transfer veya işlem gerçekleştirmek istiyorsanız, curl'ü her seferinde bir URL ile tekrar tekrar çağırmak yerine, bunları mümkün olduğunca az curl komut satırında yapmaya çalışarak çok fazla hız kazanabilirsiniz.
Paralel transferler
Belirtilen URL'leri seri bir şekilde tek tek almanın varsayılan davranışı, her URL'nin tam olarak ne zaman getirildiğini anlamayı kolaylaştırır ancak yavaş olabilir.
curl, bunun yerine curl'e belirtilen transferleri paralel bir şekilde yapmaya çalışmasını emreden -Z (veya --parallel) seçeneğini sunar. Bu etkinleştirildiğinde, curl seri yerine aynı anda birçok transfer gerçekleştirir. Varsayılan olarak aynı anda 50'ye kadar transfer yapar ve bunlardan biri tamamlanır tamamlanmaz bir sonraki başlatılır.
Farklı kaynaklardan birçok dosya indirmek istediğiniz ve bunlardan bazılarının yavaş, bazılarının hızlı olabileceği durumlar için bu, işleri muazzam bir şekilde hızlandırabilir.
50 paralel transfer sizin için yanlışsa, bu miktarı değiştirmenize izin vermek için --parallel-max seçeneği mevcuttur.
Paralel transfer ilerleme göstergesi
Doğal olarak, tek bir transfer için dosya transferi ilerlemesini gösteren sıradan ilerleme göstergesi ekranı paralel transferler için o kadar yararlı değildir, bu nedenle curl paralel transferler gerçekleştirdiğinde, tek bir satırda mevcut devam eden tüm transferler hakkında bilgi görüntüleyen farklı bir ilerleme göstergesi gösterir.
Multiplex öncesi bağlantı
curl'den paralel transferler yapması istendiğinde, önceden var olan bağlantılar üzerinden ek transfer yeniden kullanımı ve çoklamanın (multiplexing) gerçekleşmesine öncelik verir. Bu, gerekli toplam bağlantı miktarını (ve dolayısıyla kaynakları) potansiyel olarak azaltabilir, ancak başlangıçta biraz daha yavaş olabilir.
--parallel-immediate ile, curl'e önceliklendirmeyi tersine çevirmesi ve transferin başka bir bağlantıda çoklanıp çoklanamayacağını görmek için biraz beklemeyi göze almak yerine hemen yeni bir bağlantı oluşturmayı tercih etmesi talimatı verilir.
trurl
trurl, URL'leri ve URL parçalarını ayrıştırma, işleme ve çıktı olarak verme tek amacına sahip ayrı bir komut satırı aracıdır. Komut satırlarınız ve betik ihtiyaçlarınız için curl'e yardımcı bir araçtır.
trurl, libcurl'ün URL ayrıştırıcısını kullanır. Bu, curl ve trurl'ün URL'ler hakkında her zaman aynı fikre sahip olmasını ve her iki aracın da bunları aynı ve tutarlı bir şekilde ayrıştırmasını sağlar.
Kullanım
Genellikle trurl'e bir veya daha fazla URL iletirsiniz ve hangi bileşenlerin çıktısını istediğinizi belirtirsiniz. Muhtemelen URL(ler)i değiştirirken de.
trurl URL'leri bilir ve her URL on adede kadar ayrı ve bağımsız bileşenden oluşur. Bu bileşenler trurl ile çıkarılabilir, kaldırılabilir ve güncellenebilir.
trurl örnek komut satırları
Bir URL'nin ana bilgisayar adını değiştirin:
$ trurl --url https://curl.se --set host=example.com
https://example.com/
Bileşenleri ayarlayarak bir URL oluşturun:
$ trurl --set host=example.com --set scheme=ftp
ftp://example.com/
Bir URL'yi yeniden yönlendirin:
$ trurl --url https://curl.se/we/are.html --redirect here.html
https://curl.se/we/here.html
Port numarasını değiştirin:
$ trurl --url https://curl.se/we/../are.html --set port=8080
https://curl.se:8080/are.html
URL'den yolu (path) çıkarın:
$ trurl --url https://curl.se/we/are.html --get '{path}'
/we/are.html
URL'den portu çıkarın:
$ trurl --url https://curl.se/we/are.html --get '{port}'
443
Bir URL'ye yol segmenti ekleyin:
$ trurl --url https://curl.se/hello --append path=you
https://curl.se/hello/you
Bir URL'ye sorgu segmenti ekleyin:
$ trurl --url "https://curl.se?name=hello" --append query=search=string
https://curl.se/?name=hello&search=string
stdin'den URL'leri okuyun:
$ cat urllist.txt | trurl --url-file -
...
JSON çıktısı:
$ trurl "https://fake.host/hello#frag" --set user=::moo:: --json
[
{
"url": "https://%3a%3amoo%3a%3a@fake.host/hello#frag",
"parts": {
"scheme": "https",
"user": "::moo::",
"host": "fake.host",
"path": "/hello",
"fragment": "frag"
}
}
]
Sorgudan izleme demetlerini (tuples) kaldırın:
$ trurl "https://curl.se?search=hey&utm_source=tracker" \
--trim query="utm_*"
https://curl.se/?search=hey
Belirli bir sorgu anahtarı değerini gösterin:
$ trurl "https://example.com?a=home&here=now&thisthen" -g '{query:a}'
home
Sorgu bileşenindeki anahtar/değer çiftlerini sıralayın:
$ trurl "https://example.com?b=a&c=b&a=c" --sort-query
https://example.com?a=c&b=a&c=b
Noktalı virgül ayırıcı kullanan bir sorguyla çalışın:
$ trurl "https://curl.se?search=fool;page=5" --trim query="search" \
--query-separator ";"
https://curl.se?page=5
URL yolundaki boşlukları kabul edin:
$ trurl "https://curl.se/this has space/index.html" --accept-space
https://curl.se/this%20has%20space/index.html
Daha fazlası
trurl hakkında bilmek istediğiniz her şey https://curl.se/trurl adresinde bulunur. Muhtemelen tercih ettiğiniz Linux dağıtımı için zaten mevcuttur.
Yapılandırma dosyası (Config file)
Birden fazla komut satırı seçeneğine sahip curl komutlarıyla çalışmak külfetli olabilir. Karakter sayısı, terminal uygulamanızın izin verdiği maksimum uzunluğu bile aşabilir.
Bu tür durumlara yardımcı olmak için, curl komut satırı seçeneklerini düz bir metin yapılandırma dosyasına yazmanıza ve curl'e uygun olduğunda o dosyadan seçenekleri okumasını söylemenize izin verir.
Ayrıca verileri değişkenlere atamak ve verileri işlevlerle dönüştürmek için yapılandırma dosyalarını kullanabilirsiniz, bu da onları inanılmaz derecede kullanışlı hale getirir. Bu, Değişkenler bölümünde tartışılmaktadır.
Aşağıdaki bazı örnekler okunabilirlik için birden fazla satır içerir. Ters eğik çizgi (\), terminale yeni satırı görmezden gelmesi talimatını vermek için kullanılır.
Kullanılacak yapılandırma dosyasını belirtme
-K veya uzun form --config seçeneğini kullanmak, curl'e bir yapılandırma dosyasından okumasını söyler.
curl \
--config configFile.txt \
--url https://example.com
Belirtilen dosya yolu, terminalinizdeki geçerli dizine göredir.
Yapılandırma dosyasını istediğiniz gibi adlandırabilirsiniz. Yukarıdaki örnekte basitlik için configFile.txt kullanılmıştır.
Sözdizimi
Satır başına bir komut girin. Yorumlar için kare sembolünü kullanın:
# curl yapılandırma dosyası
# Yönlendirmeleri izle
--location
# Bir HEAD isteği yap
--head
Komut satırı seçenekleri
Hem kısa hem de uzun seçenekleri, bir komut satırına yazdığınız gibi tam olarak kullanabilirsiniz.
Daha kolay okunması için uzun seçeneği baştaki iki tire OLMADAN da yazabilirsiniz.
# curl yapılandırma dosyası
# Yönlendirmeleri izle
location
# Bir HEAD isteği yap
head
Argümanlar
Bir argüman alan bir komut satırı seçeneğinin argümanı, seçenekle AYNI SATIRDA sağlanmalıdır.
# curl yapılandırma dosyası
user-agent "Everything-is-an-agent"
Seçenek ve argümanı arasında = veya : de kullanabilirsiniz. Yukarıda gördüğünüz gibi, gerekli değildir, ancak bazıları sunduğu netliği sever. user-agent seçeneğini tekrar ayarlamak:
# curl yapılandırma dosyası
user-agent = "Everything-is-an-agent"
Yukarıda kullandığımız kullanıcı aracısı dizesinde boşluk yoktur, bu nedenle tırnak işaretlerine teknik olarak gerek yoktur:
# curl yapılandırma dosyası
user-agent = Everything-is-an-agent
Tırnak işaretlerinin ne zaman kullanılması gerektiği hakkında daha fazla bilgi için aşağıdaki "Tırnak işaretleri ne zaman kullanılır" bölümüne bakın.
URL'ler
Komut satırında URL girerken, seçenek olmayan her şey bir URL olarak varsayılır. Ancak, bir yapılandırma dosyasında, bir URL'yi --url veya url ile belirtmeniz gerekir.
# curl yapılandırma dosyası
url = https://example.com
Tırnak işaretleri ne zaman kullanılır
Şu durumlarda çift tırnak kullanmanız gerekir:
- parametre boşluk içeriyorsa veya
:veya=karakterleriyle başlıyorsa. - kaçış dizilerini kullanmanız gerekiyorsa (mevcut seçenekler:
\\,\",\t,\n,\rve\v. Başka herhangi bir harften önce gelen ters eğik çizgi yoksayılır).
Boşluk içeren bir parametre çift tırnak içine alınmazsa, curl bir sonraki boşluğu veya yeni satırı argümanın sonu olarak kabul eder.
Varsayılan yapılandırma dosyası
curl çağrıldığında, her zaman ( -q kullanılmadıkça), varsayılan bir yapılandırma dosyasını kontrol eder ve bulunursa onu kullanır.
Curl, varsayılan yapılandırma dosyasını şu konumlarda, bu sırayla arar:
-
$CURL_HOME/.curlrc -
$XDG_CONFIG_HOME/.curlrc(7.73.0 sürümünde eklendi) -
$HOME/.curlrc -
Windows:
%USERPROFILE%\\.curlrc -
Windows:
%APPDATA%\\.curlrc -
Windows:
%USERPROFILE%\\Application Data\\.curlrc -
Windows dışı: ev dizinini (home directory) bulmak için getpwuid kullanın
-
Windows'ta, yukarıda açıklanan sırada
.curlrcdosyası bulamazsa, curl yürütülebilir dosyasının yerleştirildiği aynı dizinde bir tane kontrol eder.
Windows'ta konum başına iki dosya adı kontrol edilir: .curlrc ve _curlrc, öncelik ilkine verilir. Windows'taki eski curl sürümleri yalnızca _curlrc'yi kontrol ediyordu.
Değişkenler
Komut satırı ve yapılandırma dosyaları için değişkenler kavramı curl 8.3.0'da eklendi.
Bir kullanıcı, --variable varName=content ile düz bir dizeye veya dosya tek bir tire (-) olarak ayarlandıysa stdin olabilen bir dosyadan --variable varName@file ile içeriklere bir değişken ayarlar.
Bu bağlamda bir değişkene belirli bir ad verilir ve içerik tutar. İstenilen sayıda değişken ayarlanabilir. Aynı değişken adını tekrar ayarlarsanız, yeni içerikle üzerine yazılır. Değişken adları büyük/küçük harfe duyarlıdır, 128 karaktere kadar uzunlukta olabilir ve a-z, A-Z, 0-9 ve alt çizgi karakterlerinden oluşabilir.
Aşağıdaki bazı örnekler okunabilirlik için birden fazla satır içerir. Ters eğik çizgi (\), terminale yeni satırı görmezden gelmesi talimatını vermek için kullanılır.
Değişkenleri ayarlama
Değişkenleri komut satırında --variable ile veya yapılandırma dosyalarında variable (tire olmadan) ile ayarlayabilirsiniz:
curl --variable varName=content
veya bir yapılandırma dosyasında:
# Curl yapılandırma dosyası
variable varName=content
Dosyadan içerik atama
Düz bir metin dosyasının içeriğini de bir değişkene atayabilirsiniz:
curl --variable varName@filename
curl 8.12.0'dan başlayarak, değişken adının sonuna [N-M] ekleyerek içerikten bir bayt aralığı alabilirsiniz; burada N ve M içeriğe doğru sayısal bayt ofsetleridir ve ikinci sayı verinin sonuna kadar anlamına gelmek üzere atlanabilir. Örneğin, bir dosyadan 100 ile 199 arasındaki bayt ofsetinden (dahil) içerikleri alın:
curl --variable "varName[100-199]@filename"
Alternatif olarak, düz bir metinden üç ile on iki arasındaki ofseti alın:
curl --variable "varName[3-12]=rangealinacaktammetin"
Verisi olmayan bir bayt aralığı verildiğinde boş bir dize elde edilir. İçerikten daha büyük bir aralık istemek, curl'ün verinin mevcut olan parçasını kullanmasına neden olur.
Genişletme (Expand)
Değişkenler, seçenek adı --expand- ile öneklendiğinde {{varName}} kullanılarak seçenek parametrelerinde genişletilebilir. Bu, varName değişkeninin içeriğinin eklenmesini sağlar.
Değişken olarak mevcut olmayan bir ada başvurursanız, boş bir dize eklenir.
Dizeye {{ karakterini ters eğik çizgi ile kaçış yaparak olduğu gibi ekleyin:
\{{.
Aşağıdaki örnekte, host değişkeni ayarlanır ve ardından genişletilir:
curl \
--variable host=example \
--expand-url "https://{{host}}.com"
--expand- öneki olmadan belirtilen seçenekler için değişkenler genişletilmez.
Genişletildiğinde kodlanmamış null baytları tutan değişken içeriği, curl'ün bir hatayla çıkmasına neden olur.
Ortam değişkenleri
--variable %VARNAME ile bir ortam değişkenini içe aktarın. Bu içe aktarma, verilen ortam değişkeni ayarlanmamışsa curl'ün bir hatayla çıkmasına neden olur. Bir kullanıcı ayrıca, yukarıda açıklandığı gibi =content veya @file kullanarak ortam değişkeni mevcut değilse varsayılan bir değer ayarlamayı da seçebilir.
Örnek olarak, %USER ortam değişkenini bir curl değişkenine atayın ve bunu bir URL'ye ekleyin. Varsayılan bir değer belirtilmediğinden, ortam değişkeni mevcut değilse bu işlem başarısız olur:
curl \
--variable %USER \
--expand-url "https://example.com/api/{{USER}}/method"
Bunun yerine, %USER mevcut değilse varsayılan değer olarak dummy kullanalım:
curl \
--variable %USER=dummy \
--expand-url "https://example.com/api/{{USER}}/method"
Veya varsayılan içerikleri yerel bir dosyadan alın:
curl \
--variable %USER@file \
--expand-url "https://example.com/api/{{USER}}/method"
--variable genişletme
--variable seçeneğinin kendisi de genişletilebilir, bu da değişkenleri diğer değişkenlerin içeriğine atamanıza olanak tanır.
curl \
--expand-variable var1={{var2}} \
--expand-variable fullname="Mrs {{first}} {{last}}" \
--expand-variable source@{{filename}}
Veya bir yapılandırma dosyasında yapılır:
# Curl yapılandırma dosyası
variable host=example
expand-variable url=https://{{host}}.com
expand-variable source@{{filename}}
İşlevler (Functions)
Değişkenleri genişletirken, curl bunların nasıl genişletileceğini değiştirmek için bir dizi işlev sunar. İşlevler, değişkenden sonra iki nokta üst üste + işlev adı ile uygulanır, şöyle: {{varName:function}}.
Değişkene birden fazla işlev uygulanabilir. Bunlar daha sonra soldan sağa sırayla uygulanır: {{varName:func1:func2:func3}}
Şu işlevler mevcuttur: trim, json, url ve b64
İşlev: trim
Değişkeni baştaki ve sondaki boşluklar olmadan genişletir. Boşluk şu şekilde tanımlanır:
- yatay sekmeler (tabs)
- boşluklar
- yeni satırlar
- dikey sekmeler
- form besleme (form feed) ve satır başı (carriage returns)
Bu, dosyalardan veri okurken ekstra kullanışlıdır.
--expand-url "https://example.com/{{path:trim}}"
İşlev: json
Değişkeni geçerli bir JSON dizesi olarak genişletir. Bu, bir argümana geçerli JSON eklemeyi kolaylaştırır (Tırnak işaretleri ortaya çıkan JSON'a dahil edilmez).
--expand-json "\"full name\": \"{{first:json}} {{last:json}}\""
Önce değişkeni kırpmak (trim) için, her iki işlevi de uygulayın (bu sırayla):
--expand-json "\"full name\": \"{{varName:trim:json}}\""
İşlev: url
Değişkeni URL kodlu olarak genişletir. Yüzde kodlu (percent encoded) olarak da bilinir. Bu işlev, tüm çıktı karakterlerinin bir URL içinde yasal olmasını ve geri kalanının, ascii değeri için iki basamaklı onaltılık bir sayı olan HH olduğu %HH olarak kodlanmasını sağlar.
--expand-data "varName={{varName:url}}"
Önce değişkeni kırpmak için, her iki işlevi de uygulayın (bu sırayla):
--expand-data "varName={{varName:trim:url}}"
İşlev: b64
Değişkeni base64 kodlu olarak genişletir. Base64, ikili veriler için yalnızca 64 belirli karakteri kullanan bir kodlamadır.
--expand-data "content={{value:b64}}"
Önce değişkeni kırpmak için, her iki işlevi de uygulayın (bu sırayla):
--expand-data "content={{value:trim:b64}}"
Örnek: $HOME/.secret adlı bir dosyanın içeriğini fix adlı bir değişkene alın. İçeriğin kırpıldığından ve yüzde kodlu olarak POST verisi olarak gönderildiğinden emin olun:
curl \
--variable %HOME=/home/default \
--expand-variable fix@{{HOME}}/.secret \
--expand-data "{{fix:trim:url}}" \
--url https://example.com/ \
Parolalar
Parolalar alengirli ve hassastır. Bir parolanın sızdırılması, kaynaklara ve aksi takdirde korunan verilere sizden başka birinin erişmesine neden olabilir.
curl, kullanıcıdan parolaları almak ve ardından bunları başkasına iletmek veya başka bir şey için kullanmak üzere çeşitli yollar sunar.
En temel curl kimlik doğrulama seçeneği -u / --userdır. İki nokta üst üste ile ayrılmış kullanıcı adı ve parola olan bir argümanı kabul eder. alice'in HTTP kimlik doğrulaması gerektiren bir sayfa istemesi ve parolasının 12345 olması gibi:
$ curl -u alice:12345 http://example.com/
Komut satırı sızıntısı
Burada potansiyel olarak kötü birkaç şey oluyor. Birincisi, komut satırına bir parola giriyoruz ve komut satırı aynı sistemdeki diğer kullanıcılar tarafından okunabilir olabilir (çok kullanıcılı bir sisteminiz olduğunu varsayarsak). curl, işlem listelerinden parolaları silmeye çalışarak bu riski en aza indirmeye yardımcı olur.
Kullanıcı adını ve parolayı komut satırında geçmekten kaçınmanın bir yolu, bunun yerine bir .netrc dosyası veya bir yapılandırma dosyası kullanmaktır. Ayrıca parolayı belirtmeden -u seçeneğini kullanabilirsiniz, bu durumda curl çalıştığında kullanıcıdan parolayı ister.
Ağ sızıntısı
İkinci olarak, bu komut satırı kullanıcı kimlik bilgilerini bir HTTP sunucusuna gönderir; bu, aradaki adam saldırılarına (man-in-the-middle) veya bağlantıyı gözetleyen diğer meraklıların ne gönderildiğini görmesine açık olan düz metin bir protokoldür. Bu komut satırı örneğinde, curl'ün HTTP Temel kimlik doğrulamasını kullanmasını sağlar ve bu tamamen güvensizdir.
Bundan kaçınmanın birkaç yolu vardır ve anahtar, elbette, kimlik bilgilerini ağ üzerinden düz metin olarak gönderen protokollerden veya kimlik doğrulama şemalarından kaçınmaktır. En kolayı belki de protokollerin şifreli sürümlerini kullandığınızdan emin olmaktır. HTTP yerine HTTPS, FTP yerine FTPS kullanın, vb.
Düz metin ve güvensiz bir protokole bağlı kalmanız gerekiyorsa, kimlik bilgilerini açıkta göndermekten kaçınan bir kimlik doğrulama yöntemine geçip geçemeyeceğinize bakın. HTTP istiyorsanız, bu tür yöntemler Digest (--digest), Negotiate (--negotiate) ve NTLM (--ntlm) içerir.
İlerleme göstergesi
curl yerleşik bir ilerleme göstergesine sahiptir. curl veri aktarmak (yükleme veya indirme) için çağrıldığında, transferin nasıl ilerlediğini, yani mevcut transfer hızını, ne kadar süredir devam ettiğini ve tamamlanmasına ne kadar kaldığını düşündüğünü göstermek için bu göstergeyi terminal ekranında gösterebilir.
curl, terminale giden bir çıktı olduğuna karar verirse ilerleme göstergesi engellenir, çünkü ilerleme göstergesi bu çıktıya müdahale eder ve görüntülenen şeyi karıştırır. Bir kullanıcı ayrıca curl'e susmasını söyleyen -s / --silent seçeneğiyle ilerleme göstergesini zorla kapatabilir.
curl'ü çağırır ve ilerleme göstergesini almazsanız, çıktınızın terminalden başka bir yere yönlendirildiğinden emin olun.
curl ayrıca -# / --progress-bar ile etkinleştirebileceğiniz alternatif ve daha basit bir ilerleme göstergesine de sahiptir. Uzun ismin ima ettiği gibi, transferi bunun yerine bir ilerleme çubuğu olarak gösterir.
curl'den veri aktarması istendiğinde, bazen istenen işlemin toplam boyutunu hesaplayamaz ve bu da daha sonra ilerleme göstergesinin daha az ayrıntı içermesine neden olur ve örneğin transfer süreleri vb. için tahminlerde bulunamaz.
Birimler
İlerleme göstergesi baytları ve saniye başına baytları görüntüler.
Ayrıca 1024 tabanlı sistemi kullanarak daha büyük miktarda bayt için son ekler kullanır, yani 1024 bir kilobayt (1K), 2048 2K vb.'dir. curl şunları destekler:
| Son ek | Miktar | İsim |
|---|---|---|
| K | 2^10 | kilobayt |
| M | 2^20 | megabayt |
| G | 2^30 | gigabayt |
| T | 2^40 | terabayt |
| P | 2^50 | petabayt |
Zamanlar saat, dakika ve saniye için H:MM:SS kullanılarak görüntülenir.
İlerleme göstergesi açıklaması
Bu, transferleri seri bir şekilde yaparken her bir tek transfer için gösterilen ilerleme göstergesidir. Paralel transferler etkinleştirildiğinde, curl bunun yerine aşağıda açıklanan formatı kullanır.
İlerleme göstergesi, kullanıcıya gerçekten bir şeyler olduğunu göstermek için vardır. Çıktıdaki farklı alanlar şu anlama gelir:
% Total % Received % Xferd Average Speed Time Curr.
Dload Upload Total Current Left Speed
0 151M 0 38608 0 0 9406 0 4:41:43 0:00:04 4:41:39 9287
Soldan sağa:
| Başlık | Anlamı |
|---|---|
% | Tüm transferin tamamlanma yüzdesi |
Total | Beklenen tüm transferin toplam boyutu (biliniyorsa) |
% | İndirmenin tamamlanma yüzdesi |
Received | Şu anda indirilen bayt sayısı |
% | Yüklemenin tamamlanma yüzdesi |
Xferd | Şu anda yüklenen bayt sayısı |
Average Speed Dload | Tüm indirmenin şimdiye kadarki ortalama transfer hızı, saniyedeki bayt sayısı cinsinden |
Average Speed Upload | Tüm yüklemenin şimdiye kadarki ortalama transfer hızı, saniyedeki bayt sayısı cinsinden |
Time Total | İşlemi tamamlamak için beklenen süre, saat, dakika ve saniye için HH:MM:SS gösteriminde |
Time Current | Transferin başlangıcından bu yana geçen süre, saat, dakika ve saniye için HH:MM:SS gösteriminde |
Time Left | Tamamlanmaya kalan beklenen süre, saat, dakika ve saniye için HH:MM:SS gösteriminde |
Curr. Speed | Son 5 saniyedeki ortalama transfer hızı, saniyedeki bayt sayısı cinsinden |
Paralel ilerleme göstergesi
--parallel kullanıldığında, curl birçok transferi aynı anda yapabilir ve o zaman yukarıda belirtilen ilerleme göstergesi gerçekten çalışmaz çünkü tek bir durum satırında çok sayıda transfer hakkındaki durumu kullanıcıya anlatması gerekir.
curl paralel transferler yaptığında, sürecin sonlarına kadar verilerin yalnızca bir alt kümesi hakkında boyut bilgisine sahip olabilir, bu da genellikle birkaç boş alan göstermesine neden olur. Örneğin, ilgili tüm transferlerin beklenen içerik boyutunu bilene kadar toplam beklenen transfer süresini söyleyemez.
DL% UL% Dled Uled Xfers Live Total Current Left Speed
88 -- 2682K 0 57 70 --:--:-- 0:00:07 --:--:-- 1190k
Soldan sağa:
| Başlık | Anlamı |
|---|---|
DL% | İndirmenin tamamlanma yüzdesi |
UL% | Yüklemenin tamamlanma yüzdesi |
DLed | İndirilen bayt sayısı |
ULed | Yüklenen bayt sayısı |
Xfers | Tamamlanan transfer sayısı |
Live | Canlı, devam eden transfer sayısı |
Total | Tüm transferlerin tamamlanması için beklenen toplam süre, saat, dakika ve saniye için HH:MM:SS gösteriminde |
Current | Ne kadar süredir çalıştığı, saat, dakika ve saniye için HH:MM:SS gösteriminde |
Left | Tamamlanmaya kalan beklenen süre, saat, dakika ve saniye için HH:MM:SS gösteriminde |
Speed | Son 5 saniyedeki ortalama transfer hızı, saniyedeki bayt sayısı cinsinden |
Sürüm
Hangi curl sürümünü yüklediğinizi öğrenmek için şunu çalıştırın:
curl --version
veya kısa versiyonu kullanın:
curl -V
Bu komut satırından gelen çıktı tipik olarak dört satırdır; bunlardan bazıları oldukça uzundur ve terminal pencerenizde sarılabilir.
Haziran 2020'de bir Debian Linux'tan örnek çıktı:
curl 7.68.0 (x86_64-pc-linux-gnu) libcurl/7.68.0 OpenSSL/1.1.1g
zlib/1.2.11 brotli/1.0.7 libidn2/2.3.0 libpsl/0.21.0 (+libidn2/2.3.0)
libssh2/1.8.0 nghttp2/1.41.0 librtmp/2.3
Release-Date: 2020-01-08
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3
pop3s rtmp rtsp scp sftp smb smbs smtp smtps telnet tftp
Features: AsynchDNS brotli GSS-API HTTP2 HTTPS-proxy IDN IPv6 Kerberos
Largefile libz NTLM NTLM_WB PSL SPNEGO SSL TLS-SRP UnixSockets
aynı tarihte bir Windows 10 makinesinde çağrılan aynı komut satırı şöyle görünürken:
curl 7.55.1 (Windows) libcurl/7.55.1 WinSSL
Release-Date: [unreleased]
Protocols: dict file ftp ftps http https imap imaps pop3 pop3s smtp smtps
telnet tftp
Features: AsynchDNS IPv6 Largefile SSPI Kerberos SPNEGO NTLM SSL
Dört satırın anlamı nedir?
Satır 1: curl
İlk satır curl ile başlar ve önce aracın ana sürüm numarasını gösterir. Ardından parantez içinde aracın hangi platform için oluşturulduğu ve libcurl sürümü gelir. Bu üç alan tüm curl derlemeleri için ortaktır.
curl sürüm numarasının sonuna -DEV eklenmişse, bu sürümün doğrudan geliştirilmekte olan bir kaynak kodundan oluşturulduğu ve resmi olarak yayınlanmış ve onaylanmış bir sürüm olmadığı anlamına gelir.
Bu satırın geri kalanı, curl'ün bu derlemesinin kullandığı üçüncü taraf bileşenlerin adlarını içerir, genellikle eğik çizgi ayırıcısıyla birlikte kendi sürüm numaraları yanlarında bulunur. OpenSSL/1.1.1g ve nghttp2/1.41.0 gibi. Bu örneğin size bu curl'ün hangi TLS arka uçlarını kullandığını söyleyebilir.
Satır 1: TLS sürümleri
Satır 1 bir veya daha fazla TLS kütüphanesi içerebilir. curl birden fazla TLS kütüphanesini destekleyecek şekilde oluşturulabilir, bu da curl'ün - başlangıçta - bu çağrı için hangi belirli arka ucun (backend) kullanılacağını seçmesini sağlar.
curl bu şekilde birden fazla TLS kütüphanesini destekliyorsa, varsayılan olarak seçilmeyenler parantez içinde listelenir. Böylece, hangi arka ucun kullanılacağını belirtmezseniz (CURL_SSL_BACKEND ortam değişkeni ile), parantez olmadan listelenen kullanılır.
Satır 2: Sürüm Tarihi (Release-Date)
Bu satır, bu curl sürümünün curl projesi tarafından yayınlandığı tarihi gösterir ve orijinal olarak yayınlandıktan sonra bir şekilde güncellendiyse ikincil bir "Yama tarihi" de gösterebilir.
curl bir sürüm tarball'ı yerine başka bir yolla oluşturulduysa [unreleased] yazar ve yukarıda görebileceğiniz gibi Microsoft'un Windows 10 için yaptığı budur ve curl projesi bunu önermez.
Satır 3: Protokoller (Protocols)
Bu, bu curl derlemesinin desteklediği tüm transfer protokollerinin (aslında URL şemalarının) alfabetik sıraya göre bir listesidir. Tüm adlar küçük harflerle gösterilir.
Bu liste şu protokolleri içerebilir:
dict, file, ftp, ftps, gopher, http, https, imap, imaps, ldap, ldaps, mqtt, pop3, pop3s, rtmp, rtsp, scp, sftp, smb, smbs, smtp, smtps, telnet ve tftp
Satır 4: Özellikler (Features)
curl'ün bu derlemesinin desteklediği özelliklerin listesi. İsim listede varsa, o özellik etkindir. İsim yoksa, o özellik etkin değildir.
Orada bulunabilecek özellikler:
- alt-svc - alt-svc: başlığı desteği
- AsynchDNS - Bu curl senkronize olmayan ad çözümlemeleri kullanır. Senkronize olmayan ad çözümlemeleri c-ares veya iş parçacıklı çözücü arka uçları kullanılarak yapılabilir.
- brotli - HTTP(S) üzerinden otomatik brotli sıkıştırma desteği
- CharConv - curl karakter seti dönüşümleri (EBCDIC gibi) desteği ile oluşturuldu
- Debug - Bu curl Debug ile oluşturulmuş bir libcurl kullanır. Bu daha fazla hata izleme ve bellek hata ayıklama vb. sağlar. Sadece curl geliştiricileri içindir.
- GSS-API - GSS-API kimlik doğrulaması etkindir
- HTTP2 - HTTP/2 desteği yerleşiktir.
- HTTP3 - HTTP/3 desteği yerleşiktir.
- HTTPS-proxy - Bu curl HTTPS proxy'yi desteklemek için oluşturulmuştur.
- IDN - Bu curl IDN'i - uluslararası alan adlarını destekler.
- IPv6 - Bununla IPv6 kullanabilirsiniz.
- krb4 - FTP için Krb4 desteklenir
- Largefile - Bu curl büyük dosyaların, 2GB'dan büyük dosyaların transferini destekler.
- libz - HTTP üzerinden sıkıştırılmış dosyaların otomatik gzip açılması desteklenir.
- Metalink - Bu curl Metalink'i destekler. Modern curl sürümlerinde bu seçenek asla mevcut değildir.
- MultiSSL - Bu curl birden fazla TLS arka ucunu destekler. İlk satır tam olarak hangi TLS kütüphaneleri olduğunu detaylandırır.
- NTLM - NTLM kimlik doğrulaması desteklenir.
- NTLM_WB - NTLM kimlik doğrulaması desteklenir.
- PSL - Public Suffix List (PSL) mevcuttur ve bu, bu curl'ün tanımlama bilgileri (cookies) için kullanılan genel son ekler hakkında bilgi sahibi olarak oluşturulduğu anlamına gelir.
- SPNEGO - SPNEGO kimlik doğrulaması desteklenir.
- SSL - HTTPS, FTPS, POP3S vb. gibi çeşitli protokollerin SSL sürümleri desteklenir.
- SSPI - SSPI desteklenir
- TLS-SRP - TLS için SRP (Secure Remote Password) kimlik doğrulaması desteklenir.
- UnixSockets - Unix soketleri desteği sağlanır.
Çıkış kodu (Exit code)
Projeye, bir şeyler ters gittiğinde curl'ün kullanılabilir bir çıkış kodu döndürmesi ve işlem planlandığı gibi gittiğinde her zaman 0 (sıfır) döndürmesi için çok çaba sarf edilmiştir.
curl'ü çağıran bir kabuk betiği veya toplu işlem dosyası yazarsanız, çağrılan komuttaki sorunları algılamak için her zaman dönüş kodunu kontrol edebilirsiniz. Aşağıda, bu yazının yazıldığı tarih itibariyle dönüş kodlarının bir listesini bulabilirsiniz. Zamanla yavaş yavaş yenilerini ekleme eğilimindeyiz, bu nedenle burada listelenmeyen bir kod alırsanız, lütfen yardım için daha güncel curl belgelerine bakın.
Temel bir Unix kabuk betiği şuna benzer bir şeye benzeyebilir:
#!/bin/sh
curl http://example.com
res=$?
if test "$res" != "0"; then
echo "the curl command failed with: $res"
fi
Mevcut çıkış kodları
-
Unsupported protocol. Bu curl derlemesinin bu protokol için desteği yoktur. Genellikle bu, URL'nin ya önünde bir boşluk olan ya da
httpyihtptveya benzeri şekilde yazan bir şema parçası kullanmak için yanlış yazılmasından kaynaklanır. Başka bir yaygın hata, bir veya daha fazla protokolü devre dışı bırakılmış olarak oluşturulmuş bir libcurl kurulumu kullanmanız ve şimdi libcurl'den derlemede devre dışı bırakılan protokollerden birini kullanmasını istemenizdir. -
Failed to initialize. Bu çoğunlukla dahili bir hatadır veya libcurl kurulumu veya libcurl'ün içinde çalıştığı sistemle ilgili bir sorundur.
-
URL malformed. Sözdizimi doğru değildi. Bu, bir URL'yi yanlış yazdığınızda ve yanlış sonuçlandığında veya nadir durumlarda, sırf herkesin uyduğu evrensel bir URL standardı olmadığı için curl'ün desteklemediği ancak başka bir aracın kabul ettiği bir URL kullandığınızda olur.
-
İstenen isteği gerçekleştirmek için gereken bir özellik veya seçenek etkinleştirilmedi veya derleme zamanında açıkça devre dışı bırakıldı. curl'ün bunu yapabilmesi için muhtemelen başka bir libcurl derlemesine ihtiyacınız var.
-
Could not resolve proxy. Verilen proxy ana bilgisayarının adresi çözümlenemedi. Ya verilen proxy adı yanlıştır ya da DNS sunucusu hatalı çalışıyordur ve olması gerektiği halde bu adı bilmiyordur ya da belki de curl'ü çalıştırdığınız sistem yanlış yapılandırılmıştır, bu nedenle doğru DNS sunucusunu bulmuyor/kullanmıyordur.
-
Could not resolve host. Verilen uzak ana bilgisayarın adresi çözümlenemedi. Verilen sunucunun adresi çözümlenemedi. Ya verilen ana bilgisayar adı yanlıştır ya da DNS sunucusu hatalı çalışıyordur ve olması gerektiği halde bu adı bilmiyordur ya da belki de curl'ü çalıştırdığınız sistem yanlış yapılandırılmıştır, bu nedenle doğru DNS sunucusunu bulmuyor/kullanmıyordur.
-
Failed to connect to host. curl makineye bir IP adresi almayı başardı ve ana bilgisayara bir TCP bağlantısı kurmaya çalıştı ancak başarısız oldu. Bunun nedeni yanlış port numarasını belirtmeniz, yanlış ana bilgisayar adını girmeniz, yanlış protokolü girmeniz veya belki de arada trafiğin geçmesini engelleyen bir güvenlik duvarı veya başka bir ağ ekipmanı olması olabilir.
-
Unknown FTP server response. Sunucu curl'ün ayrıştıramadığı veriler gönderdi. Bu ya curl'deki bir hatadan, ya sunucudaki bir hatadan ya da sunucunun curl'ün desteklemediği bir FTP protokolü uzantısı kullanmasından kaynaklanmaktadır. Bunun için tek gerçek geçici çözüm, belki de bu bilinmeyen sunucu yanıtını geri almayan diğer FTP komutlarını kullanmasını sağlamak için curl seçeneklerini değiştirmektir.
-
FTP access denied. Sunucu oturum açmayı reddetti veya erişmek istediğiniz belirli kaynağa veya dizine erişimi reddetti. Çoğu zaman sunucuda bulunmayan bir dizine geçmeye çalıştınız. Dizin elbette URL'de belirttiğiniz şeydir.
-
FTP accept failed. Etkin bir FTP oturumu kullanılırken sunucunun geri bağlanmasını beklerken, kontrol bağlantısı veya benzeri üzerinden bir hata kodu gönderildi.
-
FTP weird PASS reply. Curl, PASS isteğine gönderilen yanıtı ayrıştıramadı. PASS, curl'ün sunucuya şifreyi gönderdiği komuttur ve FTP sunucusuna anonim bağlantılar bile aslında bir şifre gönderir - sabit bir anonim dize. Bu komuttan curl'ün anlamadığı bir yanıt almak, bunun hiç de bir FTP sunucusu olmadığının veya sunucunun fena halde bozuk olduğunun güçlü bir göstergesidir.
-
Etkin bir FTP oturumu sırasında (PORT kullanılır) sunucunun bağlanmasını beklerken zaman aşımı süresi doldu. Sunucunun geri dönmesi çok uzun sürdü. Bu genellikle bir güvenlik duvarı veya diğer ağ düzenlemeleri gibi bir şeyin sunucunun curl'e başarıyla ulaşmasını engellediğinin bir işaretidir.
-
Unknown response to FTP PASV command. Curl, PASV isteğine gönderilen yanıtı ayrıştıramadı. Bu garip bir sunucu. PASV, ikinci veri transferi bağlantısını pasif modda kurmak için kullanılır, bu konuda daha fazla bilgi için FTP uses two connections bölümüne bakın.
--ftp-portseçeneğiyle bunun yerine PORT kullanarak bu sorunu aşabilirsiniz. -
Unknown FTP 227 format. Curl, sunucunun gönderdiği 227 satırını ayrıştıramadı. Bu kesinlikle bozuk bir sunucu. 227, curl'ün pasif modda ona nasıl geri bağlanması gerektiği hakkında bilgi geri gönderirken FTP sunucusunun yanıtıdır.
--ftp-portseçeneğiyle bunun yerine PORT kullanarak bu sorunu aşabilirsiniz. -
FTP cannot get host. 227 satırında aldığımız ana bilgisayar IP adresini kullanamadık. Bu muhtemelen dahili bir hatadır.
-
HTTP/2 error. HTTP2 çerçeveleme katmanında bir sorun algılandı. Bu biraz geneldir ve birkaç sorundan biri olabilir, ayrıntılar için hata mesajına bakın.
-
FTP could not set binary. Transfer yöntemi ikili (binary) olarak değiştirilemedi. Bu sunucu bozuk. curl'ün transfer başlamadan önce transferi doğru moda ayarlaması gerekir, aksi takdirde transfer çalışmaz.
-
Partial file. Dosyanın sadece bir kısmı transfer edildi. Transfer tamamlanmış olarak kabul edildiğinde, curl aslında önceden alacağı söylenen aynı miktarda veriyi aldığını doğrular. İki sayı eşleşmezse, bu hata kodudur. curl'ün reklamı yapılandan daha az bayt aldığı veya daha fazlasını aldığı anlamına gelebilir. curl'ün kendisi hangi sayının yanlış veya hangisinin doğru olduğunu, eğer varsa, bilemez.
-
FTP could not download/access the given file. RETR (veya benzeri) komutu başarısız oldu. Curl, dosyayı indirmeye çalışırken sunucudan bir hata aldı.
-
Kullanılmıyor
-
Quote error. Bir alıntı (quote) komutu sunucudan bir hata döndürdü. curl, bir IMAP, POP3, SMTP veya FTP sunucusuna özel komutlar göndermek için birkaç farklı yola izin verir ve komutların çalıştığını genel olarak kontrol eden bir özelliğe sahiptir. Bireysel olarak verilen komutlardan herhangi biri başarısız olduğunda, döndürülen çıkış durumu budur. Tavsiye genellikle tam olarak neyin ve nasıl başarısız olduğunu daha iyi anlamak için FTP iletişimindeki başlıkları izlemektir.
-
HTTP page not retrieved. İstenen URL bulunamadı veya HTTP hata kodu 400 veya üzeri olan başka bir hata döndürdü. Bu dönüş kodu yalnızca
-f, --failkullanılırsa görünür. -
Write error. Curl yerel bir dosya sistemine veya benzerine veri yazamadı. curl ağdan parça parça veri alır ve bunu bir seferde bir parça olmak üzere (veya stdout'a yazar) olduğu gibi depolar. Bu yazma işlemi bir hata alırsa, çıkış durumu budur.
-
Kullanılmıyor
-
Upload failed. Sunucu, curl'ün ona göndermeye çalıştığı dosyayı kabul etmeyi veya saklamayı reddetti. Bu genellikle sunucudaki yanlış erişim haklarından kaynaklanır ancak disk alanının bitmesi veya diğer kaynak kısıtlamaları nedeniyle de olabilir. Bu hata birçok protokol için olabilir.
-
Read error. Çeşitli okuma sorunları. Çıkış durumu 23'ün tersi. curl bir sunucuya veri gönderdiğinde, yerel bir dosyadan veya stdin'den veya benzerinden parça parça veri okur ve bu okuma bir şekilde başarısız olursa curl'ün döndürdüğü çıkış durumu budur.
-
Out of memory. Bir bellek ayırma isteği başarısız oldu. curl, sistemin ona vermeye istekli olduğundan daha fazla bellek ayırması gerekti ve curl çıkmak zorunda kaldı. Daha küçük dosyalar kullanmayı deneyin veya curl'ün çalışması için daha fazla bellek aldığından emin olun.
-
Operation timeout. Belirtilen zaman aşımı süresine koşullara göre ulaşıldı. curl çeşitli zaman aşımları sunar ve bu çıkış kodu bu zaman aşımı sınırlarından birine ulaşıldığını söyler. Zaman aşımını uzatın veya curl'ün işlemini daha hızlı bitirmesini sağlayan başka bir şeyi değiştirmeyi deneyin. Genellikle bu, yerel olarak etkileyemeyeceğiniz ağ ve uzak sunucu durumları nedeniyle olur.
-
Kullanılmıyor
-
FTP PORT failed. PORT komutu başarısız oldu. Tüm FTP sunucuları PORT komutunu desteklemez; bunun yerine PASV kullanarak bir transfer yapmayı deneyin. PORT komutu, sunucudan curl'e geri bağlanarak veri bağlantısını oluşturmasını istemek için kullanılır. Ayrıca FTP uses two connections bölümüne bakın.
-
FTP could not use REST. REST komutu başarısız oldu. Bu komut devam ettirilen FTP transferleri için kullanılır. curl, aralık veya devam ettirilen transferler yapmak için REST komutunu vermesi gerekir. Sunucu bozuk, kaba bir geçici çözüm olarak aralık/devam ettirme olmadan aynı işlemi deneyin.
-
Kullanılmıyor
-
HTTP range error. Aralık isteği çalışmadı. Devam ettirilen HTTP istekleri mutlaka kabul edilmez veya desteklenmez, bu nedenle bu çıkış kodu, bu sunucudaki bu kaynak için aralık veya devam ettirilen transferler olamayacağını belirtir.
-
HTTP post error. Dahili post isteği oluşturma hatası. Bu hatayı alırsanız, lütfen tam koşulları curl projesine bildirin.
-
A TLS/SSL connect error. SSL el sıkışması başarısız oldu. SSL el sıkışması çok sayıda farklı nedenden dolayı başarısız olabilir, bu nedenle hata mesajı bazı ek ipuçları sunabilir. Belki taraflar bir SSL/TLS sürümü, uygun bir şifre paketi veya benzeri üzerinde anlaşamadılar.
-
Bad download resume. Daha önce iptal edilmiş bir indirme işlemine devam edilemedi. Daha sonra yapılması mümkün olmayan bir transferin devam ettirilmesi istendiğinde, bu hata döndürülebilir. FILE, FTP veya SFTP için.
-
Could not read the given file when using the FILE:// scheme. Dosya açılamadı. Dosya mevcut olmayabilir veya belki bir izin sorunu olabilir?
-
LDAP cannot bind. LDAP "bind" işlemi başarısız oldu, bu LDAP işleminde gerekli bir adımdır ve bu nedenle LDAP sorgusunun gerçekleştirilemediği anlamına gelir. Bu, yanlış bir kullanıcı adı veya parola nedeniyle veya başka nedenlerle olabilir.
-
LDAP search failed. Verilen arama terimleri LDAP aramasının bir hata döndürmesine neden oldu.
-
Kullanılmıyor
-
Kullanılmıyor
-
Aborted by callback. Bir uygulama libcurl'e işlemi iptal etmesini söyledi. Bu hata kodu genellikle kullanıcılara ve curl aracının kullanıcılarına görünür yapılmaz.
-
Bad function argument. Bir işlev kötü bir parametreyle çağrıldı - bu dönüş kodu, uygulama yazarlarının libcurl'ün neden belirli eylemleri gerçekleştiremediğini anlamalarına yardımcı olmak için mevcuttur ve asla curl aracı tarafından döndürülmemelidir. Bu başınıza gelirse lütfen curl projesine bir hata raporu gönderin.
-
Kullanılmıyor
-
Interface error. Belirtilen bir giden ağ arayüzü kullanılamadı. curl tipik olarak giden ağ ve IP adreslerine kendisi karar verir, ancak curl'ün kullanamayacağı belirli birini kullanması açıkça istendiğinde bu hata oluşabilir.
-
Kullanılmıyor
-
Too many redirects. HTTP yönlendirmelerini takip ederken, libcurl uygulama tarafından ayarlanan maksimum sayıya ulaştı. Yönlendirme sayısı libcurl tarafından sınırsızdır ancak curl aracı tarafından varsayılan olarak 50'ye ayarlanmıştır. Sınır, sonsuz yönlendirme döngülerini durdurmak için mevcuttur. Sınırı
--max-redirsile değiştirin. -
Unknown option specified to libcurl. Bu, temel libcurl sürümüyle senkronize olmayan bir curl sürümü kullanırsanız olabilir. Belki daha yeni curl'ünüz, kullandığınız libcurl sürümünden sonrasına kadar tanıtılmayan ancak daha yeni olduğu için curl araç kodunuz tarafından bilinen eski libcurl'deki bir seçeneği kullanmaya çalışıyordur. Bunun riskini azaltmak ve olmadığından emin olmak için: aynı sürüm numarasına sahip curl ve libcurl kullanın.
-
Malformed telnet option. curl'e sağladığınız telnet seçeneği doğru sözdizimini kullanmadı.
-
Kullanılmıyor
-
Sunucunun SSL/TLS sertifikası veya SSH parmak izi doğrulaması başarısız oldu. curl o zaman sunucunun iddia ettiği kişi olduğundan emin olamaz. Daha fazla ayrıntı için using TLS with curl ve using SCP and SFTP with curl bölümlerine bakın.
-
Sunucu hiçbir şey yanıtlamadı, bu bağlamda bu bir hata olarak kabul edilir. Bir HTTP(S) sunucusu bir HTTP(S) isteğine yanıt verdiğinde, canlı ve sağlam olduğu sürece her zaman bir şeyler döndürür. Tüm geçerli HTTP yanıtlarının bir durum satırı ve yanıt başlığı vardır. Hiçbir şey geri almamak, sunucunun hatalı olduğunun veya belki bir şeyin curl'ün doğru sunucuya ulaşmasını engellediğinin veya yanlış port numarasına bağlanmaya çalıştığınızın vb. bir göstergesidir.
-
SSL crypto engine not found.
-
Cannot set SSL crypto engine as default.
-
Failed sending network data. Ağ üzerinden veri göndermek çoğu curl işleminin çok önemli bir parçasıdır ve curl en alt ağ katmanlarından gönderimin başarısız olduğuna dair bir hata aldığında, bu çıkış durumu döndürülür. Bunun neden olduğunu tam olarak belirlemek için genellikle ciddi bir araştırma gerekir. Ayrıntılı modu etkinleştirerek başlayın, izleme yapın ve mümkünse Wireshark veya benzeri bir araçla ağ trafiğini kontrol edin.
-
Failure in receiving network data. Ağ üzerinden veri almak çoğu curl işleminin çok önemli bir parçasıdır ve curl en alt ağ katmanlarından veri alımının başarısız olduğuna dair bir hata aldığında, bu çıkış durumu döndürülür. Bunun neden olduğunu tam olarak belirlemek için genellikle ciddi bir araştırma gerekir. Ayrıntılı modu etkinleştirerek başlayın, izleme yapın ve mümkünse Wireshark veya benzeri bir araçla ağ trafiğini kontrol edin.
-
Kullanılmıyor
-
Problem with the local certificate. İstemci sertifikasında bir sorun vardı, bu yüzden kullanılamadı. İzinler? Yanlış parola?
-
Could not use the specified SSL cipher. Şifre adlarının tam olarak belirtilmesi gerekir ve maalesef curl'ün kullanmak üzere oluşturulduğu belirli TLS arka ucuna da özgüdürler. Desteklenen şifrelerin güncel listesi ve bunların nasıl yazılacağı için https://curl.se/docs/ssl-ciphers.html adresindeki çevrimiçi belgelere bakın.
-
Peer certificate cannot be authenticated with known CA certificates. Bu genellikle sertifikanın ya kendinden imzalı olduğu ya da curl'ün kullandığı CA deposunda bulunmayan bir CA (Sertifika Yetkilisi) tarafından imzalandığı anlamına gelir.
-
Unrecognized transfer encoding. Sunucudan alınan içerik curl tarafından ayrıştırılamadı.
-
Kullanılmıyor
-
Maximum file size exceeded. curl'e indirmeleri dosya çok büyükse yapmaması üzere kısıtlama getirmesi söylendiğinde, bu durum için çıkış kodu budur.
-
Requested SSL (TLS) level failed. Çoğu durumda bu, curl'ün istendiğinde bağlantıyı TLS'ye yükseltemediği anlamına gelir.
-
Sending the data requires a rewind that failed. Bazı durumlarda curl'ün verileri tekrar göndermek için geri sarması gerekir ve bu yapılamazsa işlem başarısız olur.
-
Failed to initialize the OpenSSL SSL Engine. Bu yalnızca OpenSSL kullanıldığında olabilir ve ciddi bir dahili soruna işaret eder.
-
Kullanıcı adı, parola veya benzeri kabul edilmedi ve curl oturum açamadı. Kimlik bilgilerinin doğru sağlandığını ve doğru şekilde kodlandığını doğrulayın.
-
File not found on TFTP server.
-
Permission problem on TFTP server.
-
Out of disk space on TFTP server.
-
Illegal TFTP operation.
-
Unknown TFTP transfer ID.
-
File already exists (TFTP).
-
No such user (TFTP).
-
Kullanılmıyor
-
Kullanılmıyor
-
Problem with reading the SSL CA cert. Varsayılan veya belirtilen CA sertifika paketi sunucu sertifikasını doğrulamak için okunamadı/kullanılamadı.
-
URL'de başvurulan kaynak (dosya) mevcut değil.
-
SSH oturumu sırasında belirtilmemiş bir hata oluştu. Bu bazen, curl'ün kullandığı SSH libcurl ile curl'ün konuştuğu sunucu tarafından kullanılan SSH sürümü arasında bir uyumsuzluk sorununu gösterir.
-
Failed to shut down the SSL connection.
-
Kullanılmıyor
-
Could not load CRL file, missing or wrong format
-
TLS certificate issuer check failed. Bunun en yaygın nedeni, sunucunun TLS el sıkışmasında uygun ara sertifikayı göndermemesidir.
-
FTP
PRETcommand failed. Bu standart olmayan bir komuttur ve tüm sunucular tarafından desteklenmekten uzaktır. -
RTSP: mismatch of CSeq numbers
-
RTSP: mismatch of Session Identifiers
-
Unable to parse FTP file list. Sunucu tarafından kullanılan FTP dizin listeleme formatı curl tarafından ayrıştırılamadı. FTP joker karakterleri (wildcards) bu sunucuda kullanılamaz.
-
FTP chunk callback reported error
-
No connection available, the session is queued
-
SSL public key does not match pinned public key. Ya kötü bir ortak anahtar sağladınız ya da sunucu değişti.
-
Invalid SSL certificate status. Sunucu TLS el sıkışmasında uygun ve geçerli bir sertifika sağlamadı.
-
Stream error in HTTP/2 framing layer. Bu genellikle kurtarılamaz bir hatadır, ancak curl'ü bunun yerine HTTP/1 konuşmaya zorlamayı denemek bunu atlatabilir.
-
An API function was called from inside a callback. curl aracı bunu döndürürse, dahili olarak bir şeyler ters gitmiştir
-
Authentication error.
-
HTTP/3 layer error. Bu biraz geneldir ve birkaç sorundan biri olabilir, ayrıntılar için hata mesajına bakın.
-
QUIC connection error. Bu hataya bir TLS kütüphanesi hatası neden olabilir. QUIC, HTTP/3 için kullanılan taşıma protokolüdür.
-
Proxy handshake error. Genellikle bu, bir SOCKS proxy'sinin uyumlu davranmadığı anlamına gelir.
-
A TLS client certificate is required but was not provided.
-
An internal call to poll() or select() returned error that is not recoverable.
Hata mesajı
curl sıfır olmayan bir kodla çıktığında, bir hata mesajı da çıktılar ( --silent kullanılmadığı sürece). Bu hata mesajı, çıkış durumu numarasına bazı ek bilgiler veya koşullar ekleyebilir, böylece aynı hata numarası farklı hata mesajları alabilir.
Kullanıcılar ayrıca --write-out ile kendi hata mesajlarını oluşturabilirler. %{onerror} sözde değişkeni, yalnızca hatalarda görüntülenen bir mesaj ayarlamanıza olanak tanır ve tüm değişkenler arasında %{errormsg} ve %{exitcode} seçeneklerini sunar.
Örneğin:
curl --write-out "%{onerror}curl says: (%{exitcode}) %{errormsg}" \
https://curl.se/
"Kullanılmıyor"
Yukarıdaki çıkış kodları listesi, 'kullanılmıyor' olarak işaretlenmiş bir dizi değer içerir. Bunlar, curl'ün modern sürümlerinde kullanılmayan ancak geçmişte kullanılan veya kullanılması amaçlanan çıkış durumu kodlarıdır. Gelecekteki bir curl sürümünde kullanılabilirler.
Ek olarak, bu listedeki en yüksek kullanılan hata durumu 99'dur, ancak gelecekteki curl sürümleri bu sayıdan sonra daha fazla çıkış kodu eklemiş olabilir.
curl olarak kopyala
Bir kullanıcının tarayıcısıyla yapmayı başardığı bir işlemi yeniden oluşturmak için curl kullanmak, yaygın bir istektir ve insanların yardım istediği bir alandır.
Tıpkı tarayıcının alacağı gibi bir kaynağı almak için bir curl komut satırını nasıl güzel ve kolay bir şekilde alırsınız? Chrome, Firefox, Edge ve Safari'nin tümü bu özelliğe sahiptir.
Firefox'tan
Siteyi Firefox'un ağ araçlarıyla gösterirsiniz. Daha sonra HTTP trafiğini gördüğünüzde "Web Geliştirici->Ağ" (Web Developer->Network) aracında tekrarlamak istediğiniz belirli isteğe sağ tıklarsınız ve beliren menüde "cURL olarak Kopyala"yı (Copy as cURL) seçersiniz. Aşağıdaki ekran görüntüsünün gösterdiği gibi. İşlem daha sonra panonuza bir curl komut satırı oluşturur ve ardından bunu favori kabuk pencerenize yapıştırabilirsiniz. Bu özellik tüm Firefox kurulumlarında varsayılan olarak mevcuttur.

Chrome ve Edge'den
Chrome veya Edge'de Diğer araçlar->Geliştirici modu'nu (More tools->Developer mode) açtığınızda ve Ağ (Network) sekmesini seçtiğinizde, sitenin kaynaklarını almak için kullanılan HTTP trafiğini görürsünüz. İlgilendiğiniz belirli kaynağın satırında fareyle sağ tıklarsınız ve "cURL olarak Kopyala"yı (Copy as cURL) seçersiniz ve panonuzda sizin için bir komut satırı oluşturur. Transferi yapan bir curl komut satırı elde etmek için bunu bir kabuğa yapıştırın. Bu özellik tüm Chrome ve Chromium kurulumlarında varsayılan olarak mevcuttur. (Not: Windows'taki Chromium tarayıcıları, Chromium'daki bir hata nedeniyle yanlış alıntılanmış hatalı bir komut satırı oluşturabilir).

Safari'den
Safari'de, tercihler->İleri Düzey'e (preferences->Advanced) gidip etkinleştirene kadar "geliştirme" (development) menüsü görünmez. Bunu yaptıktan sonra, o geliştirme menüsünde Web denetçisini göster'i (Show web inspector) seçebilir ve Firefox ve Chrome'un geliştirme araçlarına benzer yeni bir konsolun açıldığını görebilirsiniz.
Ağ sekmesini seçin, web sayfasını yeniden yükleyin ve ardından curl ile almak istediğiniz belirli kaynaklara sağ tıklayabilirsiniz, sanki Safari ile yapmışsınız gibi..

Firefox'ta, geliştirici araçlarını (devtools) kullanmadan
Bu daha sık yapmak istediğiniz bir şeyse, sadece komut satırını kopyalamak için geliştirici araçlarını açmayı biraz zahmetli ve kullanışsız bulabilirsiniz. O zaman cliget sizin için mükemmel bir eklentidir çünkü sağ tıklama menüsünde size yeni bir seçenek sunar, böylece Firefox'ta bir resme sağ tıkladığımdaki bu örnek gibi gerçekten hızlı bir şekilde oluşturulmuş hızlı bir komut satırı elde edebilirsiniz:

Mükemmel değil
Bu yöntemlerin tümü, HTTP transferlerini yeniden üretmeniz için size bir komut satırı verir. Genellikle sorunlarınız için mükemmel çözüm değildirler. Neden? Çoğunlukla bu araçlar kopyaladığınız aynı isteği tam olarak yeniden çalıştırmak için yazılmıştır, oysa siz genellikle aynı mantığı yeniden çalıştırmak istersiniz ancak aynı çerezlerin ve dosya içeriklerinin vb. tam bir kopyasını göndermek istemezsiniz.
Bu araçlar, istekte göndermek için size statik ve sabit çerez içeriğine sahip komut satırları verir, çünkü tarayıcının isteklerinde gönderilen çerezlerin içeriği budur. Büyük olasılıkla komut satırını, sunucunun size önceki bir yanıtta söylediği çerezdeki içerik ne olursa olsun dinamik olarak uyum sağlayacak şekilde yeniden yazmak istersiniz. Vb.
Curl olarak kopyala işlevi ayrıca genellikle -F kullanma konusunda da kötüdür ve bunun yerine mime ayırıcı dizeleri vb. içeren el yapımı --data-binary çözümleri sunarlar.
Komut satırı transferleri
Önceki bölümlerde curl kavramları ve temel komut satırları hakkında bazı şeyler açıklanmıştır. Komut satırı seçeneklerini kullanırsınız ve çalışmak için URL'leri aktarırsınız.
Bu bölümde, curl ile gerçek transferler yapmanın derinliklerine ineceğiz. curl aracının neler yapabileceği ve sizin için veri göndermek veya almak üzere bu özellikleri kullanmasını curl'e nasıl söyleyeceğiniz. Tüm bu özellikleri, dosya transferi görevlerinizi mümkün olduğunca rahat bir şekilde yapmanıza yardımcı olmak için burada bulunan farklı araçlar olarak düşünmelisiniz.
- Ayrıntılı (Verbose)
- İndirmeler (Downloads)
- Yüklemeler (Uploads)
- Transfer kontrolleri
- Bağlantılar (Connections)
- Zaman aşımları (Timeouts)
- .netrc
- Vekil sunucular (Proxies)
- TLS
- SCP ve SFTP
- E-posta okuma
- E-posta gönderme
- DICT
- IPFS
- MQTT
- TELNET
- TFTP
Ayrıntılı (Verbose)
curl komutunuz beklediğiniz şeyi yürütmez veya döndürmezse, ilk içgüdüsel tepkiniz her zaman daha fazla bilgi almak için komutu -v / --verbose seçeneğiyle çalıştırmak olmalıdır.
Ayrıntılı mod etkinleştirildiğinde, curl daha konuşkan hale gelir ve yaptıklarının çoğunu açıklar ve gösterir. Bilgilendirme testleri ekler ve bunlara '*' öneki koyar. Örneğin, basit bir HTTP örneği denerken (indirilen verileri 'saved' adlı dosyaya kaydederek) curl'ün ne söyleyebileceğini görelim:
$ curl -v http://example.com -o saved
* Rebuilt URL to: http://example.com/
Tamam, yani curl'ü eksik gördüğü bir URL ile çağırdık, bu yüzden bize yardımcı oluyor ve devam etmeden önce sonuna bir eğik çizgi ekliyor.
* Trying 93.184.216.34...
Bu bize curl'ün şimdi bu IP adresine bağlanmaya çalıştığını söyler. Bu, 'example.com' adının bir veya daha fazla adrese çözümlendiği ve bunun curl'ün bağlanmaya çalıştığı ilk (ve muhtemelen tek) adres olduğu anlamına gelir.
* Connected to example.com (93.184.216.34) port 80 (#0)
Çalıştı. curl siteye bağlandı ve burada adın IP adresiyle nasıl eşleştiğini ve hangi portta bağlandığını açıklıyor. '(#0)' kısmı, curl'ün bu bağlantıya verdiği dahili numaradır. Aynı komut satırında birden fazla URL denerseniz, daha fazla bağlantı kullandığını veya bağlantıları yeniden kullandığını görebilirsiniz, bu nedenle bağlantı sayacı curl'ün yapması gerektiğine karar verdiği şeye bağlı olarak artabilir veya artmayabilir.
HTTP yerine HTTPS:// URL'si kullanırsak, curl'ün sunucunun sertifikasını doğrulamak için CA sertifikalarını nasıl kullandığını ve sunucunun sertifikasından bazı ayrıntıları vb. açıklayan bir sürü satır da vardır. Hangi şifrelerin seçildiği ve daha fazla TLS ayrıntısı dahil.
curl'ün iç yapısından verilen ek bilgilere ek olarak, -v ayrıntılı modu ayrıca curl'ün gönderdiği ve aldığı tüm başlıkları göstermesini sağlar. Başlıkları olmayan protokoller için (FTP, SMTP, POP3 vb. gibi), komutları ve yanıtları başlık olarak kabul edebiliriz ve bunlar da -v ile gösterilir.
Daha sonra yukarıdaki komuttan görülen çıktıya devam edersek (ancak gerçek HTML yanıtını görmezden gelirsek), curl şunları gösterir:
> GET / HTTP/1.1
> Host: example.com
> User-Agent: curl/7.45.0
> Accept: */*
>
Bu, siteye yapılan tam HTTP isteğidir. Bu istek, varsayılan bir curl 7.45.0 kurulumunda nasıl göründüğüdür ve elbette farklı sürümler arasında biraz farklılık gösterebilir ve özellikle komut satırı seçenekleri eklerseniz değişir.
HTTP istek başlıklarının son satırı boş görünüyor ve öyledir. Başlıklar ile gövde arasındaki ayrımı belirtir ve bu istekte gönderilecek "gövde" yoktur.
Devam edersek ve her şeyin plana göre gittiğini varsayarsak, gönderilen istek sunucudan karşılık gelen bir yanıt alır ve bu HTTP yanıtı, yanıt gövdesinden önce bir dizi başlıkla başlar:
< HTTP/1.1 200 OK
< Accept-Ranges: bytes
< Cache-Control: max-age=604800
< Content-Type: text/html
< Date: Sat, 19 Dec 2015 22:01:03 GMT
< Etag: "359670651"
< Expires: Sat, 26 Dec 2015 22:01:03 GMT
< Last-Modified: Fri, 09 Aug 2013 23:54:35 GMT
< Server: ECS (ewr/15BD)
< Vary: Accept-Encoding
< X-Cache: HIT
< x-ec-custom-error: 1
< Content-Length: 1270
<
Bu size çoğunlukla anlamsız gelebilir, ancak bu, yanıt hakkında normal bir HTTP başlıkları (meta verileri) setidir. İlk satırın "200" olması, oradaki en önemli bilgi parçası olabilir ve "her şey yolunda" anlamına gelir.
Alınan başlıkların son satırı, görebileceğiniz gibi boştur ve bu, HTTP protokolü için başlıkların sonunu belirtmek üzere kullanılan işaretçidir.
Başlıklardan sonra asıl yanıt gövdesi, veri yükü gelir. Normal -v ayrıntılı modu bu verileri göstermez, yalnızca şunu görüntüler:
{ [1270 bytes data]
Bu 1270 baytın 'saved' dosyasında olması gerekir. Yanıtta tam dosya uzunluğunu içeren Content-Length: adında bir başlık olduğunu da görebilirsiniz (ancak yanıtlarda her zaman mevcut olmayabilir).
HTTP/2 ve HTTP/3
HTTP protokolünün ikinci veya üçüncü sürümünü kullanarak dosya transferleri yaparken, curl sıkıştırılmış başlıklar gönderir ve alır. Giden ve gelen HTTP/2 ve HTTP/3 başlıklarını okunabilir ve anlaşılır bir şekilde görüntülemek için curl, sıkıştırılmamış sürümleri HTTP/1.1 ile göründükleri şekle benzer bir tarzda gösterir.
Sessizlik (Silence)
Ayrıntılı modun tersi, elbette curl'ü daha sessiz yapmaktır. -s (veya --silent) seçeneğiyle curl'ün ilerleme göstergesini kapatmasını ve hatalar oluştuğunda herhangi bir hata mesajı vermemesini sağlarsınız. Dilsizleşir. Yine de istediğiniz indirilen verileri çıktılar.
Sessizlik etkinleştirildiğinde, -S veya --show-error ekleyerek hatalarda hata mesajını yine de çıktılamasını isteyebilirsiniz.
İzleme seçenekleri (Trace options)
-v'nin yeterli olmadığı zamanlar vardır. Özellikle, iletilen gerçek veriler de dahil olmak üzere tüm akışı depolamak istediğinizde.
curl'ün HTTPS, FTPS veya SFTP gibi protokollerle şifreli dosya transferleri yaptığı durumlar için, diğer ağ izleme araçları (Wireshark veya tcpdump gibi) bu işi sizin için o kadar kolay yapamaz.
Bunun için curl, -v yerine kullanabileceğiniz iki seçenek daha sunar.
--trace [dosyaadı], verilen dosya adına tam bir iz kaydeder. Ayrıca stdout'a (standart çıktı) geçirilmesi için dosya adı yerine '-' (tek bir eksi) de kullanabilirsiniz. Bunu şöyle kullanırsınız:
$ curl --trace dump http://example.com
Tamamlandığında, oldukça büyük olabilecek bir 'dump' dosyası oluşur. Bu durumda, döküm dosyasının ilk 15 satırı şöyle görünür:
== Info: Rebuilt URL to: http://example.com/
== Info: Trying 93.184.216.34...
== Info: Connected to example.com (93.184.216.34) port 80 (#0)
=> Send header, 75 bytes (0x4b)
0000: 47 45 54 20 2f 20 48 54 54 50 2f 31 2e 31 0d 0a GET / HTTP/1.1..
0010: 48 6f 73 74 3a 20 65 78 61 6d 70 6c 65 2e 63 6f Host: example.co
0020: 6d 0d 0a 55 73 65 72 2d 41 67 65 6e 74 3a 20 63 m..User-Agent: c
0030: 75 72 6c 2f 37 2e 34 35 2e 30 0d 0a 41 63 63 65 url/7.45.0..Acce
0040: 70 74 3a 20 2a 2f 2a 0d 0a 0d 0a pt: */*....
<= Recv header, 17 bytes (0x11)
0000: 48 54 54 50 2f 31 2e 31 20 32 30 30 20 4f 4b 0d HTTP/1.1 200 OK.
0010: 0a .
<= Recv header, 22 bytes (0x16)
0000: 41 63 63 65 70 74 2d 52 61 6e 67 65 73 3a 20 62 Accept-Ranges: b
0010: 79 74 65 73 0d 0a ytes..
Gönderilen ve alınan her bir bayt, onaltılık sayılarla ayrı ayrı görüntülenir. Alınan başlıklar satır satır çıktılanır.
Onaltılık sayıların yardımcı olmadığını düşünüyorsanız, bunun yerine --trace-ascii [dosyaadı] seçeneğini deneyebilirsiniz; bu da stdout için '-' kabul eder ve izlemenin ilk 15 satırının şöyle görünmesini sağlar:
== Info: Rebuilt URL to: http://example.com/
== Info: Trying 93.184.216.34...
== Info: Connected to example.com (93.184.216.34) port 80 (#0)
=> Send header, 75 bytes (0x4b)
0000: GET / HTTP/1.1
0010: Host: example.com
0023: User-Agent: curl/7.45.0
003c: Accept: */*
0049:
<= Recv header, 17 bytes (0x11)
0000: HTTP/1.1 200 OK
<= Recv header, 22 bytes (0x16)
0000: Accept-Ranges: bytes
<= Recv header, 31 bytes (0x1f)
0000: Cache-Control: max-age=604800
Zaman damgaları
--trace-time seçeneği, satırın ne zaman yazdırıldığına dair yüksek çözünürlüklü bir zamanlayıcı ile tüm ayrıntılı/izleme çıktılarına önek ekler. Bu, --trace ve --trace-ascii ile olduğu kadar normal -v / --verbose seçeneğiyle de çalışır.
Bir örnek şöyle görünebilir:
$ curl -v --trace-time http://example.com
23:38:56.837164 * Rebuilt URL to: http://example.com/
23:38:56.841456 * Trying 93.184.216.34...
23:38:56.935155 * Connected to example.com (93.184.216.34) port 80 (#0)
23:38:56.935296 > GET / HTTP/1.1
23:38:56.935296 > Host: example.com
23:38:56.935296 > User-Agent: curl/7.45.0
23:38:56.935296 > Accept: */*
23:38:56.935296 >
23:38:57.029570 < HTTP/1.1 200 OK
23:38:57.029699 < Accept-Ranges: bytes
23:38:57.029803 < Cache-Control: max-age=604800
23:38:57.029903 < Content-Type: text/html
---- snip ----
Satırların hepsi saat:dakika:saniye ve ardından o saniyedeki mikrosaniye sayısı olarak yerel saattir.
Transferleri ve bağlantıları tanımlayın
Bu seçenekleri kullanarak ekranda veya bir dosyada gösterilen izleme bilgi akışı sürekli bir akış olduğundan, komut satırınız curl'ün çok sayıda ayrı bağlantı ve farklı transfer kullanmasına neden olsa bile, aşağıdaki çeşitli bilgilerin hangi belirli transferlere veya bağlantılara ait olduğunu görmek istediğiniz zamanlar olabilir. İzleme çıktısını daha iyi anlamak için.
O zaman satıra --trace-ids ekleyebilirsiniz ve curl'ün tüm izleme işlemlerine iki numara eklediğini görürsünüz: bağlantı numarası ve transfer numarası. Bunlar iki ayrı tanımlayıcıdır çünkü bağlantılar yeniden kullanılabilir ve birden fazla transfer aynı bağlantıyı kullanabilir.
Daha fazla veri
İzleme verisi miktarı yeterli değilse. Örneğin, daha temel bir alt protokol seviyesinde bir sorundan şüphelendiğinizde ve hata ayıklamak istediğinizde curl sizin için --trace-config seçeneğini sunar.
Bu seçenekle curl'e, TLS, HTTP/2 veya HTTP/3 protokol bitleri hakkındaki ayrıntılar gibi varsayılan olarak dahil etmediği bileşenler hakkında günlüğe kaydetmeyi de dahil etmesini söylersiniz. Ayrıca bağlantı ve transfer tanımlayıcılarını ve zaman damgalarını eklemek için kolaylık seçeneklerine de sahiptir.
--trace-config seçeneği, izlemesini istediğiniz alanlarla virgülle ayrılmış bir liste belirttiğiniz bir argümanı kabul eder. Örneğin, tanımlayıcıları dahil edin ve bana HTTP/2 ayrıntılarını gösterin:
curl --trace-config ids,http/2 https://example.com
Seçeneklerin tam seti değişir, ancak deneyebileceğiniz bazıları şunlardır:
| alan | açıklama |
|---|---|
ids | --trace-ids ile aynı tanımlayıcıları sağlar |
time | --trace-time ile aynı zaman çıktısını sağlar |
all | mümkün olan her şeyi göster |
tls | TLS protokol değişimi ayrıntıları |
http/2 | HTTP/2 çerçeve bilgisi |
http/3 | HTTP/3 çerçeve bilgisi |
* | gelecek sürümlerdeki ek olanlar |
all ile hızlı bir çalıştırma yapmak, hangi belirli alanların gösterildiğini görmek için genellikle iyi bir yoldur, çünkü o zaman daha belirli alanlar ayarlanmış olarak takip çalışmaları yapabilirsiniz.
Yazdır (Write out)
--write-out veya kısaca -w, bir transfer tamamlandıktan sonra metin ve bilgi çıktılar (yazdırır). Çıktıya dahil edebileceğiniz, değerlerle ve transferden gelen bilgilerle ayarlanmış çok sayıda değişken sunar.
Bu seçeneğe düz metin ileterek curl'den bir dize çıktılamasını isteyin:
curl -w "formatted string" http://example.com/
…ve dizeyi '@' ile öncelerseniz curl'ün o dizeyi verilen bir dosyadan okumasını da sağlayabilirsiniz:
curl -w @filename http://example.com/
…veya dosya adı olarak '-' kullanırsanız curl'ün dizeyi stdin'den okumasını bile sağlayabilirsiniz:
curl -w @- http://example.com/
Değişkenler
Mevcut olan değişkenlere dizeye %{degisken_adi} yazılarak erişilir ve bu değişken doğru değerle değiştirilir. Düz bir % çıktılamak için %% olarak yazarsınız. Ayrıca \n kullanarak yeni bir satır, \r ile satır başı ve \t ile bir sekme boşluğu çıktılayabilirsiniz.
Örnek olarak, bir HTTP transferinden Content-Type'ı ve yanıt kodunu, yeni satırlarla ve bunun gibi bazı ekstra metinlerle ayrılmış olarak çıktılayabiliriz:
curl -w "Type: %{content_type}\nCode: %{response_code}\n" \
http://example.com
Çıktı varsayılan olarak stdout'a gönderilir, bu nedenle indirilen içeriği de stdout'a göndermediğinizden emin olmak isteyebilirsiniz, aksi takdirde verileri ayırmakta zorlanabilirsiniz; veya çıktıyı stderr'e göndermek için %{stderr} kullanın.
HTTP başlıkları
Bu seçenek ayrıca, en son transferden gelen HTTP yanıt başlıklarının içeriğini çıktılamanın kolay bir yolunu da sağlar.
Dizede %header{isim} kullanın; burada isim, başlığın büyük/küçük harfe duyarlı olmayan adıdır (sondaki iki nokta üst üste olmadan). Çıktı başlık içerikleri daha sonra ağ üzerinden gönderildiği gibi tam olarak gösterilir, baştaki ve sondaki boşluklar kırpılır. Şöyle:
curl -w "Server: %header{server}\n" http://example.com
Çıktı
Varsayılan olarak, bu seçenek seçilen verilerin stdout'ta çıktılamasını sağlar. Bu yeterince iyi değilse, %{stderr} sözde değişkeni (aşağıdaki) kısmı stderr'e yönlendirmek için kullanılabilir ve %{stdout} onu tekrar stdout'a getirir.
curl 8.3.0'dan itibaren, kullanıcıların write-out çıktısını bir dosyaya göndermesine olanak tanıyan bir özellik vardır: %output{dosyaadı}. Takip eden veriler daha sonra o dosyaya yazılır. curl'ün dosyayı sıfırdan oluşturmak yerine o dosyaya eklemesini tercih ederseniz, dosya adının önüne >> ekleyin. Şöyle: %output{>>dosyaadı}.
Bir write-out argümanı, kullanıcının uygun gördüğü şekilde stderr, stdout ve dosyalara çıktı içerebilir.
Windows
NOT: Windows'ta % sembolü, ortam değişkenlerini genişletmek için kullanılan özel bir semboldür. Toplu işlem (batch) dosyalarında, bu seçeneği kullanırken düzgün bir şekilde kaçmak için tüm % oluşumları iki katına çıkarılmalıdır. Bu seçenek komut isteminde (command prompt) kullanılırsa % kaçılamaz ve istenmeyen genişletme mümkündür.
Mevcut --write-out değişkenleri
Bu değişkenlerin bazıları gerçekten eski curl sürümlerinde mevcut değildir.
| Değişken | Açıklama |
|---|---|
certs | En son TLS el sıkışmasından sertifika zincirini çıktılar - ayrıntılarla birlikte. (7.88.0'da tanıtıldı) |
conn_id | Transfer tarafından en son kullanılan bağlantı tanımlayıcısı. Bağlantı kimliği, aynı bağlantı önbelleğini kullanan tüm bağlantılar arasında benzersiz bir sayıdır. (8.2.0'da tanıtıldı) |
content_type | İstek yapılan belgenin Content-Type'ı, eğer varsa. |
errormsg | Transferden gelen hata mesajı. Hata oluşmadıysa boş. (7.75.0'da tanıtıldı) |
exitcode | Transferden gelen sayısal çıkış kodu. Hata oluşmadıysa 0. (7.75.0'da tanıtıldı) |
filename_effective | curl'ün yazdığı nihai dosya adı. curl'e --remote-name veya --output seçeneğiyle bir dosyaya yazması söylendiğinde pratiktir. En çok --remote-header-name seçeneğiyle birlikte kullanıldığında yararlıdır. |
ftp_entry_path | Uzak FTP sunucusunda oturum açıldığında curl'ün son bulduğu ilk yol. |
header_json | Son transferden gelen tüm HTTP yanıt başlıklarını içeren bir JSON nesnesi. Değerler diziler olarak sağlanır, çünkü birden fazla başlık olması durumunda birden fazla değer olabilir. (7.83.0'da tanıtıldı) |
http_code | Artık response_code olarak bilinen şeyin eski değişken adı. |
http_connect | Bir curl CONNECT isteğine (bir vekil sunucudan) son yanıtta bulunan sayısal kod. |
http_version | Kullanılan HTTP sürümü. |
json | Tek bir JSON nesnesi olarak tüm write-out değişkenleri. (7.72.0'da tanıtıldı) |
local_ip | En son kullanılan bağlantının yerel ucunun IP adresi - IPv4 veya IPv6 olabilir |
local_port | En son kullanılan bağlantının yerel port numarası |
method | En son isteğin kullandığı HTTP yöntemi. (7.72.0'da tanıtıldı) |
num_certs | En son TLS el sıkışmasındaki sertifika sayısı. (7.88.0'da tanıtıldı) |
num_connects | Son transferde yapılan yeni bağlantıların sayısı. |
num_headers | Son yanıttaki yanıt başlıklarının sayısı |
num_redirects | İstekte takip edilen yönlendirme sayısı. |
num_retries | --retry kullanıldığında gerçekten gerçekleştirilen yeniden deneme sayısı. (8.9.0'da tanıtıldı) |
onerror | Transfer bir hatayla sonuçlandıysa, dizenin geri kalanını göster, aksi takdirde burada dur. (7.75.0'da tanıtıldı) |
proxy_ssl_verify_result | Bir vekil sunucuyla iletişim kurarken istenen SSL eş sertifika doğrulamasının sonucu. 0, doğrulamanın başarılı olduğu anlamına gelir. |
proxy_used | Önceki transfer bir vekil sunucu kullandıysa 1, aksi takdirde 0 döndürür. Örneğin, bir NOPROXY deseninin ana bilgisayar adıyla eşleşip eşleşmediğini belirlemek için kullanışlıdır. (8.7.0'da tanıtıldı) |
redirect_url | Yönlendirmeleri takip etmek için -L olmadan bir HTTP isteği yapıldığında bir yönlendirmenin sizi götüreceği gerçek URL. |
referer | Referer: başlığı, eğer varsa. (7.76.0'da tanıtıldı) |
remote_ip | En son kullanılan bağlantının uzak IP adresi — IPv4 veya IPv6 olabilir. |
remote_port | En son yapılan bağlantının uzak port numarası. |
response_code | Son transferde bulunan sayısal yanıt kodu. |
scheme | Önceki URL'de kullanılan şema |
size_download | İndirilen toplam bayt sayısı. |
size_header | İndirilen başlıkların toplam bayt sayısı. |
size_request | HTTP isteğinde gönderilen toplam bayt sayısı. |
size_upload | Yüklenen toplam bayt sayısı. |
speed_download | curl'ün tam indirme için ölçtüğü saniyedeki bayt cinsinden ortalama indirme hızı. |
speed_upload | curl'ün tam yükleme için ölçtüğü saniyedeki bayt cinsinden ortalama yükleme hızı. |
ssl_verify_result | İstenen SSL eş sertifika doğrulamasının sonucu. 0, doğrulamanın başarılı olduğu anlamına gelir. |
stderr | Çıktının geri kalanının stderr'e yazılmasını sağlar. |
stdout | Çıktının geri kalanının stdout'a yazılmasını sağlar. |
time_appconnect | Başlangıçtan uzak ana bilgisayara SSL/SSH/vb. bağlantı/el sıkışma tamamlanana kadar geçen saniye cinsinden süre. |
time_connect | Başlangıçtan uzak ana bilgisayara (veya vekil sunucuya) TCP bağlantısı tamamlanana kadar geçen saniye cinsinden süre. |
time_namelookup | Başlangıçtan isim çözümleme tamamlanana kadar geçen saniye cinsinden süre. |
time_pretransfer | Başlangıçtan dosya transferi başlamak üzere olana kadar geçen saniye cinsinden süre. Bu, ilgili protokol(ler)e özgü tüm transfer öncesi komutları ve görüşmeleri içerir. |
time_redirect | Son işlem başlamadan önce isim arama, bağlanma, transfer öncesi ve transfer dahil tüm yönlendirme adımları için geçen saniye cinsinden süre. time_redirect birden fazla yönlendirme için tam yürütme süresidir. |
time_starttransfer | Başlangıçtan ilk bayt transfer edilmek üzere olana kadar geçen saniye cinsinden süre. Bu, time_pretransfer'i ve ayrıca sunucunun sonucu hesaplamak için ihtiyaç duyduğu süreyi içerir. |
time_total | Tam işlemin sürdüğü saniye cinsinden toplam süre. Süre mikrosaniye çözünürlüğüyle görüntülenir. |
url | Transferde kullanılan URL. (7.75.0'da tanıtıldı) |
url_effective | En son getirilen URL. Bu, curl'e Location: başlıklarını takip etmesini söylediyseniz ( -L ile) özellikle anlamlıdır. |
urlnum | Transferde kullanılan URL'nin 0 tabanlı sayısal dizini. (7.75.0'da tanıtıldı) |
xfer_id | Yapılan son transferin sayısal tanımlayıcısı. Tanıtıcı için henüz bir transfer başlatılmadıysa -1. Transfer kimliği, aynı bağlantı önbelleğini kullanarak gerçekleştirilen tüm transferler arasında benzersizdir. (8.2.0'da tanıtıldı) |
curl 8.1.0'da, url veya url_effective değişkenlerinin istediğinizden fazlasını gösterdiği durumlar için yalnızca belirli URL bileşenlerini çıktılama değişkenleri eklendi.
| Değişken | Açıklama |
|---|---|
url.fragment | Getirilen URL'nin bölüm (fragment) kısmı. |
url.host | Getirilen URL'nin ana bilgisayar adı kısmı. |
url.options | Getirilen URL'nin seçenekler kısmı. Yalnızca bazı şemalar için geçerlidir. |
url.password | Getirilen URL'nin parola kısmı. |
url.path | Getirilen URL'nin yol (path) kısmı. |
url.port | Getirilen URL'nin port numarası. |
url.query | Getirilen URL'nin sorgu kısmı. |
url.scheme | Getirilen URL'nin şema kısmı. |
url.user | Getirilen URL'nin kullanıcı kısmı. |
url.zoneid | Getirilen URL'nin bölge kimliği (zone id) kısmı. Yalnızca ana bilgisayar adı bir IPv6 adresiyse mevcuttur. |
urle.fragment | Getirilen etkili (son) URL'nin bölüm kısmı. |
urle.host | Getirilen etkili (son) URL'nin ana bilgisayar adı kısmı. |
urle.options | Getirilen etkili (son) URL'nin seçenekler kısmı. Yalnızca bazı şemalar için geçerlidir. |
urle.password | Getirilen etkili (son) URL'nin parola kısmı. |
urle.path | Getirilen etkili (son) URL'nin yol kısmı. |
urle.port | Getirilen etkili (son) URL'nin port numarası. |
urle.query | Getirilen etkili (son) URL'nin sorgu kısmı. |
urle.scheme | Getirilen etkili (son) URL'nin şema kısmı. |
urle.user | Getirilen etkili (son) URL'nin kullanıcı kısmı. |
urle.zoneid | Getirilen etkili (son) URL'nin bölge kimliği kısmı. Yalnızca ana bilgisayar adı bir IPv6 adresiyse mevcuttur. |
İndirmeler (Downloads)
"İndirme", bir ağdaki sunucudan veri almak anlamına gelir ve sunucu o zaman açıkça sizden "yukarıda" kabul edilir. Bu, verileri sunucudan curl'ü çalıştırdığınız makinenize yüklemektir.
İndirme muhtemelen curl için en yaygın kullanım durumudur — bir URL tarafından işaret edilen belirli verileri makinenize almak.
- İndirme tam olarak nedir?
- İndirmeleri saklama
- URL ile adlandırılan bir dosyaya indirme
- HTML ve karakter setleri
- Kabuk yönlendirmeleri
- Çoklu indirmeler
- Tarayıcım başka bir şey gösteriyor
- Maksimum dosya boyutu
- Dosya sisteminde meta verileri saklama
- Ham (Raw)
- Yeniden deneme (Retry)
- Devam ettirme ve aralıklar
İndirme nedir?
curl'e bir URL vererek indirilecek kaynağı belirtirsiniz. curl, aksi söylenmedikçe bir URL indirmeyi varsayar ve URL ne indirileceğini tanımlar. Bu örnekte indirilecek URL http://example.com:
curl http://example.com
URL kendi bileşenlerine ayrılır (başka bir yerde açıklandığı gibi), doğru sunucuyla iletişime geçilir ve ardından belirli kaynağı — genellikle bir dosyayı — teslim etmesi istenir. Sunucu daha sonra verileri teslim eder veya reddeder ya da belki istemci yanlış verileri istemiştir ve o zaman o veriler teslim edilir.
Bir kaynak isteği protokole özgüdür, bu nedenle bir FTP:// URL'si bir HTTP:// URL'sinden veya bir SFTP:// URL'sinden farklı çalışır.
Yol (path) kısmı olmayan bir URL, yani yalnızca bir ana bilgisayar adı kısmı olan bir URL (yukarıdaki http://example.com örneği gibi) dahili olarak kendisine bir eğik çizgi ('/') ekler ve ardından curl'ün sunucudan istediği kaynak bu olur.
Komut satırında birden fazla URL belirtirseniz, curl her URL'yi tek tek indirir. Önceki tamamlanana kadar ikinci transfere başlamaz, vb.
İndirmeleri saklama
Örnek indirmeyi önceki bölümdeki gibi denerseniz, curl'ün başka bir şey yapması söylenmedikçe indirilen verileri stdout'a (standart çıktı) çıktıladığını fark edebilirsiniz. Verileri stdout'a çıktılamak, onu başka bir programa veya benzerine yönlendirmek (pipe) istediğinizde gerçekten yararlıdır, ancak indirmelerinizle başa çıkmanın her zaman en uygun yolu değildir.
curl'e indirmeyi kaydetmek için -o [dosyaadı] ile (seçeneğin uzun sürümü olarak --output ile) belirli bir dosya adı verin; burada dosya adı sadece bir dosya adı, bir dosya adına giden göreli bir yol veya dosyanın tam yolu olabilir.
Ayrıca -o'yu URL'den önce veya sonra koyabileceğinizi unutmayın; fark etmez:
curl -o output.html http://example.com/
curl -o /tmp/index.html http://example.com/
curl http://example.com -o ../../folder/savethis.html
Bu elbette http:// URL'leri ile sınırlı değildir, hangi tür URL indirirseniz indirin aynı şekilde çalışır:
curl -o file.txt ftp://example.com/path/to/file-name.ext
curl'den çıktıyı terminale göndermesini isterseniz, terminalinizi ciddi şekilde bozabileceği (bazen çalışmayı durdurduğu noktaya kadar) için oraya ikili (binary) verilerin gönderilmesini algılamaya ve engellemeye çalışır. curl'ün ikili çıktı önleme özelliğini geçersiz kılabilir ve -o - kullanarak çıktının stdout'a gönderilmesini zorlayabilirsiniz.
curl'ün indirilen verileri saklamak ve adlandırmak için birkaç başka yolu daha vardır. Ayrıntılar aşağıdadır.
Üzerine yazma (Overwriting)
curl yukarıda açıklandıği gibi uzak bir kaynağı yerel bir dosya adına indirdiğinde, zaten mevcut olması durumunda o dosyanın üzerine yazar. Onu ezer (clobbers).
curl bu ezmeyi önlemenin bir yolunu sunar: --no-clobber.
Bu seçeneği kullanırken ve curl verilen isme sahip bir dosyanın zaten mevcut olduğunu bulduğunda, curl bunun yerine kullanılmayan bir isim bulmak amacıyla dosya adının sonuna bir nokta artı bir sayı ekler. 1 ile başlar ve 100'e ulaşana kadar sayılar denemeye devam eder ve mevcut olan ilkini seçer.
Örneğin, curl'den bir URL'yi picture.pngye indirmesini isterseniz ve o dizinde zaten picture.png ve picture.png.1 adında iki dosya varsa, aşağıdakiler dosyayı picture.png.2 olarak kaydeder:
curl --no-clobber https://example.com/image -o picture.png
Bir kullanıcı, sonunda hangi ismin kullanıldığını anlamak için --write-out seçeneğinin %filename_effective değişkenini kullanabilir.
Hatalarda kalanlar
Varsayılan olarak, curl bir indirme sırasında bir sorunla karşılaşır ve bir hatayla çıkarsa, kısmen aktarılan dosya olduğu gibi bırakılır. Amaçlanan dosyanın küçük bir kısmı olabilir veya neredeyse tamamı olabilir. Kalanlarla ne yapılacağına karar vermek kullanıcıya kalmıştır.
--remove-on-error komut satırı seçeneği bu davranışı değiştirir. curl bir hatayla çıkarsa kısmen kaydedilmiş herhangi bir dosyayı silmesini söyler. Artık kalıntı yok.
URL ile adlandırılan bir dosyaya indirme
Ancak birçok URL, dosya adı kısmını zaten en sağ uçta içerir. curl, bunu bir kısayol olarak kullanmanıza izin verir, böylece -o ile tekrarlamak zorunda kalmazsınız. Şunun yerine:
curl -o file.html http://example.com/file.html
Uzak URL kaynağını şununla yerel 'file.html' dosyasına kaydedebilirsiniz:
curl -O http://example.com/file.html
Bu -O (büyük harf O) seçeneğidir veya uzun isim sürümü için --remote-namedir. -O seçeneği, sağladığınız URL'nin dosya adı kısmını seçerek kullanılacak yerel dosya adını seçer. Bu önemlidir. URL'yi belirtirsiniz ve curl bu verilerden adı seçer. Site curl'ü daha uzağa yönlendirirse (ve curl'e yönlendirmeleri izlemesini söylerseniz), curl'ün bunu saklamak için kullandığı dosya adını değiştirmez.
Başka bir dizinde saklama
Kullanılacak doğru dosya adı yukarıda açıklandığı gibi seçildiğinde, --output-dir kullanarak o dosyanın kaydedileceği dizini yine de değiştirebilirsiniz. Özellikle -O ile birlikte kullanıldığında yararlıdır, çünkü bu seçenek aksi takdirde dosyanın geçerli dizine kaydedilmesini ifade eder.
Yeni dosyayı URL'den alınan bir dosya adını kullanarak /tmp dizinine kaydetmek için:
curl -O --output-dir /tmp http://example.com/file.html
Tüm URL'ler için URL'nin dosya adı kısmını kullanma
Yüzlerce URL kullanırken yüzlerce -O seçeneği eklemeye bir tepki olarak, --remote-name-all adında bir seçenek sunduk. Bu, -O'yu verilen tüm URL'ler için varsayılan işlem yapar. URL'ler için hala bireysel "saklama talimatları" sağlayabilirsiniz ancak indirilen bir URL için bir tane bırakırsanız, varsayılan eylem o zaman stdout'tan -O stiline geçer.
Sunucudan gelen hedef dosya adını kullanma
HTTP sunucuları, yanıtlarda Content-Disposition: adında bir başlık sağlama seçeneğine sahiptir. Bu başlık, teslim edilen içerikler için önerilen bir dosya adı içerebilir ve curl'e yerel dosyasını adlandırmak için bu ipucunu kullanması söylenebilir. -J / --remote-header-name bunu etkinleştirir. Ayrıca -O seçeneğini de kullanırsanız, curl'ün varsayılan olarak URL'den gelen dosya adını kullanmasını sağlar ve yalnızca eğer gerçekten geçerli bir Content-Disposition başlığı mevcutsa, o adı kullanarak kaydetmeye geçer.
Birden fazla Content-Disposition başlığı varsa, curl gördüğü ilk başlıktan adı seçer.
Varsayılan olarak curl o dosyayı geçerli dizininize kaydeder, bu --output-dir ile değiştirilebilir.
-J'nin kullanıcıların dikkat etmesi gereken bazı zorlukları ve riskleri vardır:
-
Yalnızca önerilen dosya adının en sağdaki kısmını kullanır; yol kısmı çıkarılır.
-
Dosya adı sunucu tarafından sağlandığından, sunucu böyle bir dosya adı sağlarsa (
--clobberkullanmadığınız sürece) curl geçerli dizininizdeki önceden var olan herhangi bir yerel dosyanın üzerine yazmaz. -
dosya adı kodlaması ve karakter seti sorunları. curl adı hiçbir şekilde çözmez, bu nedenle bir tarayıcının aksi takdirde mantıklı bir karakter seti kullanarak daha okunabilir bir şeye çözeceği URL kodlu bir dosya adıyla baş başa kalabilirsiniz.
Location: da
Yukarıda bahsedilen yaklaşım oldukça iyi çalışır, ancak sınırlamaları vardır. Bunlardan biri, sitenin bir Content-Disposition başlığı sağlamak yerine istemciyi indirmek için yeni bir URL'ye yönlendirmesi durumunda, curl'ün yeni adı almaması, bunun yerine orijinal olarak sağlanan URL'den gelen adı kullanmaya devam etmesidir.
curl 8.19.0'dan bu yana, -J aynı zamanda Location: başlıklarından dosya adını alır ve Content-Disposition başlığı gelmezse bu dosya adını kullanır.
Şunun gibi bir komut satırı çalıştırırsanız:
curl -L -O -J https://example.com/download?id=6347d
Sitenin curl'ü indirmek istediğiniz tarball için gerçek indirme URL'sine şöyle yönlendirdiğini varsayarsak:
HTTP/1 301 redirect
Location: https://example.org/release.tar.gz
Bu, curl'ün o transferin içeriğini release.tar.gz adlı yerel bir dosyaya kaydetmesini sağlar.
Eğer hem bir yönlendirme hem de bir Content-Disposition başlığı varsa, ikincisi önceliklidir.
Hangi dosya adı?
Verileri saklamak için kullanılan seçilen son ad, sunucudan geçirilen bir başlığın içeriğine göre seçildiğinden, bu seçeneği bir komut dosyası senaryosunda kullanmak şu zorluğu getirir: curl aslında hangi dosya adını kullandı?
Bir kullanıcı curl'ün -w seçeneği ile bu bilgiyi kolayca çıkarabilir. Şöyle:
curl -w '%{filename_effective}' -O -J -L \
https://example.com/download?id=6347d
Bu komut satırı kullanılan dosya adını stdout'a çıktılar.
Komut satırını, o adı stderr'e veya belirli bir dosyaya vb. yönlendirmek için daha da değiştirin. Neyin işe yaradığını düşünüyorsanız.
HTML ve karakter setleri
curl, sunucunun gönderdiği tam ikili veriyi indirir. Örneğin, bir HTML sayfası veya tarayıcınızın daha sonra beklenen şekilde görüntülediği belirli bir karakter kodlaması kullanan başka metin verileri indirmeniz durumunda bu sizin için önemli olabilir. curl gelen verileri çevirmez.
Bunun bazı şaşırtıcı sonuçlara neden olduğu yaygın bir örnek, bir kullanıcının şunun gibi bir web sayfasını indirmesidir:
curl https://example.com/ -o storage.html
…ve işlemden sonra storage.html dosyasını incelerken kullanıcı bir veya daha fazla karakterin komik veya tamamen yanlış göründüğünü fark eder. Bu, sunucunun karakterleri karakter seti X kullanarak göndermesi, düzenleyicinizin ve ortamınızın ise karakter seti Y kullanması nedeniyle olabilir. İdeal bir dünyada hepimiz her yerde UTF-8 kullanırdık ama ne yazık ki durum hala böyle değil.
Bu soruna yönelik makul bir şekilde çalışan yaygın bir geçici çözüm, bir metin dosyasını farklı karakter setlerine ve karakter setlerinden çevirmek için yaygın iconv yardımcı programını kullanmaktır.
Kabuk yönlendirmeleri (Shell redirects)
curl'ü bir kabuktan veya başka bir komut satırı istemi sisteminden çağırdığınızda, o ortam genellikle size bir dizi çıktı yönlendirme yeteneği sağlar. Çoğu Linux ve Unix kabuğunda ve Windows komut istemlerinde, > dosyaadı ile stdout'u (standart çıktı) bir dosyaya yönlendirirsiniz. Bunu kullanmak, elbette -o veya -O kullanımını gereksiz kılar.
curl http://example.com/ > example.html
Çıktıyı bir dosyaya yönlendirmek, curl'den gelen tüm çıktıları o dosyaya yönlendirir, bu nedenle birden fazla URL'yi stdout'a aktarmayı isteseniz bile, çıktıyı yönlendirmek tüm URL'lerin çıktısının o tek dosyada saklanmasını sağlar.
curl http://example.com/1 http://example.com/2 > files
Unix kabukları genellikle stderr akışını ayrı olarak yönlendirmenize izin verir. stderr akışı genellikle terminalde de gösterilen bir akıştır, ancak onu stdout akışından ayrı olarak yönlendirebilirsiniz. stdout akışı veriler içindir, stderr ise veri olmayan meta veriler, hatalar vb. içindir. stderr'i 2>file ile şu şekilde yönlendirebilirsiniz:
curl http://example.com > files.html 2>errors
Çoklu indirmeler
curl'e tek bir komut satırında birçok URL'yi indirmesi söylenebildiğinden, elbette bu indirmeleri güzelce adlandırılmış yerel dosyalarda saklamak istediğiniz zamanlar olur.
Bunu anlamanın anahtarı, her indirme URL'sinin kendi "saklama talimatına" ihtiyaç duymasıdır. Söz konusu "saklama talimatı" olmadan curl varsayılan olarak verileri stdout'a gönderir. İki URL isterseniz ve curl'e yalnızca ilk URL'yi nereye kaydedeceğini söylerseniz, ikincisi stdout'a gönderilir. Şöyle:
curl -o one.html http://example.com/1 http://example.com/2
"Saklama talimatları" indirme URL'leriyle aynı sırayla okunur ve işlenir, bu nedenle URL'nin yanında olmaları gerekmez. Tüm çıktı seçeneklerini en başta, en sonda veya URL'lerle serpiştirilmiş olarak toplayabilirsiniz. Siz seçin.
Bu örneklerin hepsi aynı şekilde çalışır:
curl -o 1.txt -o 2.txt http://example.com/1 http://example.com/2
curl http://example.com/1 http://example.com/2 -o 1.txt -o 2.txt
curl -o 1.txt http://example.com/1 http://example.com/2 -o 2.txt
curl -o 1.txt http://example.com/1 -o 2.txt http://example.com/2
-O benzer şekilde tek bir indirme için sadece bir talimattır, bu nedenle birden fazla URL indirirseniz bunlardan daha fazlasını kullanın:
curl -O -O http://example.com/1 http://example.com/2
Paralel
Aksi belirtilmedikçe, curl verilen tüm URL'leri seri bir şekilde, tek tek indirir. -Z (veya --parallel) kullanarak curl bunun yerine transferleri paralel olarak yapabilir: aynı anda birkaç tane.
Tarayıcım başka bir şey gösteriyor
Yaygın bir kullanım durumu, URL'yi tarayıcının adres çubuğuna yapıştırdığınızda tarayıcınızda alabileceğiniz bir URL'yi almak için curl kullanmaktır.
Girdi olarak bir URL alan bir tarayıcı, curl'den o kadar çok şey ve o kadar farklı şekillerde yapar ki, curl'ün terminal çıktısında gösterdiği şey muhtemelen tarayıcı pencerenizde gördüğünüz şeyle hiç aynı değildir.
İstemci farklılıkları
Curl yalnızca tam olarak almasını istediğiniz şeyi alır ve sunucunun teslim ettiği gerçek içeriği —veriyi— asla ayrıştırmaz. Bir tarayıcı veri alır ve aldığı içeriğin türüne bağlı olarak farklı ayrıştırıcıları etkinleştirir. Örneğin, veri HTML ise, bir web sayfasını görüntülemek ve muhtemelen resimler, JavaScript ve CSS dosyaları gibi diğer alt kaynakları indirmek için ayrıştırır. curl HTML indirdiğinde, bir tarayıcı tarafından ayrıştırıldığında bir sürü daha fazla indirmeyi tetikleyecek olsa bile, yalnızca o tek HTML kaynağını alır. curl'ün alt kaynakları da indirmesini istiyorsanız, bu URL'leri curl'e iletmeniz ve tıpkı diğer URL'ler gibi onları almasını istemeniz gerekir.
İstemciler ayrıca isteklerini nasıl gönderdikleri konusunda da farklılık gösterir ve bir kaynak isteğinin bazı yönleri, örneğin biçim tercihlerini, sıkıştırılmış veri istemeyi veya sadece sunucuya hangi önceki sayfadan "geldiğimizi" söylemeyi içerir. curl'ün istekleri, tarayıcınızın isteklerini gönderme şeklinden biraz veya çok farklıdır.
Sunucu farklılıkları
İsteği alan ve verileri teslim eden sunucu genellikle, kendisiyle iletişim kurduğunu düşündüğü istemci türüne bağlı olarak belirli şekillerde davranacak şekilde ayarlanmıştır. Bazen bu, istemci için en iyi içeriği sunmaya çalışmak kadar masumdur, bazen bazı içerikleri bazı istemciler için gizlemek veya hatta belirli tarayıcılardaki bilinen sorunların etrafından dolaşmaya çalışmaktır. Ayrıca elbette HTTP kimlik doğrulamasına veya çerezlere veya istemcinin önceden doğrulanmış IP adresi aralığından olmasına dayanabilecek çeşitli oturum açma sistemleri de vardır.
Bazen curl kullanarak bir sunucudan bir tarayıcıyla aldığınız yanıtın aynısını almak gerçekten zor bir işe dönüşür. Kullanıcılar daha sonra tipik olarak tarayıcı oturumlarını tarayıcının ağ araçlarıyla kaydeder ve ardından bu kaydı curl'ün --trace-ascii seçeneğinden gelen kaydedilmiş verilerle karşılaştırır ve sunucu her ikisine de aynı yanıtı verene kadar curl'ün isteklerini (genellikle -H / --header ile) değiştirmeye devam eder.
Bu tür bir çalışma hem zaman alıcı hem de sıkıcı olabilir. Bunu her zaman sunucu sahiplerinden veya yöneticilerinden izin alarak yapmalısınız.
Aradaki aracıların oynamaları
Aracılar (Intermediaries), açık veya örtük vekil sunuculardır (proxies). Bazı ortamlar sizi bir tane kullanmaya zorlar veya çeşitli nedenlerle bir tane kullanmayı seçebilirsiniz, ancak ağ trafiğinizi sessizce engelleyen ve ne isterseniz isteyin sizin adınıza vekil sunuculuk yapan şeffaf olanlar da vardır.
Vekil sunucular, trafiği sonlandıran ve ardından uzak sunucuya karşı sizin adınıza hareket eden "aracı adamlardır". Bu, her türlü açık filtrelemeyi ve sizi belirli içeriklerden "kurtarmayı" ve hatta uzak sunucuyu ona göndermeye çalıştığınız verilerden "korumayı" getirebilir, ancak daha da fazlası, protokolün nasıl çalıştığına ve yapılacak doğru şeylerin neler olduğuna dair başka bir yazılımın görüşünü getirir.
Müdahale eden aracılar genellikle birçok baş ağrısının ve gizemin, hatta içeriğin düpedüz kötü niyetli modifikasyonlarının nedenidir.
İndirdiğiniz veya yüklediğiniz içeriğin gerçekten uzak sunucunun size gönderdiği veriler olduğunu ve değerli baytlarınızın amaçlanan hedefe kelimesi kelimesine ulaştığını doğrulamak için HTTPS veya diğer yolları kullanmanızı şiddetle tavsiye ederiz.
Maksimum dosya boyutu
curl komut satırınızın çok büyük bir dosyayı indirmediğinden emin olmak istediğinizde, transfer başlamadan önce boyutu biliyorsa curl'e bunu yapmadan önce durması talimatını verin. Belki bu çok fazla bant genişliği kullanır, çok uzun sürer veya sabit diskinizde yeterli alanınız yoktur:
curl --max-filesize 100000 https://example.com/
curl'e bayt sayısı cinsinden kabul edebileceğiniz en büyük indirmeyi verin ve curl transfer başlamadan önce boyutu anlayabilirse daha büyük bir şeyi indirmeyi denemeden önce iptal eder.
Transfer başladığı sırada curl'ün boyutu anlayamadığı birçok durum vardır. Bu tür transferler, ancak gerçekten o sınıra ulaştıklarında iptal edilir.
Dosya sisteminde meta verileri saklama
curl ile bir indirmeyi dosyaya kaydederken, --xattr seçeneği curl'e belirli dosya meta verilerini "genişletilmiş dosya özniteliklerinde" (extended file attributes) saklamasını söyler. Bu genişletilmiş öznitelikler, desteklenen dosya sistemlerinden ve işletim sistemlerinden birinin kullanıldığı varsayılarak dosya sisteminde saklanan standartlaştırılmış ad/değer çiftleridir.
Şu anda URL xdg.origin.url özniteliğinde saklanır ve HTTP için içerik türü mime_type özniteliğinde saklanır. Bu seçenek ayarlandığında dosya sistemi genişletilmiş öznitelikleri desteklemiyorsa bir uyarı verilir.
Ham (Raw)
--raw kullanıldığında, tüm dahili HTTP içerik veya transfer kodlaması çözümlerini devre dışı bırakır ve bunun yerine curl'ün değiştirilmemiş, ham verileri aktarmasını sağlar.
Bu tipik olarak, bir ara yazılım yazıyorsanız ve içeriği başka bir HTTP istemcisine aktarmak ve kod çözme işlemini onun yapmasına izin vermek istiyorsanız kullanılır.
Yeniden deneme (Retry)
Normalde curl, bir transfer gerçekleştirmek için yalnızca tek bir girişimde bulunur ve başarılı olmazsa bir hata döndürür. --retry seçeneğini kullanarak curl'e belirli başarısız transferleri yeniden denemesini söyleyebilirsiniz.
curl bir transfer gerçekleştirmeye çalışırken geçici bir hata döndürülürse, pes etmeden önce bu sayı kadar yeniden dener. Sayıyı 0'a ayarlamak curl'ün yeniden deneme yapmamasını sağlar (bu varsayılandır). Geçici hata şunlardan biri anlamına gelir: bir zaman aşımı, bir FTP 4xx yanıt kodu veya bir HTTP 408, 429, 500, 502, 503 veya 504 yanıt kodu.
Yeniden denemelerinizi ayarlayın
curl bir transferi yeniden denemek üzereyken, önce bir saniye bekler ve ardından gelen tüm yeniden denemeler için bekleme süresini 10 dakikaya ulaşana kadar ikiye katlar; bu daha sonra geri kalan yeniden denemeler arasındaki gecikmedir. --retry-delay kullanarak bu üstel geri çekilme algoritmasını devre dışı bırakabilir ve denemeler arasına kendi gecikmenizi ayarlayabilirsiniz. --retry-max-time ile yeniden denemeler için izin verilen toplam süreyi sınırlarsınız. --max-time seçeneği yine de bu transferlerin tek birinin harcamasına izin verilen en uzun süreyi belirtir.
curl'ü 5 defaya kadar yeniden denemeye zorlayın, ancak iki dakikadan fazla değil:
curl --retry 5 --retry-max-time 120 https://example.com
Bağlantı reddedildi
Varsayılan yeniden deneme mekanizması, yalnızca geçici hatalar olarak kabul edilenler için transferleri yeniden dener. Bunlar, sunucunun kendisinin ipucu verdiği ve şu anda orada olduğunu ancak daha sonraki bir zamanda gidebileceğini nitelendirdiği hatalardır.
Bazen bir kullanıcı olarak durum hakkında daha fazla bilgi sahibi olursunuz ve o zaman curl'ün daha iyi yeniden denemeler yapmasına yardımcı olabilirsiniz. Başlangıç olarak, curl'e "bağlantı reddedildi" (connection refused) hatasını geçici bir hata olarak kabul etmesini söyleyebilirsiniz. Belki iletişim kurduğunuz sunucunun istikrarsız biri olduğunu biliyorsunuzdur veya belki de yeniden başlatıldığında bazen ondan indirmeye çalıştığınızı biliyorsunuzdur. Bunun için --retry-connrefused kullanırsınız.
Örneğin: 5 defaya kadar yeniden deneyin ve ECONNREFUSED'ı yeniden deneme nedeni olarak kabul edin:
curl --retry 5 --retry-connrefused https://example.com
Herhangi bir ve tüm hatalarda yeniden deneyin
Yeniden denemenin en agresif biçimi, URL'nin çalışması gerektiğini bildiğiniz ve herhangi bir başarısızlığa tahammül etmediğiniz durumlar içindir. --retry-all-errors kullanmak, curl'ün tüm transfer başarısızlıklarını yeniden deneme nedeni olarak görmesini sağlar.
Örneğin: tüm hatalar için 12 defaya kadar yeniden deneyin:
curl --retry 12 --retry-all-errors https://example.com
Devam ettirme ve aralıklar
Bir indirmeyi devam ettirmek, önce yerel olarak neyin mevcut olduğunun boyutunu kontrol etmek ve ardından sunucudan geri kalanını göndermesini istemek anlamına gelir, böylece eklenebilir. curl ayrıca aslında yerel olarak önceden mevcut bir şeye sahip olmadan transferi özel bir noktada devam ettirmeye izin verir.
curl, çeşitli protokollerde devam ettirilen indirmeleri destekler. Transferin nereden başlayacağını, nereden başlayacağını belirten düz sayısal bir bayt sayacı ofseti alan veya curl'den bildiklerine dayanarak bunu kendisinin bulmasını isteyen - dizesini alan -C, --continue-at seçeneğiyle söyleyin. - kullanıldığında, curl yerel olarak ne kadar verinin mevcut olduğunu anlamak için hedef dosya adını kullanır ve sunucudan daha fazla veri isterken bunu bir ofset olarak kullanır.
Bayt ofseti 100'den bir FTP dosyası indirmeye başlamak için:
curl --continue-at 100 ftp://example.com/bigfile
Daha önce kesintiye uğramış bir indirmeyi indirmeye devam edin:
curl --continue-at - http://example.com/bigfile -O
Bunun yerine uzak kaynaktan sadece belirli bir bayt aralığının transfer edilmesini istiyorsanız, sadece bunu isteyebilirsiniz. Örneğin, tüm devasa uzak dosyayı indirmek zorunda kalmamak için ofset 100'den sadece 1000 bayt istediğinizde:
curl --range 100-1099 http://example.com/bigfile
Yüklemeler (Uploads)
Yükleme, uzak bir sunucuya veri göndermek için kullanılan bir terimdir. Yükleme her protokol için farklı şekilde yapılır ve hatta birkaç protokol verileri yüklemenin farklı yollarına izin verebilir.
Yüklemeye izin veren protokoller
Şu protokollerden birini kullanarak veri yükleyebilirsiniz: FILE, FTP, FTPS, HTTP, HTTPS, IMAP, IMAPS, SCP, SFTP, SMB, SMBS, SMTP, SMTPS ve TFTP.
HTTP çeşitli yüklemeler sunar
HTTP ve onun büyük kardeşi HTTPS, bir sunucuya veri yüklemek için birkaç farklı yol sunar ve curl, aşağıda açıklanan en yaygın üç yolu yapmak için kolay komut satırı seçenekleri sağlar.
HTTP ile ilgili ilginç bir ayrıntı, bir yüklemenin aynı işlemde bir indirme de olabilmesidir ve aslında birçok indirme bir HTTP POST ile başlatılır.
POST
POST, bir alıcı web uygulamasına veri göndermek için icat edilen HTTP yöntemidir ve örneğin web'deki en yaygın HTML formlarının çalışma şeklidir. Genellikle alıcıya nispeten küçük miktarlarda veri parçası gönderir.
Yükleme türü genellikle -d veya --data seçenekleriyle yapılır, ancak birkaç ek değişiklik daha vardır.
Bunu curl ile nasıl yapacağınıza dair ayrıntılı açıklamayı curl ile HTTP POST bölümünde okuyun.
multipart formpost
Multipart (çok parçalı) form gönderileri, web sitelerindeki HTML formlarında da kullanılır; genellikle bir dosya yüklemesi söz konusu olduğunda. Bu tür bir yükleme de bir HTTP POST'tur ancak verileri, multipart adının anlamı olan bazı özel kurallara göre biçimlendirilmiş olarak gönderir.
Verileri tamamen farklı biçimlendirilmiş olarak gönderdiğinden, hangi tür POST'u kullanacağınızı kendi isteğinize göre seçemezsiniz, ancak bu tamamen alıcı sunucu tarafının ne beklediğine ve neyi işleyebileceğine bağlıdır.
HTTP multipart form gönderileri -F ile yapılır. HTTP multipart form gönderileri bölümündeki ayrıntılı açıklamaya bakın.
PUT
HTTP PUT, uzak siteye olduğu gibi konulması veya hatta orada mevcut bir kaynağın yerini alması amaçlanan tam bir kaynağı göndermek için tasarlanmış yükleme yöntemidir. Bununla birlikte, bu aynı zamanda bugün web'de HTTP için en az kullanılan yükleme yöntemidir ve çoğu olmasa da birçok web sunucusunda PUT etkin bile değildir.
Yüklenecek dosyayla birlikte -T seçeneğini kullanarak bir HTTP yüklemesi gönderirsiniz:
curl -T uploadthis http://example.com/
FTP ve SFTP yüklemeleri
FTP ve SFTP ile çalışırken, eriştiğiniz uzak dosya sistemini görürsünüz. Sunucuya yüklemenin tam olarak hangi dizine yerleştirilmesini istediğinizi ve hangi dosya adının kullanılacağını tam olarak söylersiniz. Yükleme URL'sini sonunda bir eğik çizgi ile belirtirseniz, curl yerel olarak kullanılan dosya adını URL'ye ekler ve daha sonra uzak olarak saklandığında kullanılan dosya adı o olur:
curl -T uploadthis ftp://example.com/this/directory/
FTP ve SFTP ayrıca üzerine yazmak yerine yüklerken hedef dosyaya eklemeyi (appending), --append seçeneğiyle destekler:
curl -T uploadthis --append ftp://example.com/directory/remotename
"FTP with curl" (curl ile FTP) bölümünde FTP kullanımı hakkında çok daha fazla bilgi edinin.
SMTP yüklemeleri
Bir e-posta göndermeyi yükleme olarak düşünmeyebilirsiniz, ancak curl için öyledir. Posta gövdesini SMTP sunucusuna yüklersiniz. SMTP ile, curl hiç eklemediği için ihtiyacınız olan tüm posta başlıklarını (To:, From:, Date: vb.) posta gövdesine de eklemeniz gerekir.
curl -T mail smtp://mail.example.com/ --mail-from user@example.com
E-posta gönderme bölümünde curl ile SMTP kullanımı hakkında daha fazla bilgi edinin.
Yüklemeler için ilerleme göstergesi
curl'ün sağladığı genel ilerleme göstergesi (İlerleme göstergesi bölümüne bakın) yüklemeler için de gayet iyi çalışır. Hatırlanması gereken şey, çıktıyı stdout'a gönderdiğinizde ilerleme göstergesinin otomatik olarak devre dışı bırakıldığıdır ve curl'ün desteklediği çoğu protokol bir yükleme için bile bir şeyler çıktılayabilir.
Bu nedenle, yükleme için ilerleme göstergesinin görüntülenmesini sağlamak için indirilen verileri açıkça bir dosyaya (kabuk yönlendirmesi '>', -o veya benzerini kullanarak) yönlendirmeniz gerekebilir.
Globbing
curl ayrıca -T argümanında globbing desteği sunar, böylece bir dizi dosyayı kolayca yüklemeyi seçebilirsiniz:
curl -T 'image[1-99].jpg' ftp://ftp.example.com/upload/
veya bir dosya serisi:
curl -T '{file1,file2}' https://example.com/upload/
veya
curl -T '{Huey,Dewey,Louie}.jpg' ftp://ftp.example.com/nephews/
Transfer kontrolleri
curl, transferlerin nasıl gerçekleştirileceğini kontrol etmek için birkaç farklı düğme ve kol sunar. Ne kadar hızlı gitmelerine izin verileceği, ne kadar yavaş çalışmalarına izin verileceği ve çoklu transferlerin nasıl yapılacağı.
- Yavaş transferleri durdurma
- Hız sınırlama (Rate limiting)
- İstek hızı sınırlama
- Sıkıştırma
- Zaten yapılmışsa indirmeyi atla
Yavaş transferleri durdurma
Bir curl işlemi için sabit bir maksimum süreye sahip olmak zahmetli olabilir, özellikle de örneğin komut dosyasıyla transferler yapıyorsanız ve dosya boyutları ile transfer süreleri çok değişiyorsa. Sabit bir zaman aşımı değerinin, en kötü durumları kapsayacak şekilde gereksiz yere yüksek ayarlanması gerekir.
Sabit bir zaman aşımına alternatif olarak, curl'e transfer belirli bir hızın altına düşerse ve belirli bir süre boyunca bu eşiğin altında kalırsa transferi terk etmesini söyleyebilirsiniz.
Örneğin, bir transfer hızı 15 saniye boyunca saniyede 1000 baytın altına düşerse durdurun:
curl --speed-time 15 --speed-limit 1000 https://example.com/
Hız sınırlama (Rate limiting)
curl veri transfer ettiğinde, bunu mümkün olduğunca hızlı yapmaya çalışır. Bu hem yüklemeler hem de indirmeler için geçerlidir. Bunun tam olarak ne kadar hızlı olacağı, bilgisayarınızın yeteneği, kendi ağ bağlantınızın bant genişliği, transfer yaptığınız/aldığınız uzak sunucudaki yük ve o sunucuya olan gecikme dahil olmak üzere çeşitli faktörlere bağlıdır. curl transferlerinizin, verilerin üzerinden geçtiği ağlardaki diğer transferlerle, diğer kullanıcılardan veya aynı kullanıcının diğer uygulamalarından gelenlerle rekabet etmesi de muhtemeldir.
Ancak birçok kurulumda, tek bir curl komut satırı ile kendi ağ bağlantınızı az çok doyurabilirsiniz. İnternete saniyede 10 megabitlik bir bağlantınız varsa, curl'ün veri aktarmak için bu 10 megabitin tamamını kullanabilme şansı yüksektir.
Çoğu kullanım durumu için mümkün olduğunca fazla bant genişliği kullanmak iyi bir şeydir. Transferi hızlandırır, curl komutunun daha erken tamamlanmasını sağlar ve transferin sunucudaki kaynakları daha kısa bir süre kullanmasını sağlar.
Bazen curl'ün yerel ağ bağlantınızdaki diğer ağ işlevlerini aç bırakması sakıncalıdır. Bu durumlarda, diğer ağ kullanıcılarının da verilerini iletme şansının daha yüksek olması için curl'e yavaşlamasını söylemek isteyebilirsiniz. --limit-rate [hız] ile curl'e verilen saniyedeki bayt sayısından daha hızlı gitmemesini söyleyebilirsiniz. Hız sınırı değeri, kilobayt, megabayt ve gigabayt için K, M ve G harf eklerinden biri kullanılarak verilebilir.
curl'ün verileri saniyede 200 kilobayttan daha hızlı indirmemesini sağlamak için:
curl https://example.com/ --limit-rate 200K
Verilen sınır, birkaç saniyelik bir süre boyunca izin verilen maksimum ortalama hızdır. Bu, curl'ün kısa süreli patlamalarda daha yüksek transfer hızları kullanabileceği, ancak zamanla ortalamasının verilen hızdan fazla olmayacağı anlamına gelir.
curl mümkün olan maksimum hızın ne olduğunu bilmez — sadece olabildiğince ve izin verildiği kadar hızlı gider. Bağlantınızın maksimum hızını biliyor olabilirsiniz, curl bilmez.
İstek hızı sınırlama
Tek bir komut satırında birden fazla transfer yapması söylendiğinde, bir kullanıcının bu birden fazla transferin mümkün olduğunca hızlı değil de daha yavaş yapılmasını tercih edeceği zamanlar olabilir. Buna istek hızı sınırlama (request rate limiting) diyoruz.
--rate seçeneğiyle, curl'ün kullanmasına izin verdiğiniz maksimum transfer sıklığını - zaman birimi başına transfer başlangıcı sayısı (bazen istek hızı olarak adlandırılır) olarak - belirtirsiniz. Bu seçenek olmadan, curl bir sonraki transfere mümkün olduğunca hızlı başlar.
Birkaç URL verilirse ve bir transfer izin verilen hızdan daha hızlı tamamlanırsa, curl istenen hızı korumak için bir sonraki transferi başlatmayı geciktirir. Bu seçenek seri transferler içindir ve --parallel kullanıldığında hiçbir etkisi yoktur.
İstek hızı N/U olarak sağlanır; burada N bir tam sayı ve U bir zaman birimidir. Desteklenen birimler s (saniye), m (dakika), h (saat) ve d (gün, 24 saatlik bir birim olarak) şeklindedir. Varsayılan zaman birimi, /U sağlanmazsa saat başına transfer sayısıdır.
curl'e dakikada 10 isteğe izin verilmesi söylenirse, önceki transferin başlatılmasından bu yana 6 saniye geçene kadar bir sonraki isteği başlatmaz.
Bu işlev milisaniye çözünürlüğü kullanır. İzin verilen sıklık saniyede 1000'den fazla ayarlanırsa, bunun yerine sınırsız çalışır.
--retry ile etkinleştirilen transferleri yeniden denerken, bu ayar değil, ayrı yeniden deneme gecikmesi mantığı kullanılır.
Bu seçenek birkaç kez kullanılırsa sonuncusu kullanılır.
Örneğin, curl'ün 100 resim indirmesini sağlayın ancak bunu saniyede 2 transferden daha hızlı yapmamasını sağlayın:
curl --rate 2/s -O https://example.com/[1-100].jpg
curl'ün 10 resim indirmesini sağlayın ancak bunu saatte 3 transferden daha hızlı yapmamasını sağlayın:
curl --rate 3/h -O https://example.com/[1-10].jpg
curl'ün 200 resim indirmesini sağlayın ancak dakikada 14 transferden daha hızlı yapmamasını sağlayın:
curl --rate 14/m -O https://example.com/[1-200].jpg
Birim sayısı
curl 8.10.0'dan başlayarak, bu seçenek isteğe bağlı bir birim sayısı kabul eder. İstek hızı daha sonra N / Z U (boşluksuz) olarak sağlanır; burada N bir sayıdır, Z bir zaman birimi sayısıdır ve U bir zaman birimidir.
Sayı ve birimler yukarıda belirtilenlerle aynıdır, ancak artık bir zaman birimi sayısı da belirtebilirsiniz. Z sayısı kadar U biriminde N istek.
Örneğin, her beş saniyede sekizden fazla transfer yapmayın:
curl --rate 8/5s -O https://example.com/[1-100].jpg
Sıkıştırma
Gönderilmeden önce verilerin otomatik olarak sıkıştırılması, gereken bant genişliğinin azalması nedeniyle verilerin diğer uca daha hızlı ulaşmasına yardımcı olabilir.
curl, SFTP, SCP ve HTTP(S) için otomatik sıkıştırma ve açma sunar. HTTP(S) ile bunu yalnızca indirmeler için yapmak mümkünken, SFTP ve SCP her iki yön için de sunar.
HTTP için
Ayrıntılar için HTTP sıkıştırma bölümüne bakın.
SFTP/SCP için
Komut satırında --compressed-ssh seçeneğini sağlayın ve transfer, yapabiliyorsa otomatik ve şeffaf bir şekilde sıkıştırma kullanacaktır. Şöyle:
curl -O --compressed-ssh sftp://example.com/bigfile
Zaten yapılmışsa indirmeyi atla
Bazen arada sırada İnternet transferleri yapmak için bir komut dosyası veya benzeri yazarken, hedef dosya yerel olarak zaten mevcutsa curl'ün transfer yapmayı atlamasını tercih ettiğiniz bir duruma düşersiniz. Belki önceki çağrıdan sonra, belki de başka bir nedenden dolayı.
Bu tür ekstra mantık, birçok durumda curl çağrılmadan önce kesinlikle yaygın kabuk komut dosyası mantığına eklenebilir ancak her zaman değil. Örneğin, curl'den globbing indirme aralıkları kullanmasını istediğinizde işler karmaşıklaşır.
Örneğin, bir siteden bin resim indirin ancak daha önce indirdiğimiz resimleri atlayın:
curl --skip-existing -O https://example.com/image[0-999].jpg
Bunun yalnızca yerel dosyanın varlığını kontrol ettiği, aslında doğru içeriğe sahip olduğunu doğrulamak için hiçbir girişimde bulunmadığı ve bu tür kontrolleri yapmanın bir yolu olmadığı unutulmamalıdır.
curl, değiştirilme tarihine veya HTTP transferleri için içeriklere dayalı olarak koşullu transferler yapmak için başka seçenekler sunar.
Bağlantılar (Connections)
curl ile kullandığınız URL'lerin çoğu bir ana bilgisayar adına sahiptir ve IP üzerinden iletişim içerir. curl önce iletişim kurmak istediğiniz ana bilgisayarın IP adres(ler)ini bulmalı, sonra ona bağlanmalıdır. "Ona bağlanmak", bir protokol el sıkışması gerçekleştirmek anlamına gelir.
Bir URL üzerinde çalışan sıradan komut satırı kullanımı için, bunlar kaputun altında halledilen ve çoğunlukla görmezden gelebileceğiniz ayrıntılardır. Ancak bazen kendinizi ayrıntıları değiştirmek isterken bulabilirsiniz…
- Kurulum
- İsim çözümleme hileleri
- Bağlantı zaman aşımı
- Mutlu Gözler (Happy Eyeballs)
- Ağ arayüzü
- Yerel port numarası
- Canlı tutma (Keep alive)
Kurulum
Kullanıcının bağlantıların nasıl kurulacağının farklı yönlerini kontrol etmesini sağlayan birkaç seçenek vardır.
VLAN
--vlan-priority komut satırı seçeneğiyle Ethernet başlığında ayarlanan 0 ile 7 arasında bir öncelik değeri belirlersiniz. Bu nedenle yalnızca yerel ağınızla sınırlıdır ve herhangi bir yönlendiricide (router) kullanılmayacaktır.
IEEE 802.1Q'da tanımlandığı gibi VLAN önceliği.
Örnek:
curl --vlan-priority 4 https://example.com
Hizmet Türü (Type of Service)
IPv4 protokol başlığında bir "Hizmet Türü (TOS)" alanı bulunur. IPv6'da buna "Trafik Sınıfı" denir. Bir kullanıcı --ip-tos seçeneğini kullanarak değeri sıfır ile 255 arasında sayısal bir değere veya tanınan adlardan birini kullanarak ayarlayabilir:
CS0, CS1, CS2, CS3, CS4, CS5, CS6, CS7, AF11, AF12, AF13,
AF21, AF22, AF23, AF31, AF32, AF33, AF41, AF42, AF43, EF,
VOICE-ADMIT, ECT1, ECT0, CE, LE, LOWCOST, LOWDELAY,
THROUGHPUT, RELIABILITY, MINCOST
Örnek:
curl --ip-tos CS5 https://example.com
Multipath TCP
Multipath TCP, sıradan TCP'nin kullandığı normal tek yola kıyasla, verimi en üst düzeye çıkarmak ve yedekliliği artırmak için bir TCP bağlantısının birden fazla eşzamanlı ağ yolunu kullanmasının bir yoludur.
--mptcp seçeneğiyle curl'den Multipath TCP kullanmasını isteyebilirsiniz. Yalnızca Linux'ta çalışır ve Linux 5.6 veya üstünü gerektirir. QUIC veya UDP bağlantıları üzerinde hiçbir etkisi yoktur.
curl'ün bağlandığı sunucunun da MPTCP'yi desteklemesi gerekir. Değilse, bağlantı sorunsuz bir şekilde "normal" TCP'ye geri döner.
Örnek:
curl --mptcp https://example.com
İsim çözümleme hileleri
curl, normalde bağlanacağı ana bilgisayardan başka bir ana bilgisayarı kullanmasını sağlamak için birçok yol sunar.
hosts dosyasını düzenleyin
Belki de curl http://example.com komutunun gerçek sunucu yerine yerel sunucunuza bağlanmasını istiyorsunuz.
Bunu normalde ve kolayca hosts dosyanızı (Linux ve Unix benzeri sistemlerde /etc/hosts) düzenleyerek ve örneğin ana bilgisayarı localhost'unuza yönlendirmek için 127.0.0.1 example.com ekleyerek yapabilirsiniz. Ancak bu düzenleme yönetici erişimi gerektirir ve aynı anda diğer tüm uygulamaları etkilemesi gibi bir dezavantajı vardır.
Host: başlığını değiştirin
Host: başlığı, bir HTTP istemcisinin HTTP sunucusuna hangi sunucuyla konuştuğunu söylemesinin normal yoludur, çünkü tipik olarak bir HTTP sunucusu aynı yazılım örneğini kullanarak birçok farklı isme hizmet eder.
Böylece, özel olarak değiştirilmiş bir Host: başlığı geçirerek, aslında o ana bilgisayar adına bağlanmadığınızda bile sunucunun sitenin içeriğiyle yanıt vermesini sağlayabilirsiniz.
Örneğin, ana siteniz www.example.com'un bir test örneğini yerel makinenizde çalıştırıyorsunuz ve curl'ün dizin html'ini istemesini istiyorsunuz:
curl -H "Host: www.example.com" http://localhost/
Özel bir Host: başlığı ayarlayıp çerezleri kullanırken, curl özel adı çıkarır ve çerezleri gönderirken eşleştirmek için bunu ana bilgisayar olarak kullanır.
Host: başlığı bir HTTPS sunucusuyla iletişim kurarken yeterli değildir. HTTPS ile TLS protokolünde SNI (Server Name Indication - Sunucu Adı Göstergesi) adı verilen ve istemcinin sunucuya konuşmak istediği sunucunun adını söylemesini sağlayan ayrı bir uzantı alanı vardır. curl yalnızca verilen URL'den gönderilecek SNI adını çıkarır.
Bir isim için özel bir IP adresi sağlayın
curl'ün nereye gitmesi gerektiğini isim çözümleyiciden daha mı iyi biliyorsunuz? O zaman curl'e kendiniz bir IP adresi verebilirsiniz. example.com için 80. port erişimini bunun yerine localhost'unuza ulaşacak şekilde yönlendirmek istiyorsanız:
curl --resolve example.com:80:127.0.0.1 http://example.com/
Hatta bu türden birden fazla yönlendirme sağlamak için birden fazla --resolve anahtarı belirtebilirsiniz; bu, çalıştığınız URL HTTP yönlendirmeleri kullanıyorsa veya komut satırınızın birden fazla URL ile çalışmasını istiyorsanız kullanışlı olabilir.
--resolve, adresi curl'ün DNS önbelleğine ekler, bu nedenle etkili bir şekilde curl'ü, adı çözümlediğinde aldığı adresin bu olduğuna inandırır.
HTTPS konuşurken, bu URL'deki ad için SNI gönderir ve curl, URL'deki ad için hizmet verdiğinden emin olmak üzere sunucunun yanıtını doğrular.
Seçenekte belirttiğiniz desenin bir ana bilgisayar adı ve buna karşılık gelen port numarası olması gerekir ve yalnızca URL'de tam olarak o çift kullanılırsa adres değiştirilir. Örneğin, bir HTTPS URL'sindeki bir ana bilgisayar adını varsayılan port numarasında değiştirmek istiyorsanız, curl'e bunun 443. port için olduğunu söylemeniz gerekir, şöyle:
curl --resolve example.com:443:192.168.0.1 https://example.com/
Bir yedek isim sağlayın
--resolve seçeneğinin yakın bir akrabası olarak, --connect-to seçeneği küçük bir varyasyon sağlar. Belirli bir isim ve port numarası bağlanmak için kullanıldığında curl'ün kaputun altında kullanması için bir yedek isim ve port numarası belirtmenize olanak tanır.
Örneğin, yük dengeleme amacıyla aslında üç farklı bireysel HTTP sunucusu (load1, load2 ve load3) tarafından sunulan www.example.com adında tek bir siteniz olduğunu varsayalım. Tipik bir normal prosedürde, curl ana siteyi çözer ve yük dengeli sunuculardan biriyle konuşur (geri bir liste alır ve sadece birini seçer) ve her şey yolundadır. Yük dengeli setten belirli bir sunucuya (load1.example.com örneğin) bir test isteği göndermek istiyorsanız, curl'e bunu yapması talimatını verebilirsiniz.
load1'in belirli IP adresini biliyorsanız bunu başarmak için hala --resolve kullanabilirsiniz. Önce IP adresini ayrı ayrı çözüp düzeltmek zorunda kalmadan, curl'e şunları söyleyebilirsiniz:
curl --connect-to www.example.com:80:load1.example.com:80 \
http://www.example.com
KAYNAK İSMİ + KAYNAK PORTU'ndan HEDEF İSMİ + HEDEF PORTU'na yönlendirir. curl daha sonra load1.example.com adını çözer ve bağlanır, ancak diğer tüm yönlerden hala www.example.com ile konuştuğunu varsayar.
c-ares ile isim çözümleme hileleri
Bu kitabın başka bir yerinde ayrıntılandırılması gerektiği gibi, curl birkaç farklı isim çözümleme arka ucuyla derlenebilir. Bu arka uçlardan biri c-ares kütüphanesi tarafından desteklenmektedir ve curl c-ares kullanacak şekilde derlendiğinde, diğer isim çözümleme arka uçlarını kullanacak şekilde derlenen curl'ün elde edemediği birkaç ekstra süper güç elde eder. Yani, hangi DNS sunucularının kullanılacağını ve bu DNS trafiğinin ağı nasıl kullandığını daha spesifik olarak talimat verme yeteneği kazanır.
--dns-servers ile, varsayılan yerine curl'ün tam olarak hangi DNS sunucusunu kullanması gerektiğini belirtebilirsiniz. Bu, farklı yanıt veren kendi deneysel sunucunuzu çalıştırmanıza veya normal sunucunuz güvenilmez veya ölü ise bir yedek kullanmanıza olanak tanır.
--dns-ipv4-addr ve --dns-ipv6-addr ile curl'den DNS iletişiminin yerel ucunu belirli bir IP adresine "bağlamasını" (bind) istersiniz ve --dns-interface ile curl'e DNS istekleri için kullanacağı belirli bir ağ arayüzünü kullanması talimatını verebilirsiniz.
Bu --dns-* seçenekleri gelişmiştir ve yalnızca ne yaptıklarını bilen ve bu seçeneklerin ne yaptığını anlayan kişiler içindir. Özelleştirilebilir DNS isim çözümleme işlemleri sunarlar.
Bağlantı zaman aşımı
curl tipik olarak ağ transferinin ilk bir parçası olarak ana bilgisayara bir TCP bağlantısı kurar. Titrek ağ koşulları veya hatalı uzak sunucular varsa, bu TCP bağlantısı başarısız olabilir veya yavaş olabilir.
Komut dosyalarınız veya diğer kullanımlarınız üzerindeki etkiyi azaltmak için, curl'ün bağlantı girişimi için izin verdiği maksimum süreyi saniye cinsinden ayarlayabilirsiniz. --connect-timeout ile curl'e bağlanmak için izin verilen maksimum süreyi söylersiniz ve curl bu sürede bağlanmamışsa bir hata döndürür.
Bağlantı zaman aşımı yalnızca curl'ün bağlandığı ana kadar harcamasına izin verilen süreyi sınırlar, bu nedenle TCP bağlantısı kurulduktan sonra daha uzun bir süre alabilir. Genel curl zaman aşımları hakkında daha fazla bilgi için Zaman aşımları (Timeouts) bölümüne bakın.
Düşük bir zaman aşımı belirtirseniz, curl'ün uzak sunuculara, yavaş sunuculara veya güvenilmez ağlar üzerinden eriştiğiniz sunuculara bağlanma yeteneğini etkili bir şekilde devre dışı bırakırsınız.
Bağlantı zaman aşımı, saniye altı hassasiyet için ondalık bir değer olarak belirtilebilir. Örneğin, bağlanmak için 2781 milisaniyeye izin vermek için:
curl --connect-timeout 2.781 https://example.com/
Mutlu Gözler (Happy Eyeballs)
curl belirli bir ana bilgisayara bağlanmak üzere olduğunda, denenecek adreslerin bir listesine sahiptir. Adres listesi iki listeye ayrılır: IPv4 adreslerini içeren bir liste ve IPv6 adreslerini içeren bir liste.
curl, IPv6 listesindeki ilk adrese bir bağlantı girişimi başlatarak başlar. Bağlantı girişimi başarısız olursa, bir tanesi çalışana kadar hepsini tek tek yineleyerek listedeki bir sonraki adrese geçer.
İki yüz milisaniye sonra curl hala IPv6'ya bağlanmaya çalışıyorsa, paralel olarak IPv4 üzerinden ikinci bir girişim serisi başlatır. Aynı tarzda, bağlantı hatalarında IPv4 adresleri listesi üzerinde yineler. İsterseniz bir bağlantı yarışı.
Çalışan ilk bağlantı kazanır ve diğer tüm girişimler atılır.
HTTP/3 yarışı
HTTP/3'ü denemesi istendiğinde (--http3 ile), curl bağlantı yarışı oyununu bir seviye yukarı taşır.
curl önce yukarıda açıklandığı gibi QUIC için Mutlu Gözler bağlantı girişimini başlatır. Önce IPv6 QUIC'i ve bir zaman aşımından sonra IPv4 QUIC'i dener. İlk iki yüz milisaniye içinde başarılı bir QUIC bağlantısı yoksa (veya zaman aşımı penceresinin yarısı içinde hiç UDP paketi alınmadıysa, varsayılan olarak yüz milisaniye), curl TCP için ikinci bir Mutlu Gözler senaryosu başlatır - önce IPv6 TCP ve zaman aşımından sonra IPv4 TCP.
Çalışan en fazla dört paralel girişimden başarılı olan ilk bağlantı girişimi kazanır. "Kaybedenler" daha sonra basitçe atılır.
İnce ayar (Tweak)
İki yüz milisaniye bağlantılarınızı istediğinizden daha uzun süre geciktirebilir. Örneğin, IPv6 üzerinden TCP paketleri belirli bir ağ yolunda veya sunucuda hiç yanıt almadığında.
Veya tam tersi, yüksek gecikmeli bir sunucuyla iletişim kurmanız gerekebilir, bu durumda varsayılan zaman aşımı çok erken devreye girebilir.
Bunun gibi anlar ve senaryolar için curl, --happy-eyeballs-timeout-ms komut satırı seçeneğini sunar. Varsayılan iki yüz milisaniyeyi belirttiğiniz herhangi bir şeye değiştirir. Sıfıra ayarlamak curl'ün bağlantı girişimlerini tam olarak aynı anda başlatmasını sağlar.
Ağ arayüzü
Birden fazla ağa bağlı birden fazla ağ arayüzüne sahip makinelerde, giden ağ trafiğinin hangi ağ arayüzünü kullanmasını tercih edeceğinize karar verebileceğiniz durumlar vardır. Veya iletişimde hangi kaynak IP adresini (sahip olduğunuz birden fazla adresten) kullanacağınızı.
curl'e iletişimin yerel ucunu hangi ağ arayüzüne, hangi IP adresine ve hatta hangi ana bilgisayar adına "bağlamak" istediğinizi --interface seçeneğiyle söyleyin:
curl --interface eth1 https://www.example.com/
curl --interface 192.168.0.2 https://www.example.com/
curl --interface machine2 https://www.example.com/
Burada bir ana bilgisayar adı kullanılmasını önermiyoruz, çünkü bu curl'ü bir IP adresini bulmak için bir isim çözümlemesi yapmaya zorlar. Bir arayüz adı belirtemiyorsanız, sabit bir IP adresi kullanmayı düşünün.
Buna ek olarak, curl'ün tahmin etmek zorunda kalmasını önlemek için açıkça bir IP adresi veya arayüz adı kullanılmasını isteyebilirsiniz. Bunu, arayüz adı için if! veya IP adresi için host! dizesini öne ekleyerek yapın. Şöyle:
curl --interface "host!192.168.0.2" https://www.example.com/
curl --interface "if!eth1" https://www.example.com/
Hatta ikisini de sağlayarak belirli bir IP ve belirli bir arayüz belirtebilirsiniz, şöyle:
curl --interface "if!eith1!192.168.0.2" https://www.example.com/
Yerel port numarası
Yerel uçta bir IP adresi ve port numarası ile uzak uçta bir IP adresi ve port numarası arasında bir TCP bağlantısı oluşturulur. Uzak port numarası URL'de belirtilebilir ve genellikle hangi hizmeti hedeflediğinizi belirlemenize yardımcı olur.
Yerel port numarası genellikle ağ yığını tarafından TCP bağlantınıza rastgele atanır ve normalde bu konuda çok fazla düşünmeniz gerekmez. Ancak, bazı durumlarda kendinizi giden bağlantıları kurmasına izin verilebilecek kaynak port numaralarına kısıtlamalar getiren ağ ekipmanı, güvenlik duvarları veya benzeri kurulumların arkasında bulursunuz.
Bunun gibi durumlar için, curl'ün bağlantıyı hangi yerel portlara bağlaması gerektiğini belirtebilirsiniz. Kullanılacak tek bir port numarası veya bir port aralığı belirtebilirsiniz. Portlar kıt kaynaklar olduğundan ve istediğiniz tam port zaten kullanımda olabileceğinden bir aralık kullanmanızı öneririz. curl'den sizin için alamayacağı bir yerel port numarası (veya aralığı) isterseniz, bir hatayla çıkar.
Ayrıca, çoğu işletim sisteminde daha yüksek bir ayrıcalık düzeyine (root) sahip olmadan 1024'ün altındaki port numaralarına bağlanamazsınız ve genel olarak kaçınabilirseniz curl'ü root olarak çalıştırmamanızı öneririz.
Bu HTTPS sayfasını alırken curl'den 4000 ile 4200 arasında bir yerel port numarası kullanmasını isteyin:
curl --local-port 4000-4200 https://example.com/
Canlı tutma (Keep alive)
TCP bağlantıları kullanılmadıklarında her iki yönde de tamamen trafiksiz olabilir. Bu nedenle tamamen boşta olan bir bağlantı, ağ veya sunucu sorunları nedeniyle tamamen bayatlamış bir bağlantıdan açıkça ayrılamaz.
Aynı zamanda, güvenlik duvarları veya NAT'lar gibi birçok ağ ekipmanı, adresleri çevirebilmek, "yanlış" gelen paketleri engelleyebilmek vb. için bugünlerde TCP bağlantılarını takip ediyor. Bu cihazlar genellikle tamamen boşta olan bağlantıları N dakika sonra ölü olarak sayar; burada N cihazdan cihaza değişir ancak bazen 10 dakika veya daha kısa bir süre kadar kısadır.
Gerçekten yavaş bir bağlantının (veya boşta olanın) ölü muamelesi görmesini ve yanlışlıkla sonlandırılmasını önlemeye yardımcı olmanın bir yolu, TCP canlı tutmanın (keep alive) kullanılmasını sağlamaktır. TCP keepalive, TCP protokolünde, aksi takdirde tamamen boşta olacakken ileri geri "ping çerçeveleri" göndermesini sağlayan bir özelliktir. Boşta olan bağlantıların üzerinden trafik akmadığında bile kopukluğu algılamasına yardımcı olur ve ara sistemlerin bağlantıyı ölü olarak görmemesine yardımcı olur.
curl, burada belirtilen nedenlerden dolayı varsayılan olarak TCP keepalive kullanır. keepalive'ı devre dışı bırakmak istediğiniz zamanlar olabilir veya TCP "pingleri" arasındaki aralığı değiştirmek isteyebilirsiniz (curl varsayılan olarak 60 saniyedir). keepalive'ı şununla kapatabilirsiniz:
curl --no-keepalive https://example.com/
veya aralığı 5 dakikaya (300 saniye) şununla değiştirebilirsiniz:
curl --keepalive-time 300 https://example.com/
curl 8.9.0'dan başlayarak, --keepalive-cnt ile curl'ün pes etmeden önce gönderdiği ancak yanıt alamadığı keepalive problarının sayısını ayarlayabilirsiniz. Şöyle:
curl --keepalive-cnt 3 https://example.com
Zaman aşımları (Timeouts)
Ağ işlemleri, işlerin yürümesi için bir dizi hizmete ve ağa bağlı olduğundan, doğaları gereği oldukça güvenilmez veya belki de kırılgan işlemlerdir. Bu hizmetlerin kullanılabilirliği gidip gelebilir ve performansları da zaman zaman büyük ölçüde değişebilir.
TCP'nin tasarımı bile ağın, transferdeki katılımcılar tarafından mutlaka fark edilmeden uzun bir süre tamamen kopmasına izin verir.
Bunun sonucu olarak bazen İnternet transferleri uzun zaman alır. Ayrıca, curl'deki çoğu işlemin varsayılan olarak zaman aşımı yoktur.
Harcamasına izin verilen maksimum süre
curl'e -m / --max-time ile, curl bir zaman aşımı hata koduyla (28) çıkmadan önce komut satırının harcamasına izin verdiğiniz maksimum süreyi saniye cinsinden söyleyin. Ayarlanan süre dolduğunda, curl o anda ne olursa olsun - veri aktarıyor olsa bile - çıkar. Bu gerçekten izin verilen maksimum süredir.
Verilen maksimum süre ondalık hassasiyetle belirtilebilir; 0.5 500 milisaniye ve 2.37 2370 milisaniye anlamına gelir.
Örnek:
curl --max-time 5.5 https://example.com/
(Yerel ayarınız sayısal kesirleri ifade etmek için noktadan başka bir sembol kullanabilir.)
Bağlanmak için asla bundan fazlasını harcama
--connect-timeout, curl'ün ana bilgisayara bağlanmaya çalışırken harcadığı süreyi sınırlar. Bağlantının tamamlandığı kabul edilmeden önce yapılan tüm gerekli adımların verilen zaman dilimi içinde tamamlanması gerekir. Verilen sürede bağlanılamaması, curl'ün bir zaman aşımı çıkış koduyla (28) çıkmasına neden olur.
Bir bağlantının başarılı kabul edilmesinden önce yapılan adımlar arasında DNS araması ve sonraki TCP, TLS veya QUIC el sıkışmaları bulunur.
Verilen maksimum bağlantı süresi ondalık hassasiyetle belirtilebilir; 0.5 500 milisaniye ve 2.37 2370 milisaniye anlamına gelir:
curl --connect-timeout 2.37 https://example.com/
.netrc
Unix sistemleri uzun zamandır kullanıcıların uzak FTP sunucuları için kullanıcı adlarını ve şifrelerini saklamaları için bir yol sunmuştur. ftp istemcileri bunu on yıllardır desteklemiş ve bu sayede kullanıcıların her seferinde kimlik bilgilerini manuel olarak yeniden girmek zorunda kalmadan bilinen sunuculara hızlı bir şekilde giriş yapmalarına izin vermiştir. .netrc dosyası tipik olarak bir kullanıcının ev dizininde saklanır. (Windows'ta, ev dizininde iki dosya adı kontrol edilir: .netrc ve _netrc, ilki tercih edilir. Windows'taki eski sürümler yalnızca _netrc'yi kontrol ediyordu.)
Bu yaygın ve iyi kullanılan bir kavram olduğundan, curl de bunu destekler—eğer isterseniz. Ancak curl bu özelliği FTP ile sınırlamaz, bununla herhangi bir protokol için makineler için kimlik bilgileri alabilir. Nasıl yapılacağı hakkında daha fazla bilgi için aşağıya bakın.
.netrc dosya formatı
.netrc dosya formatı basittir: bir makine adıyla satırlar belirtir ve ardından o makineyle ilişkili giriş ve şifreyi takip edersiniz.
Her alan, bir boşluk veya yeni satırla biten bir harf dizisi olarak sağlanır. 7.84.0 sürümünden bu yana, curl tırnak içine alınmış dizeleri de destekler. Çift tırnakla (") başlar ve biterler ve kaçış karakterli özel harfleri \", (yeni satır), (satır başı) ve (TAB) desteklerler. Tırnak içine alınmış dizeler, bir kullanıcı adı veya şifrede boşluk karakterinin kullanılabilmesinin tek yoludur.
machine name (makine adı)
Uzak bir makine adını tanımlar. curl, URL'de belirtilen uzak makineyle eşleşen bir makine belirteci için .netrc dosyasını arar. Bir eşleşme yapıldığında, sonraki .netrc belirteçleri işlenir, dosyanın sonuna ulaşıldığında veya başka bir makineyle karşılaşıldığında durulur.
default (varsayılan)
Bu, default'un herhangi bir adla eşleşmesi dışında makine adıyla aynıdır. Yalnızca bir varsayılan belirteç olabilir ve tüm makine belirteçlerinden sonra olmalıdır. Başka türlü eşleşmeyen ana bilgisayarlar için varsayılan bir anonim giriş sağlamak üzere, sona şuna benzer bir satır ekleyin:
default login anonymous password user@domain
login name (giriş adı)
Uzak makine için kullanıcı adı dizesi. Adda boşluk kullanamazsınız.
password string (şifre dizesi)
Bir şifre sağlayın. Bu belirteç mevcutsa ve uzak sunucu oturum açma işleminin bir parçası olarak bir şifre gerektiriyorsa, curl belirtilen dizeyi sağlar. Bu belirteç .netrc dosyasında mevcutsa, dosyanın kullanıcı dışında kimse tarafından okunamadığından gerçekten emin olmalısınız. Şifreyi girerken boşluk kullanamazsınız.
macdef name
Bir makro tanımlayın. Bu curl tarafından desteklenmez. .netrc'nin geri kalanının hala iyi çalışması için, curl bulduğu macdef ile yapılan her tanımı düzgün bir şekilde atlar.
'example.com' ana bilgisayarı için 'daniel' adında bir kullanıcı ve 'qwerty' şifresini kullanan örnek bir .netrc şöyle görünür:
machine example.com
login daniel
password qwerty
Aynı işlevsellikle tek bir satıra da yazılabilir:
machine example.com login daniel password qwerty
Kullanıcı adı eşleştirme
Bir URL bir kullanıcı adıyla sağlandığında ve .netrc kullanıldığında, curl o makine ve giriş kombinasyonu için eşleşen şifreyi bulmaya çalışır.
netrc'yi etkinleştir
-n, --netrc curl'e .netrc dosyasını aramasını ve kullanmasını söyler.
--netrc-file [dosya], --netrc'ye benzer, ancak kullanılacak gerçek dosyanın yolunu da sağlarsınız. Bilgileri başka bir dizinde veya başka bir dosya adıyla sağlamak istediğinizde bu kullanışlıdır.
--netrc-optional, --netrc'ye benzer, ancak bu seçenek .netrc kullanımını isteğe bağlı hale getirir ve --netrc seçeneği gibi zorunlu kılmaz.
Vekil Sunucular (Proxies)
Bir vekil sunucu (proxy), siz istemci adına bir şeyler yapan bir makine veya yazılımdır.
Bunu ayrıca sizinle ve çalışmak istediğiniz sunucu arasında duran bir aracı, gerçek uzak sunucu yerine bağlandığınız bir aracı olarak da görebilirsiniz. Vekil sunucudan istediğiniz işlemi sizin için gerçekleştirmesini istersiniz ve sonra o gidip bunu yapar ve sonra verileri size geri döndürür.
Birkaç farklı vekil sunucu türü vardır ve bunları aşağıdaki alt bölümlerde listeleyip tartışacağız.
- Vekil sunucunuzu keşfedin
- PAC
- Esir portallar (Captive portals)
- Vekil sunucu türü
- HTTP vekil sunucusu
- SOCKS vekil sunucusu
- MITM vekil sunucusu
- Kimlik doğrulama
- HTTPS vekil sunucusu
- Vekil sunucu ortam değişkenleri
- Vekil sunucu başlıkları
- haproxy
Vekil sunucunuzu keşfedin
Bazı ağlar, İnternete veya belki ilgilendiğiniz o özel ağa ulaşmanız için bir vekil sunucu gerektirecek şekilde ayarlanmıştır. Vekil sunucuların kullanımı, ağınızı çalıştıran kişiler ve yönetim tarafından politika veya teknik nedenlerle ağınıza dahil edilir.
Ağ alanında vekil sunucuların otomatik tespiti ve onlara nasıl bağlanılacağı konusunda birkaç yöntem vardır, ancak bu yöntemlerin hiçbiri gerçekten evrensel değildir ve curl bunların hiçbirini desteklemez. Ayrıca, dış dünyayla bir vekil sunucu aracılığıyla iletişim kurduğunuzda, bu genellikle vekil sunucuya çok fazla güvenmeniz gerektiği anlamına gelir çünkü gönderdiğiniz veya onun üzerinden aldığınız tüm güvenli olmayan ağ trafiğini görebilir ve değiştirebilir. Bu güveni otomatik olarak varsaymak kolay değildir.
Tarayıcınızın ağ ayarlarını, bazen gelişmiş ayarlar sekmesi altında kontrol ederseniz, tarayıcınızın hangi vekil sunucuyu veya sunucuları kullanacak şekilde yapılandırıldığını öğrenebilirsiniz. curl kullandığınızda aynı olanı veya olanları kullanmanız gerekme ihtimali büyüktür.
Örnek olarak, Firefox tarayıcısı için vekil sunucu ayarlarını Tercihler => Genel => Ağ Ayarları altında aşağıda gösterildiği gibi bulabilirsiniz:

PAC
Bazı ağ ortamları farklı durumlarda kullanılması gereken birkaç farklı vekil sunucu sağlar ve bunu işlemenin özelleştirilebilir bir yolu tarayıcılar tarafından desteklenir. Buna "vekil sunucu otomatik yapılandırması" veya PAC (proxy auto-config) denir.
Bir PAC dosyası, belirli bir ağ bağlantısının (URL) hangi vekil sunucuyu kullanması gerektiğine ve hatta hiç vekil sunucu kullanmaması gerekip gerekmediğine karar veren bir JavaScript işlevi içerir. Tarayıcılar PAC dosyasını genellikle yerel ağdaki bir URL'den okur.
curl'ün JavaScript yetenekleri olmadığından, curl PAC dosyalarını desteklemez. Tarayıcınız ve ağınız PAC dosyaları kullanıyorsa, ilerlemenin en kolay yolu genellikle PAC dosyasını manuel olarak okumak ve curl'ü başarıyla çalıştırmak için belirtmeniz gereken vekil sunucuyu bulmaktır.
Esir portallar (Captive portals)
Bunlar vekil sunucular değildir ancak sizinle erişmek istediğiniz sunucu arasındaki yolu tıkarlar.
Bir esir portal, otellerde, havaalanlarında ve daha geniş bir kitleye diğer ağ erişim türleri için kullanılması popüler olan bu sistemlerden biridir. Portal tüm ağ trafiğini yakalar ve siz ya Tamam'a tıklayıp koşullarını okuduğunuzu doğrulayana kadar ya da ağı kullanma hakkı için bol miktarda para ödediğinizden emin olana kadar sizi bir giriş web sayfasına yönlendirir.
curl'ün trafiği de elbette bu tür portallar tarafından yakalanır ve genellikle en iyi yol, koşulları kabul etmek ve portaldan kurtulmak için bir tarayıcı kullanmaktır çünkü o andan itibaren genellikle o aynı makineden (MAC adresi) kaynaklanan diğer tüm trafiğe bir süreliğine izin verirler.
Formu nasıl göndereceğinizi ve içine hangi alanları ekleyeceğinizi çözerseniz, bu onayı göndermek için çoğu zaman curl'ü de kullanabilirsiniz. Bu, birçok kez yaptığınız bir şeyse, keşfetmeye değer olabilir.
Vekil sunucu türü
curl birkaç farklı vekil sunucu türünü destekler.
Varsayılan vekil sunucu türü HTTP'dir, bu nedenle bir şema parçası (genellikle http:// olarak yazılan parça) olmadan bir vekil sunucu ana bilgisayar adı (veya IP adresi) belirtirseniz, curl bunun bir HTTP vekil sunucusu olduğunu varsayarak devam eder.
curl, şema öneki kullanmak yerine vekil sunucu türünü ayarlamak için bir dizi seçenek sunar. SOCKS bölümüne bakın.
HTTP vekil sunucusu
HTTP vekil sunucusu, istemcinin transferi gerçekleştirmek için HTTP konuştuğu bir vekil sunucudur. curl varsayılan olarak -x veya --proxy ile işaret ettiğiniz bir ana bilgisayarın bir HTTP vekil sunucusu olduğunu varsayar ve ayrıca bir port numarası belirtmezseniz varsayılan olarak 1080 numaralı portu kullanır (ve bu belirli port numarasının nedeni tamamen tarihseldir).
192.168.0.1 port 8080 üzerindeki bir vekil sunucuyu kullanarak example.com web sayfasını istemek isterseniz, komut satırı şöyle görünebilir:
curl -x 192.168.0.1:8080 http://example.com/
Vekil sunucunun isteğinizi aldığını, gerçek sunucuya ilettiğini, ardından sunucudan gelen yanıtı okuduğunu ve ardından bunu istemciye geri verdiğini hatırlayın.
Bir vekil sunucuyla konuşurken -v ile ayrıntılı modu etkinleştirirseniz, curl'ün uzak sunucu yerine vekil sunucuya bağlandığını gösterir ve biraz farklı bir istek satırı kullandığını görebilirsiniz.
HTTP vekil sunucusu ile HTTPS
HTTPS, istemciden sunucuya (ve geriye) güvenli ve emniyetli uçtan uca gizlilik sağlamak için tasarlanmıştır. Bir HTTP vekil sunucusuyla konuşurken bunu sağlamak için, HTTP protokolünün curl'ün vekil sunucu üzerinden bir tünel kurmak için kullandığı ve ardından şifreleyip doğrulayabileceği özel bir isteği vardır. Bu HTTP yöntemi CONNECT olarak bilinir.
Bir CONNECT yöntemi kurduktan sonra vekil sunucu şifreli verileri uzak sunucuya tünellediğinde, vekil sunucu şifrelemeyi kırmadan trafiği göremez veya değiştiremez:
curl -x proxy.example.com:80 https://example.com/
HTTP vekil sunucusu üzerinden HTTP olmayan protokoller
Bir HTTP vekil sunucusu, vekil sunucunun kendisinin HTTP konuştuğu anlamına gelir. HTTP vekil sunucuları öncelikle HTTP'ye vekillik etmek için kullanılır ancak diğer protokolleri de desteklemeleri oldukça yaygındır. Özellikle FTP oldukça yaygın olarak desteklenir.
Bir HTTP vekil sunucusu üzerinden FTP konuşurken, bu genellikle diğer protokolün HTTP gibi çalıştığını taklit ederek ve URL HTTP kullanmasa bile vekil sunucudan bu URL'yi almasını isteyerek yapılır. Bu ayrım önemlidir çünkü bu şekilde bir HTTP vekil sunucusu üzerinden gönderildiğinde, curl bir FTP URL'si verilmesine rağmen gerçekten FTP konuşmaz; bu nedenle FTP'ye özgü özellikler çalışmaz:
curl -x http://proxy.example.com:80 ftp://ftp.example.com/file.txt
Bunun yerine yapabileceğiniz şey, HTTP vekil sunucusu üzerinden tünel açmaktır.
HTTP vekil sunucusu tünelleme
Çoğu HTTP vekil sunucusu, istemcilerin diğer taraftaki bir sunucuya tünel açmasına izin verir. HTTP vekil sunucusu üzerinden HTTPS'yi her kullandığınızda yapılan tam olarak budur.
curl ile -p veya --proxytunnel kullanarak bir HTTP vekil sunucusu üzerinden tünel açarsınız.
Bir vekil sunucu üzerinden HTTPS yaptığınızda normalde varsayılan HTTPS uzak TCP port numarası 443'e bağlanırsınız. Çoğu HTTP vekil sunucusu beyaz listeye alır ve yalnızca o port numarasındaki ana bilgisayarlara ve belki birkaç başkasına bağlantılara izin verir. Çoğu vekil sunucu, istemcilerin rastgele herhangi bir porta bağlanmasını reddeder (yalnızca vekil sunucu yöneticilerinin bildiği nedenlerle).
Yine de, HTTP vekil sunucusunun buna izin verdiğini varsayarsak, herhangi bir port numarasındaki uzak bir sunucuya tünel açmasını isteyebilirsiniz, böylece tünel açarken bile diğer protokolleri normal şekilde yapabilirsiniz. Şöyle FTP tünellemesi yapabilirsiniz:
curl -p -x http://proxy.example.com:80 ftp://ftp.example.com/file.txt
curl'e, -x yerine --proxy1.0 [vekil sunucu] kullanarak HTTP vekil sunucusuna verdiği CONNECT isteğinde HTTP/1.0 kullanmasını söyleyebilirsiniz.
SOCKS vekil sunucusu
SOCKS vekil sunucular için kullanılan bir protokoldür ve curl bunu destekler. curl hem SOCKS sürüm 4'ü hem de sürüm 5'i destekler ve her iki sürüm de iki çeşitte gelir.
Verilen vekil sunucu ana bilgisayarı için -x ile doğru şema parçasını kullanarak veya -x yerine ayrı bir seçenekle belirterek kullanılacak belirli SOCKS sürümünü seçebilirsiniz.
SOCKS4, sürüm 4 içindir ancak curl adı çözer:
curl -x socks4://proxy.example.com http://www.example.com/
curl --socks4 proxy.example.com http://www.example.com/
SOCKS4a, çözümlemenin vekil sunucu tarafından yapıldığı sürüm 4 içindir:
curl -x socks4a://proxy.example.com http://www.example.com/
curl --socks4a proxy.example.com http://www.example.com/
SOCKS5, sürüm 5 içindir ve SOCKS5-hostname, ana bilgisayar adını yerel olarak çözmeden sürüm 5 içindir:
curl -x socks5://proxy.example.com http://www.example.com/
curl --socks5 proxy.example.com http://www.example.com/
SOCKS5-hostname sürümleri. Bu, ana bilgisayar adını vekil sunucuya gönderir, böylece curl tarafından yerel olarak yapılan bir isim çözümlemesi yoktur:
curl -x socks5h://proxy.example.com http://www.example.com/
curl --socks5-hostname proxy.example.com http://www.example.com/
Hangi socks sürümü için ismin hangi taraf tarafından çözüldüğünü anlamak için yararlı tablo:
| SOCKS | ismi kim çözer | IPv6 ile çalışır mı |
|---|---|---|
| 4 | curl | hayır |
| 4a | vekil sunucu | hayır |
| 5 | curl | evet |
| 5h | vekil sunucu | evet |
MITM vekil sunucusu
MITM, Ortadaki Adam (Man-In-The-Middle) anlamına gelir. MITM vekil sunucuları genellikle ağ sahiplerinin TLS şifreli trafiği bile inceleme arzusuna sahip olduğu şirketlerdeki "kurumsal ortamlarda" ve başka yerlerde konuşlandırılır.
Bunu yapmak için, kullanıcıların istemciye özel bir "güven kökü" (Sertifika Yetkilisi (CA) sertifikası) yüklemesini gerektirirler ve ardından vekil sunucu istemciden gelen tüm TLS trafiğini sonlandırır, uzak sunucuyu taklit eder ve bir vekil sunucu gibi davranır. Vekil sunucu daha sonra özel CA tarafından imzalanmış oluşturulmuş bir sertifikayı geri gönderir. Bu tür vekil sunucu kurulumları genellikle istemcilerden uzak bir makinedeki TCP port 443'e giden tüm trafiği şeffaf bir şekilde yakalar. Böyle bir ağda curl çalıştırmak HTTPS trafiğinin de yakalanmasına neden olur.
Bu uygulama elbette ortadaki adamın tüm TLS trafiğinin şifresini çözmesine ve gözetlemesine izin verir.
Vekil sunucu kimlik doğrulaması
HTTP ve SOCKS vekil sunucuları kimlik doğrulaması gerektirebilir, bu nedenle curl'ün kullanılmasına izin verilmesi için vekil sunucuya uygun kimlik bilgilerini sağlaması gerekir. Bunu yapmamak (veya yanlış kimlik bilgilerini sağlamak), vekil sunucunun 407 kodunu kullanarak HTTP yanıtları döndürmesine neden olur.
Vekil sunucular için kimlik doğrulama, "normal" HTTP kimlik doğrulamasına benzer. İstemcilerin hem normal ana bilgisayar kimlik doğrulamasını hem de vekil sunucu kimlik doğrulamasını bağımsız olarak kullanmalarına izin vermek için sunucu kimlik doğrulamasından ayrıdır.
curl ile, -U user:password veya --proxy-user user:password seçeneğiyle vekil sunucu kimlik doğrulaması için kullanıcı adı ve şifreyi ayarlarsınız:
curl -U daniel:secr3t -x myproxy:80 http://example.com
Bu örnek varsayılan olarak Basic kimlik doğrulama şemasını kullanır. Bazı vekil sunucular diğer kimlik doğrulama şemalarını gerektirir (ve 407 yanıtı aldığınızda döndürülen başlıklar hangisi olduğunu söyler) ve ardından --proxy-digest, --proxy-negotiate, --proxy-ntlm ile belirli bir yöntem isteyebilirsiniz. Yukarıdaki örnek komut tekrar, ancak vekil sunucu ile NTLM yetkilendirmesi isteyerek:
curl -U daniel:secr3t -x myproxy:80 http://example.com --proxy-ntlm
Ayrıca, curl'den vekil sunucunun hangi yöntemi istediğini ve desteklediğini bulmasını ve ardından (ekstra gidiş-dönüş masrafıyla) --proxy-anyauth kullanarak onunla gitmesini isteyen bir seçenek de vardır. curl'den vekil sunucunun istediği herhangi bir yöntemi kullanmasını istemek şöyledir:
curl -U daniel:secr3t -x myproxy:80 http://example.com --proxy-anyauth
HTTPS vekil sunucusu
Vekil sunucuyla konuşmak için bahsedilen diğer tüm protokoller açık metin protokolleridir, HTTP ve SOCKS sürümleri. Bu yöntemleri kullanmak, birinin sizin veya vekil sunucunun bulunduğu yerel ağdaki trafiğinize kulak misafiri olmasına izin verebilir. Çünkü curl ile vekil sunucu arasındaki bağlantı üzerinden veriler açık olarak gönderilir.
Bunun bir çözümü, vekil sunucuyla HTTPS konuşan bir HTTPS vekil sunucusu kullanmaktır; bu daha sonra kolay gözetimden güvenli, güvenli ve şifreli bir bağlantı kurar.
Bir HTTPS vekil sunucusu belirtildiğinde, o ana bilgisayarda kullanılan varsayılan port 443'tür.
Diğer birçok yönden HTTPS vekil sunucuları HTTP vekil sunucuları gibi çalışır.
HTTP/2
curl bir HTTPS vekil sunucusuyla konuştuğunda, curl'den vekil sunucuyla HTTP/2 kullanmayı denemesini istemek için --proxy-http2 kullanma seçeneğiniz vardır.
Varsayılan olarak, curl HTTPS vekil sunucularıyla HTTP/1.1 konuşur, ancak bu seçenek kullanılırsa curl bunun yerine HTTP/2'yi görüşmeye ve kullanmaya çalışır.
Vekil sunucu ortam değişkenleri
curl, bir vekil sunucunun kullanılması istenip istenmediğini görmek için çalışmadan önce özel olarak adlandırılmış ortam değişkenlerinin varlığını kontrol eder.
Vekil sunucu ana bilgisayar adını tutmak için [scheme]_proxy adlı bir değişken ayarlayarak vekil sunucuyu belirtirsiniz (ana bilgisayarı -x ile belirttiğiniz şekilde). Bir HTTP sunucusuna erişirken curl'e bir vekil sunucu kullanmasını söylemek istiyorsanız http_proxy ortam değişkenini ayarlarsınız. Şöyle:
http_proxy=http://proxy.example.com:80
curl -v www.example.com
Yukarıdaki örnek HTTP'yi gösterse de, elbette ftp_proxy, https_proxy vb. de ayarlayabilirsiniz. http_proxy dışındaki tüm bu vekil sunucu ortam değişkeni adları, HTTPS_PROXY gibi büyük harflerle de belirtilebilir.
Tüm protokolleri kontrol eden tek bir değişken ayarlamak için ALL_PROXY mevcuttur. Belirli bir protokol değişkeni varsa, o önceliklidir.
Vekil sunucu yok (No proxy)
Bazen normalde kullanılacak vekil sunucudan geçmekten hariç tutulması gereken bir veya birkaç ana bilgisayar adının olduğu bir duruma düşersiniz. Bu daha sonra NO_PROXY değişkeni ile yapılır. Bunu, erişilirken bir vekil sunucu kullanmaması gereken ana bilgisayar adlarının virgülle ayrılmış bir listesine ayarlayın. NO_PROXY'yi tüm ana bilgisayarlarla eşleşecek şekilde tek bir yıldız ('*') olarak ayarlayabilirsiniz.
Hariç tutma listesindeki bir ad bir nokta (.) ile başlıyorsa, ad o tüm etki alanıyla eşleşir. Örneğin .example.com hem www.example.com hem de home.example.com ile eşleşir ancak nonexample.com ile eşleşmez.
NO_PROXY değişkenine bir alternatif olarak, aynı amaca hizmet eden ve aynı şekilde çalışan bir --noproxy komut satırı seçeneği de vardır.
curl 7.86.0'dan bu yana, bir kullanıcı CIDR gösterimini kullanarak bir IP ağını hariç tutabilir: eşleşecek ağın bit boyutunu belirtmek için bir IP adresine bir eğik çizgi ve bit sayısı ekleyin. Örneğin, 192.168.0.0/16 desenini sağlayarak 192.168 ile başlayan tüm 16 bitlik ağla eşleştirin.
http_proxy sadece küçük harfle
Vekil sunucu ortam değişkenlerinin HTTP sürümü diğerlerinden farklı muamele görür. Kullanıcıların bir HTTP sunucusu tarafından çağrıldığında bir sunucuda komut dosyaları çalıştırmasına izin veren CGI protokolü nedeniyle yalnızca küçük harfli sürümünde kabul edilir. Bir CGI betiği bir sunucu tarafından çağrıldığında, istekteki gelen başlıklara dayalı olarak betik için otomatik olarak ortam değişkenleri oluşturur. Bu ortam değişkenleri büyük harf HTTP_ ile öne eklenir.
Bu nedenle Proxy: yada gibi bir istek başlığı kullanan bir HTTP sunucusuna gelen bir istek, CGI betiği başlatılmadan önce yada içerecek şekilde ayarlanmış HTTP_PROXY ortam değişkenini oluşturur. Böyle bir CGI betiği curl çalıştırırsa, curl'ün bunu kullanılacak bir vekil sunucu olarak görmemesi önemlidir.
Bu ortam değişkeninin büyük harfli sürümünü kabul etmek, zaman içinde birçok yazılımda birçok güvenlik sorununun kaynağı olmuştur.
Vekil sunucu başlıkları
Uzak sunucu için değil, özellikle bir HTTP veya HTTPS vekil sunucusu için tasarlanmış HTTP başlıkları eklemek istediğinizde, --header seçeneği yetersiz kalır.
Örneğin, bir HTTP vekil sunucusu üzerinden bir HTTPS isteği gönderirseniz, bu önce vekil sunucuya uzak sunucuya bir tünel kuran bir CONNECT göndererek ve ardından isteği o sunucuya göndererek yapılır. Bu ilk CONNECT yalnızca vekil sunucuya verilir ve yalnızca onun özel başlığınızı aldığından emin olmak ve uzak sunucuya başka bir dizi özel başlık göndermek isteyebilirsiniz.
Yalnızca vekil sunucuya belirli bir farklı User-Agent: ayarlayın:
curl --proxy-header "User-Agent: magic/3000" -x proxy https://example.com/
haproxy
haproxy protokolü, adında hala proxy (vekil sunucu) olsa da, diğer vekil sunucu seçeneklerinden farklıdır ve vekil sunucularla diğer vekil sunucu seçeneklerinin çalıştığı şekilde çalışmaz.
Bu, trafiğin ona nasıl ulaştığına bakılmaksızın bir istemcinin IP adresini sunucuya iletmesinin bir yoludur: tüneller, TCP vekil sunucuları, yük dengeleyiciler, şeffaf vekil sunucular ve ne varsa. Trafik sunucuya ulaştığında hangi kaynak IP adresinin kullanıldığını bir şekilde değiştiren hizmetler, sunucunun istemcinin IP adresini kendi başına bulmasını imkansız hale getirir.
haproxy protokolü basittir. Sunucu tarafından desteklenmesi gerekir, yani bir kullanıcı isteksiz veya işbirliği yapmayan bir sunucuyla bunu kullanmaya karar veremez. Desteklerse, curl'e kendi IP adresini sunucuya iletmek için bunu kullanmasını söyleyebilirsiniz.
curl ve haproxy
curl yalnızca haproxy protokolü v1'i destekler.
Şu anda kullanılmakta olan bağlantının gerçek IP adresini iletmek için, şu şekilde boolean bayrağını eklemeniz yeterlidir:
curl --haproxy-protocol https://example.com/
Böyle bir komut satırı bir nedenden dolayı iletmesi gerektiğini düşündüğünüz IP adresini sağlamıyorsa, bir IPv4 veya bir IPv6 sayısal adresi kullanarak tam adresi kendiniz belirtebilirsiniz:
curl --haproxy-clientip 10.0.0.1 https://example.com/
curl --haproxy-clientip fe80::fea3:8a22 https://example.com/
TLS
TLS, Transport Layer Security (Aktarım Katmanı Güvenliği) anlamına gelir ve eskiden SSL olarak adlandırılan teknolojinin adıdır. SSL terimi gerçekten ölmemiştir, bu nedenle bugünlerde hem TLS hem de SSL terimleri genellikle aynı şeyi tanımlamak için birbirlerinin yerine kullanılır.
TLS, TCP'nin "üzerinde" yer alan ve güçlü açık anahtar kriptografisine ve dijital imzalara dayanarak verileri kurcalamaya karşı korumalı hale getiren ve sunucu orijinalliğini garanti eden kriptografik bir güvenlik katmanıdır.
- Şifreler (Ciphers)
- TLS'yi etkinleştirme
- TLS sürümleri
- Sunucu sertifikalarını doğrulama
- Sertifika sabitleme (Certificate pinning)
- OCSP zımbalama (OCSP stapling)
- İstemci sertifikaları
- TLS kimlik doğrulaması
- TLS arka uçları
- SSLKEYLOGFILE
Şifreler (Ciphers)
curl bir TLS sunucusuna bağlandığında, protokolü nasıl konuşacağını müzakere eder ve bu müzakere her iki tarafın da üzerinde anlaşması gereken birkaç parametre ve değişken içerir. Parametrelerden biri, şifre (cipher) olarak adlandırılan hangi kriptografi algoritmalarının kullanılacağıdır. Zamanla, güvenlik araştırmacıları mevcut şifrelerdeki kusurları ve zayıflıkları bulurlar ve bunlar zamanla aşamalı olarak kaldırılır.
Ayrıntılı (verbose) seçeneğini, -v kullanarak, hangi şifrenin ve TLS sürümünün müzakere edildiği hakkında bilgi alabilirsiniz. --ciphers seçeneğini kullanarak müzakerede hangi şifrenin tercih edileceğini değiştirebilirsiniz, ancak unutmayın, bu, işleri daha da kötüleştirmeyen şekillerde nasıl kullanılacağını bilmeyi gerektiren güçlü bir özelliktir.
TLS'yi etkinleştirme
curl birçok protokolün TLS sürümünü destekler. HTTP'nin HTTPS'i, FTP'nin FTPS'i, LDAP'ın LDAPS'ı, POP3'ün POP3S'i, IMAP'in IMAPS'i ve SMTP'nin SMTPS'i vardır.
Sunucu tarafı destekliyorsa, bu protokollerin TLS sürümünü curl ile kullanabilirsiniz.
Protokollerle TLS yapmak için iki genel yaklaşım vardır. Bunlardan biri daha ilk bağlantı el sıkışmasından itibaren TLS konuşmak, diğeri ise protokole özel talimatlar kullanarak bağlantıyı düz metinden TLS'ye yükseltmektir.
curl ile, URL'de protokolün TLS sürümünü (adı 'S' karakteriyle biten) açıkça belirtirseniz, curl baştan TLS ile bağlanmaya çalışır; URL'de TLS olmayan sürümü belirtirseniz, bağlantıyı genellikle --ssl seçeneğiyle TLS tabanlıya yükseltebilirsiniz.
Destek tablosu şöyledir:
| Açık | TLS sürümü | --ssl |
|---|---|---|
| HTTP | HTTPS | hayır |
| LDAP | LDAPS | hayır |
| FTP | FTPS | evet |
| POP3 | POP3S | evet |
| IMAP | IMAPS | evet |
| SMTP | SMTPS | evet |
--ssl yapabilen protokollerin hepsi bu yöntemi tercih eder. --ssl kullanmak, curl'ün bağlantıyı TLS'ye yükseltmeye çalıştığı, ancak bu başarısız olursa yine de protokolün düz metin sürümünü kullanarak transfere devam ettiği anlamına gelir. --ssl seçeneğinin devam etmek için TLS'yi gerektirmesini sağlamak için, bunun yerine curl TLS'yi başarılı bir şekilde müzakere edemezse transferin başarısız olmasını sağlayan --ssl-reqd seçeneği vardır.
FTP transferiniz için TLS güvenliğini gerektirin:
curl --ssl-reqd ftp://ftp.example.com/file.txt
FTP transferiniz için TLS kullanılmasını önerin:
curl --ssl ftp://ftp.example.com/file.txt
Doğrudan TLS ile bağlanmak (HTTPS://, LDAPS://, FTPS:// vb. ile), TLS'nin zorunlu olduğu ve TLS müzakere edilmezse curl'ün bir hata döndürdüğü anlamına gelir.
HTTPS üzerinden bir dosya alın:
curl https://www.example.com/
TLS sürümleri
SSL 90'ların ortasında icat edildi ve o zamandan beri gelişti. SSL sürüm 2 İnternet'te kullanılan ilk yaygın sürümdü ancak uzun zaman önce güvenli olmadığı kabul edildi. Oradan SSL sürüm 3 devraldı ve o da kullanım için yeterince güvenli görülmedi.
TLS sürüm 1.0 ilk standarttı. RFC 2246, 1999'da yayınlandı. TLS 1.1, güvenliği daha da iyileştirerek 2006'da çıktı, ardından 2008'de TLS 1.2 geldi. TLS 1.2, on yıl boyunca TLS için altın standart haline geldi.
TLS 1.3 (RFC 8446), Ağustos 2018'de IETF tarafından bir standart olarak kesinleştirildi ve yayınlandı. Bu, bugüne kadarki en güvenli ve en hızlı TLS sürümüdür. Ancak o kadar yenidir ki birçok yazılım, araç ve kütüphane henüz desteklememektedir.
curl varsayılan olarak SSL/TLS'nin güvenli bir sürümünü kullanacak şekilde tasarlanmıştır. Bu, özellikle söylenmedikçe SSLv2 veya SSLv3'ü müzakere etmediği anlamına gelir ve aslında çeşitli TLS kütüphaneleri artık bu protokoller için destek sağlamadığından birçok durumda curl ciddi bir çaba sarf etmezseniz bu protokol sürümlerini konuşamaz bile.
| Seçenek | Kullanım |
|---|---|
| --sslv2 | SSL sürüm 2 |
| --sslv3 | SSL sürüm 3 |
| --tlsv1 | TLS >= sürüm 1.0 |
| --tlsv1.0 | TLS >= sürüm 1.0 |
| --tlsv1.1 | TLS >= sürüm 1.1 |
| --tlsv1.2 | TLS >= sürüm 1.2 |
| --tlsv1.3 | TLS >= sürüm 1.3 |
Sunucu sertifikalarını doğrulama
Bir sunucuyla güvenli bir bağlantıya sahip olmak, doğru ana bilgisayarla iletişim kurduğunuzdan da emin olamıyorsanız pek bir şey ifade etmez. Bunu bilmiyorsak, sadece sandığımız kişi gibi görünen bir sahtekarla da konuşuyor olabiliriz.
Doğru TLS sunucusuyla iletişim kurduğunu kontrol etmek için curl, sunucunun sertifikasının imzasını doğrulamak üzere bir CA deposu - bir sertifika seti - kullanır. Tüm sunucular, TLS el sıkışmasının bir parçası olarak istemciye bir sertifika sağlar ve tüm genel TLS kullanan sunucular bu sertifikayı yerleşik bir Sertifika Yetkilisinden edinmiştir.
Uygulanan bazı kripto büyülerinden sonra curl, sunucunun aslında curl'ün ona bağlanmak için kullandığı ana bilgisayar adı için o sertifikayı edinen doğru sunucu olduğunu bilir. Sunucunun sertifikasını doğrulayamamak bir TLS el sıkışma hatasıdır ve curl bir hatayla çıkar.
Nadir durumlarda, sertifika doğrulaması başarısız olsa bile bir TLS sunucusuyla iletişim kurmaya devam etmek istediğinize karar verebilirsiniz. O zaman iletişiminizin Ortadaki Adam (Man-In-The-Middle) saldırılarına maruz kalabileceği gerçeğini kabul edersiniz. -k veya --insecure seçeneğiyle korumalarınızı indirirsiniz.
Yerel CA depoları
Windows ve macOS gibi işletim sistemleri kendi CA depolarına sahip olma eğilimindedir.
curl'ü Windows'ta Schannel ile çalıştırırsanız, curl varsayılan olarak Windows'un kendi CA deposunu kullanır.
curl'ü macOS'ta Secure Transport ile çalıştırırsanız, curl varsayılan olarak macOS'un kendi CA deposunu kullanır.
curl'ü Schannel veya Secure Transport dışındaki herhangi bir TLS arka ucuyla kullanırsanız, yerel CA deposundan bağımsız olarak ayrı bir dosyada veya dizinde sağlanan bir CA deposunu kullanır. Ancak, bazıları için yine de --ca-native komut satırı seçeneğini kullanarak curl'den yerel CA deposunu tercih etmesini isteyebilirsiniz. Bu seçenek OpenSSL (ve çatalları), wolfSSL ve GnuTLS ile desteklenir.
HTTPS vekil sunucuları için karşılık gelen seçenek --proxy-ca-native olarak adlandırılır.
Dosya(lar)daki CA deposu
curl platformunuza özgü bir TLS kütüphanesini (Schannel veya Secure Transport gibi) kullanacak şekilde derlenmemişse, ya yerel CA deposunun nerede olduğunu bilecek şekilde derlenmiş olması gerekir ya da kullanıcıların curl çağrıldığında CA deposuna bir yol sağlaması gerekir.
TLS el sıkışmasında kullanılacak belirli bir CA paketini --cacert komut satırı seçeneğiyle belirtebilirsiniz. Bu paketin PEM formatında olması gerekir. Ayrıca CURL_CA_BUNDLE ortam değişkenini tam yola ayarlayabilirsiniz.
Windows'ta CA deposu
Yerel TLS kütüphanesini (Schannel) kullanmayan Windows üzerinde derlenmiş curl, CA deposunun nasıl bulunup kullanılabileceği konusunda fazladan bir diziye sahiptir.
curl, curl-ca-bundle.crt adlı bir CA sertifika dosyasını şu dizinlerde ve şu sırayla arar:
- uygulamanın dizini
- geçerli çalışma dizini
- Windows Sistem dizini (örn.
C:\windows\system32) - Windows Dizini (örn.
C:\windows) %PATH%boyuncaki tüm dizinler
Sertifika sabitleme (Certificate pinning)
TLS sertifikası sabitleme, sunucu sertifikasını imzalamak için kullanılan açık anahtarın değişmediğini doğrulamanın bir yoludur. Sabitlenmiştir.
Bir TLS veya SSL bağlantısı müzakere edilirken, sunucu kimliğini belirten bir sertifika gönderir. Bu sertifikadan bir açık anahtar çıkarılır ve bu seçeneğe sağlanan açık anahtarla tam olarak eşleşmezse, curl herhangi bir veri göndermeden veya almadan önce bağlantıyı iptal eder.
curl'e sha256 değerini okuması için bir dosya adı söylersiniz veya base64 kodlu karma (hash) değerini doğrudan komut satırında bir sha256// önekiyle belirtirsiniz. Noktalı virgül (;) ile ayrılmış olarak bu şekilde bir veya daha fazla karma belirtebilirsiniz.
curl --pinnedpubkey "sha256//83d34tasd3rt…" https://example.com/
Bu özellik tüm TLS arka uçları tarafından desteklenmez.
OCSP zımbalama (OCSP stapling)
Bu, sunucudan el sıkışmada CA'dan sertifikanın hala geçerli olduğuna dair taze bir "kanıt" sağlamasını istemek için Sertifika Durum İsteği (Certificate Status Request) adı verilen TLS uzantısını kullanır. Bu, sunucunun sertifikasının iptal edilmediğinden gerçekten emin olmanın bir yoludur.
Sunucu bu uzantıyı desteklemiyorsa, test başarısız olur ve curl bir hata döndürür. Sunucuların bunu desteklememesi hala yaygındır.
El sıkışmasının durum isteğini şu şekilde kullanmasını isteyin:
curl --cert-status https://example.com/
Bu özellik yalnızca OpenSSL ve GnuTLS arka uçları tarafından desteklenir.
İstemci sertifikaları
TLS istemci sertifikaları, istemcilerin sunuculara gerçekten doğru eş olduklarını kriptografik olarak kanıtlamalarının bir yoludur (bazen Karşılıklı TLS veya mTLS olarak da bilinir). İstemci sertifikası kullanan bir komut satırı, sertifikayı ve karşılık gelen anahtarı belirtir ve bunlar daha sonra sunucuyla yapılan TLS el sıkışmasında iletilir.
Bunu yaparken istemci sertifikanızın zaten bir dosyada saklanmış olması gerekir ve bunu daha önce farklı bir kanal aracılığıyla doğru örnekten almış olmanız gerekir.
Anahtar genellikle sağlamanız gereken veya etkileşimli olarak istenecek bir şifreyle korunur.
curl, hem istemci sertifikası hem de özel anahtarın birleştirildiği tek bir dosyayı --cert kullanarak belirtmenize izin veren seçenekler sunar veya anahtar dosyasını --key ile bağımsız olarak belirtebilirsiniz:
curl --cert mycert:mypassword https://example.com
curl --cert mycert:mypassword --key mykey https://example.com
Bazı TLS arka uçları için anahtarı ve sertifikayı farklı türler kullanarak da iletebilirsiniz:
curl --cert mycert:mypassword --cert-type PEM \
--key mykey --key-type PEM https://example.com
TLS kimlik doğrulaması
TLS bağlantıları, Güvenli Uzak Şifreler (Secure Remote Passwords - SRP) adı verilen (nadiren kullanılan) bir özellik sunar. Bunu kullanarak, bir ad ve şifre kullanarak sunucu için bağlantının kimliğini doğrularsınız ve bunun için komut satırı bayrakları --tlsuser <ad> ve --tlspassword <sır> şeklindedir. Şöyle:
curl --tlsuser daniel --tlspassword secret https://example.com
TLS arka uçları (backends)
curl derlendiğinde, belirli bir TLS kütüphanesini kullanması söylenir. O TLS kütüphanesi, curl'e kablo üzerinden TLS konuşma yetkileri sağlayan motordur. Bunlara genellikle farklı "arka uçlar" (backends) deriz çünkü bunlar curl makinesine takılabilen farklı parçalar olarak görülebilir. curl bu arka uçlardan birini veya birkaçını kullanabilecek şekilde derlenebilir.
Bazen özellikler ve davranışlar, curl farklı TLS arka uçlarıyla derlendiğinde biraz farklılık gösterir ancak geliştiriciler bu farklılıkları mümkün olduğunca küçük ve fark edilemez hale getirmek için çok çalışırlar.
curl --version ile curl sürüm bilgilerini göstermek, çıktının ilk satırında TLS kütüphanesini ve sürümünü içerir.
Çoklu TLS arka uçları
curl birden fazla TLS arka ucuyla derlendiğinde, her başlatıldığında hangisini kullanacağı söylenebilir. Bir tanesi istenmedikçe her zaman varsayılan olarak belirli bir tanesini kullanacak şekilde derlenir.
Birden fazla arka uca sahip bir curl için curl --version'ı çağırırsanız, son satırda bir özellik olarak MultiSSL'den bahseder. İlk satır, varsayılan olmayanları parantez içinde olmak üzere desteklenen tüm TLS arka uçlarını içerir.
Kullanılacak belirli bir tanesini ayarlamak için CURL_SSL_BACKEND ortam değişkenini adına ayarlayın.
SSLKEYLOGFILE

Uzun zamandır, saygıdeğer ağ analiz aracı Wireshark (yukarıdaki ekran görüntüsü), Firefox ve Chrome tarafından gönderilen ve alınan TLS trafiğinin şifresini çözmek ve incelemek için bir yol sağlamıştır.
Bunu curl ile yapmak da benzer şekilde mümkündür.
Bunu, tarayıcının veya curl'ün şifreleme sırlarını Wireshark'a söylemesini sağlayarak yaparsınız, böylece şifrelerini çözebilir:
- tarayıcıyı veya curl'ü başlatmadan önce
SSLKEYLOGFILEadlı ortam değişkenini seçtiğiniz bir dosya adına ayarlayın - Aynı dosya yolu yolunu Wireshark'taki Master-secret alanına ayarlayın. Tercihler->Protokoller->TLS'ye (Prenences->Protocols->TLS) gidin ve yolu aşağıdaki ekran görüntüsünde gösterildiği gibi düzenleyin.

Bu basit işlemi yaptıktan sonra artık Wireshark'ta curl'ün veya tarayıcınızın HTTPS trafiğini inceleyebilirsiniz. Sadece süper kullanışlı ve harika.
Sadece unutmayın, TLS trafiğini kaydederseniz ve daha sonra analiz etmek için saklamak isterseniz, o trafik yakalamasının şifresini daha sonra da çözebilmek için dosyayı sırlarla birlikte kaydetmeniz gerekir.
libcurl kullanan uygulamalar da
SSLKEYLOGFILE desteği libcurl'ün kendisi tarafından sağlanır - bu da sadece curl komut satırı aracı için değil, libcurl'ü kullanmak üzere oluşturulmuş herhangi bir uygulama için TLS ağ verilerini izlemenizi ve incelemenizi mümkün kılar.
Kısıtlamalar
SSLKEYLOGFILE desteği, curl'ün bu özelliği destekleyen bir TLS arka ucuyla derlenmiş olmasını gerektirir. SSLKEYLOGFILE'ı destekleyen arka uçlar şunlardır: OpenSSL, AWS-LC, BoringSSL, GnuTLS ve wolfSSL. LibreSSL (OpenSSL'in bir çatalı) bunu yalnızca TLS <= 1.2 için destekler.
curl başka bir arka uç kullanacak şekilde derlenmişse, curl TLS trafiğinizi bu şekilde kaydedemezsiniz.
SCP ve SFTP
curl, ön koşul olarak 3. taraf kütüphanelerinden biriyle oluşturulmuşsa SCP ve SFTP protokollerini destekler: libssh2, libssh veya wolfSSH.
SCP ve SFTP, TLS'ye benzeyen ancak birkaç önemli yönden farklılık gösteren, güvenli ve şifreli bir veri protokolü olan SSH'nin üzerine inşa edilmiş protokollerdir. Örneğin, SSH herhangi bir türde sertifika kullanmaz, bunun yerine açık ve özel anahtarlar kullanır. Hem SSH hem de TLS, doğru kullanıldığında güçlü şifreleme ve güvenli transferler sağlar.
SCP protokolü genellikle taşınabilir olmadığı ve genellikle yalnızca Unix sistemleri arasında çalıştığı için ikisinin kara koyunu olarak kabul edilir.
URL'ler (URLs)
SFTP ve SCP URL'leri diğer URL'lere benzer ve bu protokolleri kullanarak dosyaları diğerleriyle aynı şekilde indirirsiniz:
curl sftp://example.com/file.zip -u user
ve:
curl scp://example.com/file.zip -u user
SFTP (ancak SCP değil), URL bir eğik çizgiyle (trailing slash) bittiğinde bir dosya listesi almayı destekler:
curl sftp://example.com/ -u user
Bu protokollerin her ikisinin de "kullanıcılar" ile çalıştığını ve bir dosyayı anonim olarak veya standart bir genel adla istemediğinizi unutmayın. Çoğu sistem, aşağıda belirtildiği gibi kullanıcıların kimlik doğrulamasını gerektirir.
Bir SFTP veya SCP URL'sinden bir dosya isterken, verilen dosya yolu, özellikle kullanıcının ana dizinine göre yolu sormadığınız sürece uzak sunucudaki mutlak yol (absolute path) olarak kabul edilir. Bunu, yolun /~/ ile başladığından emin olarak yaparsınız. Bu, FTP URL'lerinin çalışma şeklinin tam tersidir ve kullanıcılar arasında yaygın bir kafa karışıklığı nedenidir.
daniel kullanıcısının ana dizininden todo.txt dosyasını transfer etmesi için şuna benzer görünür:
curl sftp://example.com/~/todo.txt -u daniel
veya SCP için
curl scp://example.com/~/todo.txt -u daniel:secret
Kimlik Doğrulama (Authentication)
curl ile bir SSH sunucusuna karşı kimlik doğrulama (bir SCP veya SFTP URL'si belirttiğinizde) aşağıdaki gibi yapılır:
- curl sunucuya bağlanır ve bu sunucunun hangi kimlik doğrulama yöntemlerini sunduğunu öğrenir
- curl daha sonra sunulan yöntemleri bir tanesi çalışana veya hepsi başarısız olana kadar tek tek dener
Sunucu açık anahtar kimlik doğrulamasını sunuyorsa, curl ev dizininizdeki .ssh alt dizininde bulunan açık anahtarınızı kullanmaya çalışır. Bunu yaparken, curl'e sunucuda hangi kullanıcı adını kullanacağını söylemeniz gerekir. Örneğin, 'john' kullanıcısı 'sftp.example.com' adlı uzak SFTP sunucusundaki ev dizinindeki girişleri listeler:
curl -u john: sftp://sftp.example.com/
curl herhangi bir nedenle açık anahtarla kimlik doğrulaması yapamazsa, sunucu izin veriyorsa ve kimlik bilgileri komut satırında iletilirse bunun yerine kullanıcı adı + şifreyi kullanmaya çalışır.
Örneğin, yukarıdaki aynı kullanıcı uzak bir sistemde RHvxC6wUA şifresine sahiptir ve SCP aracılığıyla bir dosyayı şu şekilde indirebilir:
curl -u john:RHvxC6wUA -O scp://ssh.example.com/file.tar.gz
Bilinen ana bilgisayarlar (Known hosts)
Güvenli bir ağ istemcisinin, uzak ana bilgisayarın tam olarak iletişim kurduğunu düşündüğü ana bilgisayar olduğundan emin olması gerekir. TLS tabanlı protokollerle bu, istemcinin sunucunun sertifikasını doğrulamasıyla yapılır.
SSH protokolleriyle sunucu sertifikaları yoktur, bunun yerine her sunucu kendi benzersiz anahtarını sağlayabilir. TLS'nin aksine, SSH'nin sertifika yetkilileri veya benzeri bir şeyi yoktur, bu nedenle istemcinin ana bilgisayarın anahtarının (diğer yollarla) neye benzemesi gerektiğini bildiği şeyle eşleştiğinden emin olması gerekir.
Anahtarların eşleştirilmesi tipik olarak anahtarın karmaları (hash) kullanılarak yapılır ve istemcinin bilinen sunucular için karmaları sakladığı dosya genellikle known_hosts olarak adlandırılır ve özel bir SSH dizinine konur. Linux sistemlerinde bu genellikle ~/.ssh olarak adlandırılır.
curl bir SFTP ve SCP ana bilgisayarına bağlandığında, ana bilgisayarın anahtar karmasının zaten bilinen ana bilgisayarlar (known hosts) dosyasında mevcut olduğundan emin olur veya sunucunun doğru sunucu olduğuna güvenemediği için devam eden işlemi reddeder. known_hosts içinde doğru karma mevcut olduğunda curl transferleri gerçekleştirebilir.
curl'ü known_hosts dosyasını kontrol etmeye ve ona uymaya zorlamayı atlamak için -k / --insecure komut satırı seçeneğini kullanabilirsiniz. Ortadaki adam (man-in-the-middle) saldırılarının tespit edilmemesini mümkün kıldığı için bu seçeneği son derece dikkatli kullanmalısınız.
E-posta okuma
İnternet'te sunuculardan e-posta okumak/indirmek için iki baskın protokol vardır (en azından web tabanlı okumayı saymazsak) ve bunlar IMAP ve POP3'tür. İlki biraz daha modern alternatiftir. curl her ikisini de destekler.
POP3
Mesaj numaralarını ve boyutlarını listelemek için:
curl pop3://mail.example.com/
1 numaralı mesajı indirmek için:
curl pop3://mail.example.com/1
1 numaralı mesajı silmek için:
curl --request DELE pop3://mail.example.com/1
IMAP
'stuff' posta kutusundan UID 57'yi kullanarak postayı alın:
curl imap://server.example.com/stuff;UID=57
Bunun yerine, 'fun' posta kutusundan 57 indeksli postayı alın:
curl imap://server.example.com/fun;MAILINDEX=57
'boring' posta kutusundanki postaları listeleyin:
curl imap://server.example.com/boring
'boring' posta kutusundanki postaları listeleyin ve kullanıcı ile şifre sağlayın:
curl imap://server.example.com/boring -u user:password
E-postalar için TLS
POP3 ve IMAP'in her ikisi de güvenli bir bağlantı üzerinden yapılabilir ve her ikisi de açık (explicit) veya örtük (implicit) TLS kullanılarak yapılabilir. "Açık" yöntem muhtemelen en yaygın yaklaşımdır ve istemcinin sunucuya güvenli olmayan bir bağlantı kullanarak bağlanması ve STARTTLS komutunu kullanarak ilerlerken bunu TLS'ye yükseltmesi anlamına gelir. curl'e bunu denemesini --ssl ile söylersiniz veya güvenli bir bağlantıda ısrar etmek isterseniz --ssl-reqd kullanırsınız. Şöyle:
curl pop3://mail.example.com/ --ssl-reqd
veya
curl --ssl imap://mail.example.com/inbox
"Örtük" SSL, bağlantının daha ilk bağlantıda güvenli hale getirilmesi anlamına gelir; bunu curl'ün URL'deki şemada SSL kullanan bir şema belirterek denemesini sağlarsınız. Bu durumda ya pop3s:// ya da imaps://. Bu tür bağlantılar için curl, daha baştan bağlanmak ve bir TLS bağlantısı müzakere etmek konusunda ısrar eder, aksi takdirde işlemi başarısız olur.
Örtük SSL ile yapılan önceki açık örnekler:
curl pop3s://mail.example.com/
veya
curl imaps://mail.example.com/inbox
E-posta gönderme
curl ile e-posta göndermek SMTP protokolü ile yapılır. SMTP, Basit Posta Aktarım Protokolü (Simple Mail Transfer Protocol) anlamına gelir.
curl, bir SMTP sunucusuna veri göndermeyi destekler; bu, doğru komut satırı seçenekleri setiyle birleştirildiğinde bir e-postanın seçtiğiniz bir alıcılar grubuna gönderilmesini sağlar.
curl ile SMTP gönderirken, kullanılması gereken iki gerekli komut satırı seçeneği vardır.
-
Sunucuya
--mail-rcptile en az bir alıcı söylemeniz gerekir. Bu seçeneği birkaç kez kullanabilirsiniz ve ardından curl sunucuya tüm bu e-posta adreslerinin e-postayı alması gerektiğini söyler. -
Sunucuya e-postanın göndericisinin hangi e-posta adresi olduğunu
--mail-fromile söylemeniz gerekir. Bu e-posta adresinin e-posta metnininFrom:satırında gösterilenle aynı olması gerekmediğini fark etmek önemlidir.
Ardından, gerçek e-posta verilerini sağlamanız gerekir. Bu, RFC 5322'ye göre biçimlendirilmiş bir (metin) dosyasıdır. Bir başlıklar seti ve bir gövdedir. Hem başlıkların hem de gövdenin doğru şekilde kodlanması gerekir. Başlıklar tipik olarak To:, From:, Subject:, Date: vb. içerir.
Bir e-posta göndermek için temel bir komut:
curl smtp://mail.example.com --mail-from myself@example.com --mail-rcpt \
receiver@example.com --upload-file email.txt
Örnek bir email.txt şöyle görünebilir:
From: John Smith <john@example.com>
To: Joe Smith <smith@example.com>
Subject: an example.com example email
Date: Mon, 7 Nov 2016 08:45:16
Dear Joe,
Welcome to this example email. What a lovely day.
Güvenli posta transferi
Bazı posta sağlayıcıları SMTP için SSL kullanılmasına izin verir veya bunu gerektirir. SSL için özel bir port kullanabilirler veya açık metin bağlantısı üzerinden SSL yükseltmesine izin verebilirler.
Posta sağlayıcınızın özel bir SSL portu varsa, varsayılan olarak 465 numaralı SMTP SSL portunu kullanan ve tüm bağlantının SSL olmasını gerektiren smtp:// yerine smtps:// kullanabilirsiniz. Örneğin smtps://smtp.gmail.com/.
Ancak, sağlayıcınız açık metinden güvenli transferlere yükseltmeye izin veriyorsa şu seçeneklerden birini kullanabilirsiniz:
--ssl SSL/TLS Dene (FTP, IMAP, POP3, SMTP)
--ssl-reqd SSL/TLS Gerektir (FTP, IMAP, POP3, SMTP)
Komuta --ssl ekleyerek curl'e güvenli transferlere yükseltmeyi denemesini ancak gerektirmemesini söyleyebilirsiniz:
curl --ssl smtp://mail.example.com --mail-from myself@example.com \
--mail-rcpt receiver@example.com --upload-file email.txt \
--user 'user@your-account.com:your-account-password'
Komuta --ssl-reqd ekleyerek curl'e güvenli transferleri kullanmaya yükseltmeyi gerektirmesini söyleyebilirsiniz:
curl --ssl-reqd smtp://mail.example.com --mail-from myself@example.com \
--mail-rcpt receiver@example.com --upload-file email.txt \
--user 'user@your-account.com:your-account-password'
SMTP URL'si
Bir SMTP isteğinin yol kısmı, posta sunucusuyla iletişim sırasında sunulacak ana bilgisayar adını belirtir. Yol atlanırsa, curl yerel bilgisayarın ana bilgisayar adını bulmaya ve onu kullanmaya çalışır. Ancak bu, bazı posta sunucuları tarafından gerekli kılınan tam nitelikli alan adını (FQDN) döndürmeyebilir ve bu yolu belirtmek, gethostname veya getaddrinfo gibi harici bir işlevden elde etmiş olabileceğiniz makinenizin tam nitelikli alan adı gibi alternatif bir ad ayarlamanıza olanak tanır.
mail.example.com adresindeki posta sunucusuna bağlanmak ve HELO veya EHLO komutunda yerel bilgisayarınızın ana bilgisayar adını göndermek için:
curl smtp://mail.example.com
İstemci-sunucu iletişimini görmek için her zaman olduğu gibi -v seçeneğini kullanabilirsiniz.
Bunun yerine curl'ün mail.example.com adresindeki posta sunucusuna HELO / EHLO komutunda client.example.com göndermesini sağlamak için şunu kullanın:
curl smtp://mail.example.com/client.example.com
MX araması yok (No MX lookup)
Sıradan bir posta istemcisiyle e-posta gönderdiğinizde, önce e-posta göndermek istediğiniz belirli alan adı için bir MX kaydı olup olmadığını kontrol eder. joe@example.com adresine bir e-posta gönderirseniz, istemci example.com kullanıcılarına e-posta gönderirken hangi posta sunucu(ları)nı kullanacağını öğrenmek için example.com için MX kayıtlarını alır.
curl kendi başına hiçbir MX araması yapmaz. Belirli bir alan adı için hangi sunucuya e-posta göndereceğinizi bulmak istiyorsanız, bunu önce bulmanızı ve ardından curl'ü bu sunucuları kullanması için çağırmanızı öneririz. MX kayıtlarını almak için yararlı komut satırı araçları arasında 'dig' ve 'nslookup' bulunur.
DICT
DICT, sözlük aramaları için bir protokoldür.
Kullanım
Eğlenmek için deneyin
curl dict://dict.org/m:curl
curl dict://dict.org/d:heisenbug:jargon
curl dict://dict.org/d:daniel:gcide
'm' için takma adlar 'match' (eşleşme) ve 'find' (bul), 'd' için takma adlar 'define' (tanımla) ve 'lookup' (ara) şeklindedir. Örneğin,
curl dict://dict.org/find:curl
RFC'nin URL açıklamasını bozan (ancak DICT protokolünü bozmayan) komutlar şunlardır:
curl dict://dict.org/show:db
curl dict://dict.org/show:strat
IPFS
IPFS, Gezegenler Arası Dosya Sistemi (Inter-Planetary File System) anlamına gelir. curl, IPFS'yi yalnızca bir HTTP ağ geçidi (HTTP gateway) aracılığıyla destekler. Bu, kendisine verildiğinde IPFS URL'lerini anladığı, ancak içeriği almak üzere curl'ün kullanması için çalışan bir ağ geçidi URL'si de sağlamanız gerektiği anlamına gelir. curl yerel olarak IPFS konuşmaz.
Ağ geçidi (Gateway)
--ipfs-gateway, kullanıcının IPFS HTTP ağ geçidi URL'sini belirtmesini sağlar. Şöyle:
curl --ipfs-gateway http://localhost:8080 ipfs://bafybeigagd5nmnn2iys2f3d/
Uzak bir ağ geçidine gitmeyi seçerseniz, ağ geçidine tamamen güvendiğinizin farkında olmalısınız. Kendiniz barındırdığınız için yerel ağ geçitlerinde bu sorun değildir. Uzak ağ geçitlerinde, yaptığınız istekle eşleşmeyen verileri size döndüren, isteği inceleyen ve hatta isteğe müdahale eden kötü niyetli bir aktör olma potansiyeli vardır. curl kullanarak IPFS alırken bunu fark etmeyebilirsiniz.
--ipfs-gateway seçeneği kullanılmazsa, curl rehberlik için IPFS_GATEWAY ortam değişkenini ve ayarlanmamışsa ağ geçidini tanımlamak için kullanılabilecek ~/.ipfs/gateway dosyasını kontrol eder.
IPFS desteği curl'e ilk olarak 8.4.0 sürümünde eklendi.
MQTT
Düz bir GET, konuya abone olur ve yayınlanan tüm mesajları yazdırır. Bir POST yapmak, gönderi verilerini konuya yayınlar ve çıkar.
example.com tarafından yayınlanan home/bedroom konusundaki sıcaklığa abone olun:
curl mqtt://example.com/home/bedroom/temp
example.com sunucusu tarafından barındırılan home/bedroom/dimmer konusuna 75 değerini gönderin:
curl -d 75 mqtt://example.com/home/bedroom/dimmer
curl bir aboneye yanıt olarak ne sunar
İki bayt konu uzunluğu (MSB | LSB), konu ve ardından yükü (payload) çıktılar.
Uyarılar (Caveats)
Eylül 2022 itibarıyla curl'ün MQTT desteğinde kalan sınırlamalar:
- Yayınlamak için yalnızca QoS seviyesi 0 uygulanmıştır
- Yayınlamak için tutma (retain) bayrağını ayarlamanın bir yolu yoktur
- TLS (mqtts) desteği yoktur
TELNET
Telnet, çift yönlü açık metin iletişimi için eski bir uygulama protokolüdür. Etkileşimli metin odaklı iletişimler için tasarlanmıştır ve Telnet'in şifreli veya güvenli bir sürümü yoktur.
TELNET, curl için mükemmel bir eşleşme değildir. Protokol düz yüklemeleri veya indirmeleri işlemek için yapılmamıştır, bu nedenle olağan curl paradigmaları curl'ün onunla uygun şekilde başa çıkmasını sağlamak için biraz esnetilmek zorunda kalmıştır.
curl, alınan verileri stdout'a gönderir ve stdin'e gönderilecek girdiyi okur. Bağlantı kesildiğinde veya kullanıcı control-c tuşlarına bastığında transfer tamamlanır.
Tarihi TELNET
Bir zamanlar, sistemler giriş için telnet erişimi sağlıyordu. O zaman bir sunucuya bağlanabilir ve bugün SSH ile yaptığınız gibi ona giriş yapabilirdiniz. Bu uygulama neyse ki protokolün güvensiz doğası nedeniyle artık çoğunlukla müze dolaplarına taşındı.
telnet için varsayılan port numarası 23'tür.
TELNET ile hata ayıklama
TELNET'in temel olarak hedef ana bilgisayar ve porta basit bir açık metin TCP bağlantısı olması gerçeği, onu zaman zaman diğer protokolleri ve hizmetleri hata ayıklamak için biraz yararlı kılar.
Örnek, 80. porttaki yerel HTTP sunucunuza bağlanın ve manuel olarak GET / girip return tuşuna iki kez basarak ona (bozuk) bir istek gönderin:
curl telnet://localhost:80
Web sunucunuz büyük olasılıkla şuna benzer bir şey döndürür:
HTTP/1.1 400 Bad Request
Date: Tue, 07 Dec 2021 07:41:16 GMT
Server: softeare/7.8.9
Content-Length: 31
Connection: close
Content-Type: text/html
[message]
Seçenekler
curl bir sunucuya bir TELNET bağlantısı kurduğunda, ondan seçenekleri iletmesini isteyebilirsiniz. Bunu --telnet-option (veya -t) ile yaparsınız ve kullanılabilecek üç seçenek vardır:
TTYPE=<term>oturum için "terminal türünü"<term>olacak şekilde ayarlar.XDISPLOC=<X display>X ekran konumunu ayarlarNEW_ENV=<var,val>uzak oturumdavarortam değişkeninivaldeğerine ayarlar
Yerel makinenizin telnet sunucusuna giriş yapın ve bir vt100 terminali kullandığınızı söyleyin:
curl --telnet-option TTYPE=vt100 telnet://localhost
İstendiğinde adınızı ve şifrenizi manuel olarak girmeniz gerekir.
TFTP
Önemsiz Dosya Aktarım Protokolü (Trivial File Transfer Protocol - TFTP), bir istemcinin uzak bir ana bilgisayardan dosya almasına veya ona dosya koymasına izin veren basit bir açık metin protokolüdür.
Bu protokol için birincil kullanım durumları, önyükleme görüntüsünü (boot image) yerel bir ağ üzerinden almak olmuştur. TFTP ayrıca, diğer birçok protokolün kullandığı TCP'nin aksine UDP üzerinden yapılması gerçeğiyle diğer birçok protokolün yanında biraz öne çıkar.
TFTP'nin güvenli bir sürümü veya çeşidi yoktur.
İndirme (Download)
Seçtiğiniz TFTP sunucusundan bir dosya indirin:
curl -O tftp://localserver/file.boot
Yükleme (Upload)
Seçtiğiniz TFTP sunucusuna bir dosya yükleyin:
curl -T file.boot tftp://localserver/
TFTP seçenekleri
TFTP protokolleri, verileri iletişimin diğer ucuna "bloklar" kullanarak iletir. Bir TFTP transferi kurulduğunda, her iki taraf da ya varsayılan blok boyutu olan 512 baytı kullanmayı kabul eder ya da farklı bir tane üzerinde anlaşır. curl, 8 ila 65464 bayt arasındaki blok boyutlarını destekler.
curl'den varsayılandan farklı bir boyut kullanmasını --tftp-blksize ile istersiniz. Şöyle 8192 baytlık bloklar isteyin:
curl --tftp-blksize 8192 tftp://localserver/file
Seçenek müzakeresini hiç işlemeyen sunucu uygulamaları olduğu gösterilmiştir, bu nedenle curl ayrıca tüm seçenek ayarlama girişimlerini tamamen kapatma yeteneğine de sahiptir. Böyle bir sunucuyla çalışma talihsizliğindeyseniz, bayrağı şöyle kullanın:
curl --tftp-no-options tftp://localserver/file
Komut satırı HTTP
Tüm kullanıcı anketlerinde ve tüm curl'ün ömrü boyunca, HTTP, curl'ün desteklediği en önemli ve en sık kullanılan protokol olmuştur. Bu bölüm, etkili HTTP transferleri yapmayı ve curl ile genel oynamayı açıklar.
HTTPS, kaputun altında gerçekten aynı şey olduğu için (HTTPS, ekstra bir güvenlik TLS katmanına sahip HTTP'dir), bu çoğunlukla HTTPS için de aynı şekilde çalışır. Ayrıca özel HTTPS bölümüne bakın.
- Yöntem (Method)
- Yanıtlar (Responses)
- Kimlik Doğrulama
- HTTP sürümleri
- HTTP POST
- Yönlendirmeler (Redirects)
- HTTP'nizi özelleştirme
- HTTP PUT
- Çerezler (Cookies)
- HTTPS
- Tarayıcı benzeri görevleri senaryolaştırma
Yöntem (Method)
Her HTTP isteğinde bir yöntem (method) vardır. Bazen fiil (verb) olarak da adlandırılır. En sık kullanılanlar GET, POST, HEAD ve PUT'tur.
Ancak normalde yöntemi komut satırında belirtmezsiniz, bunun yerine kullanılan tam yöntem kullandığınız belirli seçeneklere bağlıdır. GET varsayılandır, -d veya -F kullanmak onu bir POST yapar, -I bir HEAD oluşturur ve -T bir PUT gönderir.
Bununla ilgili daha fazla bilgi HTTP isteğini değiştirme bölümünde.
Yanıtlar (Responses)
Bir HTTP istemcisi bir sunucuyla HTTP konuştuğunda, sunucu bir HTTP yanıt mesajıyla yanıt verir veya curl bunu bir hata olarak kabul eder ve Empty reply from server (Sunucudan boş yanıt) hata mesajıyla 52 döndürür.
Bir HTTP yanıtının boyutu
Bir HTTP yanıtının belirli bir boyutu vardır ve curl'ün bunu bulması gerekir. Bir HTTP yanıtının sonunu işaret etmenin birkaç farklı yolu vardır ancak en temel yol yanıttaki Content-Length: başlığını kullanmak ve bununla yanıt gövdesindeki tam bayt sayısını belirtmektir.
Bazı eski HTTP sunucusu uygulamalarının 2 GB'den büyük dosya boyutlarıyla ilgili sorunları vardı ve Content-Length: başlıklarını negatif boyutlarla veya tamamen yanlış verilerle göndermeyi başardılar. curl'e --ignore-content-length ile Content-Length: başlığını tamamen görmezden gelmesi söylenebilir. Bunu yapmak başka olumsuz yan etkilere neden olabilir ancak en azından verileri almanızı sağlamalıdır.
HTTP yanıt kodları
Bir HTTP transferi, ilk yanıt satırında 3 basamaklı bir yanıt kodu alır. Yanıt kodu, sunucunun isteğin nasıl işlendiği hakkında istemciye bir ipucu verme şeklidir.
İstenen belgenin teslim edilemediğini (veya benzeri bir şeyi) yanıt kodu gösterse bile curl'ün bunu bir hata olarak kabul etmediğini not etmek önemlidir. curl, HTTP'nin başarılı bir şekilde gönderilmesini ve alınmasını iyi olarak kabul eder.
HTTP yanıt kodunun ilk basamağı bir tür hata sınıfıdır:
- 1xx: geçici yanıt, daha fazlası geliyor
- 2xx: başarı
- 3xx: bir yönlendirme
- 4xx: istemci sunucunun teslim edemeyeceği veya etmeyeceği bir şey istedi
- 5xx: sunucuda bir sorun var
Yanıt kodunu çıkarmak için curl'ün --write-out seçeneğini kullanabileceğinizi unutmayın. --write-out bölümüne bakın.
curl'ün yanıt kodları >= 400 için bir hata döndürmesini sağlamak üzere --fail veya --fail-with-body kullanmanız gerekir. O zaman curl bu tür durumlar için hata kodu 22 ile çıkar.
CONNECT yanıt kodları
Aynı curl transferinde bir HTTP isteği ve ayrı bir CONNECT isteği olabileceğinden, genellikle CONNECT yanıtını (vekil sunucudan gelen) uzak sunucunun HTTP yanıtından ayırırız.
CONNECT de bir HTTP isteğidir, bu nedenle aynı sayısal aralıkta yanıt kodları alır ve bu kodu da çıkarmak için --write-out kullanabilirsiniz.
Parçalı (Chunked) aktarım kodlaması
Bir HTTP 1.1 sunucusu, parçalı kodlanmış bir yanıtla (chunked encoded response) yanıt vermeye karar verebilir; bu, HTTP 1.0'da bulunmayan bir özelliktir.
Parçalı bir yanıt alırken, yanıtın boyutunu belirtmek için bir Content-Length: yoktur. Bunun yerine, curl'e parçalı verilerin geldiğini söyleyen bir Transfer-Encoding: chunked başlığı vardır ve ardından yanıt gövdesinde veriler bir dizi parça halinde gelir. Her bir parça, o belirli parçanın boyutuyla (onaltılık olarak) başlar, ardından yeni bir satır ve ardından parçanın içeriği gelir. Bu, yanıtın sonuna kadar tekrar tekrar devam eder ve yanıtın sonu sıfır boyutlu bir parçayla işaretlenir. Bu yanıt kodlamasının amacı, sunucu göndermeye başlamadan önce tam boyutu bilmese bile istemcinin yanıtın ne zaman bittiğini anlayabilmesidir. Bu genellikle yanıtın dinamik olduğu ve istek geldiği anda oluşturulduğu durumlarda geçerlidir.
curl gibi istemciler parçaların kodunu çözer ve kullanıcılara parça boyutlarını göstermez.
Gzip ile sıkıştırılmış transferler
HTTP üzerinden yanıtlar sıkıştırılmış formatta gönderilebilir. Bu en yaygın olarak sunucu tarafından yanıtta istemciye bir ipucu olarak Content-Encoding: gzip içerildiğinde yapılır. Sıkıştırılmış yanıtlar, statik kaynaklar gönderildiğinde (daha önce sıkıştırılmış olan) veya hatta bant genişliğinden daha fazla CPU gücünün mevcut olduğu çalışma zamanında çok mantıklıdır. Çok daha küçük bir veri miktarı göndermek genellikle tercih edilir.
curl'den, --compressed kullanarak hem sıkıştırılmış içerik istemesini hem de içerik kodlu gzip (veya aslında curl'ün anladığı diğer herhangi bir sıkıştırma algoritması) alırken gzipli verileri otomatik ve şeffaf bir şekilde açmasını isteyebilirsiniz:
curl --compressed http://example.com/
Aktarım kodlaması (Transfer encoding)
Aktarım kodlamasıyla kullanılan daha az yaygın bir özellik sıkıştırmadır.
Sıkıştırma başlı başına yaygındır. Zamanla HTTP için sıkıştırma yapmanın baskın ve web uyumlu yolu, yukarıdaki bölümde açıklandığı gibi Content-Encoding kullanmak olmuştur. HTTP başlangıçta şeffaf sıkıştırmanın bir aktarım kodlaması olarak yapılmasına izin vermek için tasarlanmış ve belirtilmişti ve curl bu özelliği destekler.
İstemci daha sonra sunucudan sıkıştırma aktarım kodlaması yapmasını ister ve kabul edilirse, bunu yaptığını belirten bir başlıkla yanıt verir ve ardından curl varışta verileri şeffaf bir şekilde açar. Bir curl kullanıcısı --tr-encoding ile sıkıştırılmış bir aktarım kodlaması ister:
curl --tr-encoding http://example.com/
Doğadaki pek çok HTTP sunucusunun bunu desteklemediği not edilmelidir.
Aktarım kodlamasını iletme (Pass on transfer encoding)
Bazı durumlarda curl'ü bir vekil sunucu veya başka bir ara yazılım olarak kullanmak isteyebilirsiniz. Bu durumlarda, curl'ün transfer-encoding başlıklarıyla ilgilenme ve ardından gerçek verileri şeffaf bir şekilde çözme yolu, son alıcı aynı zamanda aynısını yapmayı bekliyorsa istenmeyebilir.
O zaman curl'den alınan verileri çözmeden iletmesini isteyebilirsiniz. Bu, boyutları parçalı kodlama formatında veya sıkıştırılmış aktarım kodlaması kullanıldığında sıkıştırılmış formatta vb. iletmek anlamına gelir.
curl --raw http://example.com/
Kimlik Doğrulama
Her HTTP isteği kimlik doğrulamalı hale getirilebilir. Bir sunucu veya vekil sunucu, kullanıcının bir URL'ye erişmek veya bir eylemi gerçekleştirmek için doğru kimlik bilgilerine sahip olduğuna dair kanıt sağlamasını isterse, müşteriye isteğe izin verilmesi için doğru bir HTTP kimlik doğrulama başlığı sağlaması gerektiğini bildiren bir HTTP yanıt kodu gönderebilir.
Kimlik doğrulaması gerektiren bir sunucu, 401 yanıt kodunu ve sunucunun desteklediği tüm kimlik doğrulama yöntemlerini listeleyen ilişkili bir WWW-Authenticate: başlığını geri gönderir.
Kimlik doğrulaması gerektiren bir HTTP vekil sunucusu, 407 yanıt kodunu ve vekil sunucunun desteklediği tüm kimlik doğrulama yöntemlerini listeleyen ilişkili bir Proxy-Authenticate: başlığını geri gönderir.
Bugünün web sitelerinin çoğunun oturum açma vb. için HTTP kimlik doğrulaması gerektirmediğini, bunun yerine kullanıcılardan web sayfalarında oturum açmalarını istediğini ve ardından tarayıcının kullanıcı ve şifre vb. ile bir POST yayınladığını ve ardından oturum için çerezleri koruduğunu belirtmekte fayda var.
curl'e kimlik doğrulamalı bir HTTP isteği yapmasını söylemek için, kullanıcı adı ve şifre (iki nokta üst üste ile ayrılmış) sağlamak üzere -u, --user seçeneğini kullanırsınız. Şöyle:
curl --user daniel:secret http://example.com/
Bu, curl'ün varsayılan Basic HTTP kimlik doğrulama yöntemini kullanmasını sağlar. Evet, gerçekten Basic (Temel) olarak adlandırılır ve gerçekten temeldir. Temel yöntemi açıkça istemek için --basic kullanın.
Basic kimlik doğrulama yöntemi, kullanıcı adını ve şifreyi ağ üzerinden açık metin olarak (base64 kodlu) gönderir ve HTTP aktarımı için bundan kaçınılmalıdır.
Tek bir (belirtilen veya ima edilen) kimlik doğrulama yöntemini kullanarak bir HTTP transferi yapmayı isterken, curl kimlik doğrulama başlığını kablodaki ilk isteğe zaten ekler.
curl'ün önce kimlik doğrulamasının gerçekten gerekli olup olmadığını test etmesini tercih ederseniz, curl'den bunu bulmasını ve ardından --anyauth ile bildiği en güvenli yöntemi otomatik olarak kullanmasını isteyebilirsiniz. Bu, curl'ün isteği kimlik doğrulaması olmadan denemesini ve gerekirse kimlik doğrulamasına geçmesini sağlar:
curl --anyauth --user daniel:secret http://example.com/
ve aynı kavram, kimlik doğrulama gerektirebilecek HTTP işlemleri için de çalışır:
curl --proxy-anyauth --proxy-user daniel:secret http://example.com/ \
--proxy http://proxy.example.com:80/
curl tipik olarak (nasıl oluşturulduğuna bağlı olarak biraz değişebilir) Digest, Negotiate ve NTLM dahil olmak üzere diğer birçok kimlik doğrulama yöntemini de konuşur. Bu yöntemleri de özellikle isteyebilirsiniz:
curl --digest --user daniel:secret http://example.com/
curl --negotiate --user daniel:secret http://example.com/
curl --ntlm --user daniel:secret http://example.com/
AWS sigv4
Defacto kimlik doğrulama standardı AWS sigv4, diğer HTTP kimlik doğrulama mekanizmalarından biraz farklıdır ve bu nedenle onu farklı kullanırsınız.
Bu seçenek, işlem için bir veya daha fazla veri alanı sağladığınız ek bir dize argümanı alır, iki nokta üst üste ile ayrılmış: sağlayıcı 1, sağlayıcı 2, bölge ve hizmet.
-
sağlayıcı (provider), giden kimlik doğrulama başlıkları oluşturulurken algoritma tarafından kullanılan dizelerdir.
-
bölge (region), bölge adı uç noktadan atlandığında bir kaynak koleksiyonunun coğrafi alanını (bölge kodu) işaret eden bir addır.
-
hizmet (service), hizmet adı uç noktadan atlandığında bir bulut (hizmet kodu) tarafından sağlanan bir işlevi işaret eden bir dizedir.
Sadece sağlayıcı 1'in sağlanması zorunludur. Diğerleri aksi takdirde URL'de kullanılan ana bilgisayar adından çıkarılır.
Örnek:
curl --aws-sigv4 "aws:amz:us-east-2:es" --user "key:secret" \
https://example.com
HTTP sürümleri
Diğer herhangi bir İnternet protokolü gibi, HTTP protokolü de yıllar içinde gelişmeye devam etti ve şu anda dünyaya dağılmış ve zaman içinde değişen başarı seviyeleriyle farklı sürümleri konuşan istemciler ve sunucular var. curl'ün URL'lerinizle çalışmasını sağlamak için curl, bir isteğin ve transferin hangi HTTP sürümünü kullanması gerektiğini belirtmeniz için yollar sunar. curl, en yaygın, isterseniz en mantıklı varsayılan değerleri ilk önce kullanmaya çalışacak şekilde tasarlanmıştır ancak bazen bu yeterli olmaz ve o zaman curl'e ne yapması gerektiği konusunda talimat vermeniz gerekebilir.
curl, HTTP sunucuları için varsayılan olarak HTTP/1.1'i kullanır ancak HTTPS'e bağlanırsanız ve yerleşik HTTP/2 yeteneklerine sahip bir curl'ünüz varsa, otomatik olarak HTTP/2'yi müzakere etmeye çalışır veya müzakere başarısız olursa 1.1'e geri döner. HTTP/2 yetenekli olmayan curl'ler varsayılan olarak HTTPS üzerinden 1.1 alır.
| Seçenek | Açıklama |
|---|---|
| --http1.0 | HTTP/1.0 |
| --http1.1 | HTTP/1.1 |
| --http2 | HTTP/2 |
| --http2-prior-knowledge | HTTP/2 |
| --http3 | HTTP/3 |
HTTP/0.9
HTTP/1.0 kullanıma sunulmadan önce kullanılan HTTP sürümü genellikle HTTP/0.9 olarak adlandırılır. O günlerde, HTTP yanıtlarının başlıkları yoktu çünkü yalnızca bir yanıt gövdesi döndürür ve ardından bağlantıyı hemen kapatırlardı.
curl'e bu tür yanıtları desteklemesi söylenebilir ancak varsayılan olarak güvenlik nedenleriyle bunları tanımaz. Kötü olan hemen hemen her şey curl'e bir HTTP/0.9 yanıtı gibi görünür, bu nedenle seçeneğin dikkatli kullanılması gerekir.
curl'e verilen HTTP/0.9 seçeneği, yukarıda belirtilen diğer HTTP komut satırı seçeneklerinden farklıdır; çünkü bu, hangi yanıtın kabul edileceğini kontrol ederken, diğerleri hangi HTTP protokol sürümünün kullanılmaya çalışılacağı ile ilgilidir.
curl'e bir HTTP/0.9 yanıtını kabul etmesini şöyle söyleyin:
curl --http0.9 https://example.com/
HTTP/2
curl, uygun ön koşullarla oluşturulduğu varsayılarak hem HTTP:// hem de HTTPS:// URL'leri için HTTP/2'yi destekler. Hatta bir HTTPS URL'si verildiğinde varsayılan olarak HTTP/2'yi kullanır çünkü bunu yapmak herhangi bir ceza (performans kaybı) anlamına gelmez ve curl HTTP/2'yi desteklemeyen sitelerle kullanıldığında istek bunun yerine HTTP/1.1'i müzakere eder.
Ancak HTTP:// URL'leri ile HTTP/2'ye yükseltme, fazladan bir gidiş-dönüşe (round-trip) neden olabilen ve belki daha da zahmetlisi, eski sunucuların önemli bir kısmının böyle bir başlık gördüğünde 400 yanıtı döndürdüğü bir Upgrade: başlığı ile yapılır.
Ayrıca HTTP:// için HTTP/2'yi destekleyen bazı (çoğu?) sunucuların (ki bu başlı başına tüm sunucular değildir), örneğin POST'ta Upgrade: başlığını kabul etmediği de belirtilmelidir.
Bir sunucudan HTTP/2 kullanmasını istemek için sadece:
curl --http2 http://example.com/
curl'ünüz HTTP/2'yi desteklemiyorsa, o komut satırı aracı bunu söyleyen bir hata döndürür. curl -V çalıştırmak curl sürümünüzün bunu destekleyip desteklemediğini gösterir.
Sunucunuzun HTTP/2 konuştuğunu zaten biliyorsanız (örneğin, makinelerinizde tam olarak neyin çalıştığını bildiğiniz kendi kontrollü ortamınızda), --http2-prior-knowledge ile HTTP/2 müzakeresini kısayoldan geçebilirsiniz.
Çoklama (Multiplexing)
HTTP/2 protokolündeki birincil özellik, aynı fiziksel bağlantı üzerinden birkaç mantıksal akışı çoklama (multiplex) yeteneğidir. curl komut satırı aracı, paralel transferler yaparken bu özellikten yararlanabilir.
HTTP/3
HTTP/3, seleflerinden birkaç yönden farklıdır. Belki de en belirgin şekilde, HTTP/3, HTTP/2'nin yapabildiği gibi aynı bağlantı üzerinde müzakere edilemez. HTTP/3'ün farklı bir taşıma protokolü kullanması nedeniyle, bunun için özel bir bağlantı kurması ve müzakere etmesi gerekir.
QUIC
HTTP/3, QUIC üzerinden iletişim kurmak üzere tasarlanmış HTTP sürümüdür. QUIC, çoğu özel amaç için bir TCP+TLS yedeği olarak kabul edilebilir.
Bu nedenle HTTP/3 kullanan tüm transferler TCP kullanmaz. QUIC kullanırlar. QUIC, UDP üzerine inşa edilmiş güvenilir bir taşıma protokolüdür. HTTP/3, QUIC kullanımını ima eder.
Yalnızca HTTPS
HTTP/3, her zaman TLS kullanan QUIC üzerinden gerçekleştirilir, bu nedenle HTTP/3 tanımı gereği her zaman şifreli ve güvenlidir. Bu nedenle curl, HTTP/3'ü yalnızca HTTPS:// URL'leri için kullanır.
Etkinleştirme
Doğrudan HTTP/3'e bir kısayol olarak, curl'ün verilen ana bilgisayar adı ve port numarasına doğrudan bir QUIC bağlantısı kurmaya çalışmasını sağlamak için --http3 kullanın. Şöyle:
curl --http3 https://example.com/
Normalde, --http3 seçeneği olmadan, bir HTTPS:// URL'si, bir istemcinin ona TCP (ve TLS) kullanarak bağlanması gerektiğini ima eder.
Çoklama (Multiplexing)
HTTP/3 protokolündeki birincil özellik, aynı fiziksel bağlantı üzerinden birkaç mantıksal akışı çoklama yeteneğidir. curl komut satırı aracı, paralel transferler yaparken bu özellikten yararlanabilir.
Alt-svc:
HTTP/3'e geçmenin alt-svc yöntemi, bir sunucu için HTTP/3'e önyükleme yapmanın (bootstrapping) resmi yoludur.
Bu özelliğin yerleşik olması gerektiğini ve alt-svc önbelleği zaten dolu değilse mevcut istek için HTTP/3'e geçmediğini, bunun yerine bilgiyi ana bilgisayara yapılacak bir sonraki istekte kullanmak üzere sakladığını unutmayın.
QUIC reddedildiğinde
Belirli bir miktarda QUIC bağlantı girişimi başarısız olur; bunun nedeni kısmen birçok ağın ve ana bilgisayarın trafiği engellemesi veya kısıtlamasıdır.
--http3 kullanıldığında, curl QUIC bağlantısı başlatıldıktan birkaç yüz milisaniye sonra HTTP/2 veya HTTP/1 kullanan ikinci bir transfer girişimi başlatır; böylece QUIC üzerinden bağlantı girişimi başarısız olursa veya dayanılmaz derecede yavaş olursa eski bir HTTP sürümünü kullanan bağlantı yine de başarılı olabilir ve transferi gerçekleştirebilir. Bu, kullanıcıların --http3'ü işlemin çalışacağına dair bir miktar güvenle kullanmasını sağlar.
--http3-only, paralel olarak eski herhangi bir sürümü denememek, ancak böylece hiçbir QUIC bağlantısı kurulamazsa transferin hemen başarısız olmasını sağlamak için açıkça sağlanmıştır.
HTTP POST
POST, verileri alıcı bir web uygulamasına göndermek için icat edilen HTTP yöntemidir ve web üzerindeki en yaygın HTML formları bu şekilde çalışır. Genellikle alıcıya nispeten küçük miktarlarda veri yığını gönderir.
- Basit POST
- Content-Type
- İkili (Binary) gönderme
- JSON
- URL kodlanmış veri
- GET'e dönüştürme
- Expect 100-continue
- Parçalı (Chunked) kodlanmış POST'lar
- Gizli form alanları
- Bir tarayıcının ne gönderdiğini anlama
- JavaScript ve formlar
- Multipart form gönderileri
- -d vs -F
Basit POST
Form verilerini göndermek için bir tarayıcı, verileri ve işareti (&) sembolleriyle ayrılmış bir dizi ad=değer çifti olarak URL kodlar. Ortaya çıkan dize bir POST isteğinin gövdesi olarak gönderilir. Aynısını curl ile yapmak için -d (veya --data) argümanını şu şekilde kullanın:
curl -d 'name=admin&shoesize=12' http://example.com/
Komut satırında birden fazla -d seçeneği belirtirken, curl bunları birleştirir ve aralarına ve işareti ekler, bu nedenle yukarıdaki örnek şu şekilde de yazılabilir:
curl -d name=admin -d shoesize=12 http://example.com/
Gönderilecek veri miktarı komut satırında sadece bir dize olamayacak kadar büyükse, verileri standart curl tarzında bir dosya adından da okuyabilirsiniz:
curl -d @filename http://example.com
Sunucu verilerin özel bir şekilde kodlandığını varsayabilirken, curl göndermesini söylediğiniz verileri kodlamaz veya değiştirmez. curl tam olarak verdiğiniz baytları gönderir (bir dosyadan okurken -d'nin satır başlarını ve yeni satırları atlaması dışında; bu nedenle bunların veriye dahil edilmesini istiyorsanız --data-binary kullanmanız gerekir).
@ sembolüyle başlayan bir POST gövdesi göndermek için, curl'ün bunu bir dosya adı olarak yüklemeye çalışmasını önlemek üzere, bunun yerine --data-raw kullanın. Bu seçeneğin dosya yükleme yeteneği yoktur:
curl --data-raw '@string' https://example.com
Content-Type
curl'ün -d seçeneğiyle POST yapmak, Content-Type: application/x-www-form-urlencoded gibi görünen varsayılan bir başlık içermesini sağlar. Tipik tarayıcınızın düz bir POST için kullandığı şey budur.
POST verilerinin birçok alıcısı Content-Type başlığını önemsemez veya kontrol etmez.
Eğer bu başlık sizin için yeterince iyi değilse, elbette bunu değiştirmeli ve yerine doğrusunu sağlamalısınız. Örneğin, bir sunucuya JSON gönderiyorsanız ve içeriğin ne olduğu hakkında sunucuya daha doğru bilgi vermek istiyorsanız:
curl -d '{json}' -H 'Content-Type: application/json' https://example.com
İkili (Binary) gönderme
Bir dosyadan gönderilecek verileri okurken, -d satır başlarını ve yeni satırları çıkarır. curl'ün verilen dosyayı tam olarak verildiği gibi ikili (binary) olarak okumasını ve kullanmasını istiyorsanız --data-binary kullanın:
curl --data-binary @filename http://example.com/
JSON
curl 7.82.0, HTTP sunucularına POST kullanarak JSON biçimli veriler göndermenin yeni bir yolu olarak --json seçeneğini tanıttı. Bu seçenek bir kısayol olarak çalışır ve şu üçünün yerini alan tek bir seçenek sunar:
--data-binary [arg]
--header "Content-Type: application/json"
--header "Accept: application/json"
Bu seçenek curl'ün gönderdiği JSON verilerini gerçekten anlamasını veya bilmesini sağlamaz, ancak göndermeyi kolaylaştırır. curl gönderdiği verilere dokunmaz veya ayrıştırmaz, bu nedenle geçerli JSON olduğundan kendiniz emin olmanız gerekir.
Bir sunucuya temel bir JSON nesnesi gönderin:
curl --json '{"tool": "curl"}' https://example.com/
Yerel bir dosyadan JSON gönderin:
curl --json @json.txt https://example.com/
stdin üzerinden curl'e iletilen JSON gönderin:
echo '{"a":"b"}' | curl --json @- https://example.com/
Aynı komut satırında birden fazla --json seçeneği kullanabilirsiniz. Bu, curl'ün seçeneklerden gelen içerikleri birleştirmesini ve tüm verileri tek seferde sunucuya göndermesini sağlar. Birleştirmenin düz metin tabanlı olduğunu ve JSON nesnelerini JSON'a göre birleştirmediğini unutmayın.
Bir dosyadan JSON gönderin ve sonuna bir dize birleştirin:
curl --json @json.txt --json ', "end": "true"}' https://example.com/
Gönderilecek JSON oluşturma
JSON verilerinde kullanılan tırnak işaretleri bazen kabuklarda ve betiklerde yazmayı ve kullanmayı biraz zor ve hantal hale getirir.
Bu amaçla ayrı bir araç kullanmak işleri sizin için kolaylaştırabilir ve özellikle bunu başarmanıza yardımcı olabilecek bir araç jo'dur.
jo ve --json ile bir sunucuya temel bir JSON nesnesi gönderin
jo name=jo n=17 parser=false | curl --json @- https://example.com/
JSON alma
curl'ün kendisi, sunucu yanıtında JSON döndürdüğünde de dahil olmak üzere, gönderdiği veya aldığı içerikleri bilmez veya anlamaz.
JSON yanıtlarını ayrıştırmak veya güzel yazdırmak (pretty-print) amacıyla ayrı bir araç kullanmak işleri sizin için kolaylaştırabilir ve özellikle bunu başarmanıza yardımcı olabilecek bir araç jq'dur.
Bir sunucuya temel bir JSON nesnesi gönderin ve JSON yanıtını güzel yazdırın:
curl --json '{"tool": "curl"}' https://example.com/ | jq
JSON'u jo ile gönderin, yanıtı jq ile yazdırın:
jo name=jo n=17 | curl --json @- https://example.com/ | jq
jq, JSON içeriğini çıkarmak, filtrelemek ve yönetmek için sadece güzel yazdırmanın çok ötesine geçen güçlü ve yetenekli bir araçtır.
URL kodlanmış veri
Yüzde kodlaması (Percent-encoding), diğer adıyla URL kodlaması (URL encoding), teknik olarak verileri URL'lerde görünebilecek şekilde kodlamak için bir mekanizmadır. Bu kodlama tipik olarak application/x-www-form-urlencoded içerik türüyle POST gönderirken kullanılır; örneğin curl'ün --data ve --data-binary vb. ile gönderdikleri gibi.
Yukarıda belirtilen komut satırı seçeneklerinin tümü, uygun şekilde kodlanmış veriler sağlamanızı, verilerin zaten doğru biçimde var olduğundan emin olmanızı gerektirir. Bu size çok fazla özgürlük verirken, zaman zaman biraz zahmetli de olabilir.
Henüz kodlamadığınız verileri göndermenize yardımcı olmak için curl --data-urlencode seçeneğini sunar. Bu seçenek size verdiğiniz verileri URL kodlamak için birkaç farklı yol sunar.
Bunu diğer --data seçenekleriyle aynı tarzda --data-urlencode data şeklinde kullanırsınız. CGI uyumlu olması için, data kısmı bir ad, ardından bir ayırıcı ve içerik belirtimi ile başlamalıdır. data kısmı curl'e aşağıdaki sözdizimlerinden biri kullanılarak iletilebilir:
-
content: İçeriği URL kodlayın ve iletin. İçeriğin herhangi bir=veya@sembolü içermemesine dikkat edin, çünkü bu durumda sözdizimi aşağıdaki diğer durumlardan biriyle eşleşir. -
=content: İçeriği URL kodlayın ve iletin. Başlangıçtaki=sembolü veriye dahil edilmez. -
name=content: İçerik kısmını URL kodlayın ve iletin. Ad kısmının zaten URL kodlanmış olması beklendiğini unutmayın. -
@filename: Verilen dosyadan verileri yükleyin (yeni satırlar dahil), verileri URL kodlayın ve POST içinde iletin. -
name@filename: Verilen dosyadan verileri yükleyin (yeni satırlar dahil), verileri URL kodlayın ve POST içinde iletin. Ad kısmına bir eşittir işareti eklenir, sonuçname=urlencoded-file-contentolur. Adın zaten URL kodlanmış olmasının beklendiğini unutmayın.
Örnek olarak, bir adı curl tarafından kodlanmış olarak POST ile gönderebilirsiniz:
curl --data-urlencode "name=John Doe (Junior)" http://example.com
…bu, gerçek istek gövdesinde aşağıdaki verileri gönderir:
name=John%20Doe%20%28Junior%29
John Doe (Junior) dizesini contents.txt adlı bir dosyada saklarsanız, curl'e bu içeriği 'user' alan adını kullanarak URL kodlanmış olarak göndermesini şu şekilde söyleyebilirsiniz:
curl --data-urlencode user@contents.txt http://example.com
Yukarıdaki her iki örnekte de, alan adı URL kodlanmış değildir ancak olduğu gibi iletilir. Alan adını da URL kodlamak isterseniz, örneğin user name adlı bir alan adını iletmek isterseniz, curl'den tüm dizeyi başına bir eşittir işareti (gönderilmez) koyarak kodlamasını isteyebilirsiniz:
curl --data-urlencode "=user name=John Doe (Junior)" http://example.com
GET'e dönüştürme
Bu bağlamda bahsetmeye uygun olabilecek küçük bir kolaylık özelliği, farklı -d varyantlarıyla belirttiğiniz tüm verileri alan ve bu verileri girilen URL'ye örn. http://example.com bir '?' ile ayrılmış olarak ekleyen ve ardından curl'ün bunun yerine bir GET göndermesini sağlayan -G veya --get seçeneğidir.
Bu seçenek, örneğin bir formu POST gönderme ve GET gönderme arasında geçiş yapmayı kolaylaştırır.
URL'de bir sorgu olarak kodlanmış bir veri parçası ekleyen bir örnek:
curl -G --data-urlencode "name=daniel stenberg" https://example.com/
Expect 100-continue
HTTP/1'in devam eden bir transferi (herhangi bir yönde) durdurup yine de bağlantıyı sürdürmenin uygun bir yolu yoktur. Bu nedenle, transfer başladıktan sonra transferin durmasının daha iyi olacağını anlarsak, ilerlemenin sadece iki yolu vardır: bağlantıyı kesmek ve bir sonraki istek için bağlantıyı yeniden kurmanın bedelini ödemek veya transferi devam ettirip bant genişliğini boşa harcamak ancak bir dahaki sefere bağlantıyı yeniden kullanabilmek.
Bunun ne zaman olabileceğine dair bir örnek, HTTP üzerinden büyük bir dosya gönderdiğinizde, ancak sunucunun kimlik doğrulaması gerektirdiğini ve hemen bir 401 yanıt kodu geri gönderdiğini keşfetmenizdir.
Bu senaryoyu daha az sık hale getirmek için mevcut azaltma yöntemi, curl'ün ekstra bir başlık, Expect: 100-continue iletmesidir; bu, sunucuya çok fazla veri gönderilmeden önce isteği reddetme şansı verir. curl, yaptığı POST'un bir megabayttan büyük olduğu biliniyorsa veya şüpheleniliyorsa varsayılan olarak bu Expect: başlığını gönderir. curl bunu PUT istekleri için de yapar.
Bir sunucu 100-continue içeren bir istek aldığında ve isteği uygun bulduğunda, istemcinin devam etmesini sağlayan bir 100 yanıtıyla yanıt verir. Sunucu isteği beğenmezse, ne olduğunu düşündüğü hata için yanıt kodunu geri gönderir.
Maalesef, dünyadaki pek çok sunucu Expect: başlığını düzgün bir şekilde desteklemiyor veya doğru şekilde işlemiyor, bu yüzden curl yine de devam etmeden önce o ilk yanıt için sadece 1000 milisaniye bekler.
--expect100-timeout <saniye> kullanarak curl'ün Expect yanıtı için beklediği süreyi değiştirebilirsiniz. Başlığı kaldırmak için -H Expect: kullanarak beklemekten tamamen kaçınabilirsiniz:
curl -H Expect: -d "payload to send" http://example.com
Bazı durumlarda curl, göndermek üzere olduğu içerik küçükse (bir megabaytın altında) Expect başlığının kullanımını engeller, çünkü bu kadar küçük bir veri yığınını boşa harcamak çok büyük bir sorun olarak görülmez.
HTTP/2 ve sonrası
HTTP/2 ve HTTP'nin sonraki sürümleri, bağlantıyı kapatmadan devam eden bir transferi durdurabilir, bu da Expect: başlığını anlamsız kılar.
Parçalı (Chunked) kodlanmış POST'lar
Bir HTTP 1.1 sunucusuyla konuşurken, curl'e POST'un tam olarak ne kadar büyük olduğunu belirten bir Content-Length: başlığı olmadan istek gövdesini göndermesini söyleyebilirsiniz. curl'ün parçalı (chunked) Transfer-Encoding kullanmasında ısrar ederek, curl POST'u parça parça, her bir parça için boyutu da gönderen özel bir tarzda gönderir.
curl ile parçalı bir POST'u şu şekilde gönderirsiniz:
curl -H "Transfer-Encoding: chunked" -d @file http://example.com
Uyarılar (Caveats)
Bu, bunu bir HTTP/1.1 sunucusuna karşı yaptığınızı bildiğinizi varsayar. 1.1'den önce parçalı kodlama yoktu ve 1.1 sürümünden sonra parçalı kodlama kullanımdan kaldırıldı (deprecated).
Gizli form alanları
-d ile bir gönderi (post) göndermek, bir HTML formu doldurulduğunda ve gönderildiğinde bir tarayıcının yaptığının eşdeğeridir.
Bu tür formları göndermek curl ile yaygın bir işlemdir; etkili bir şekilde, curl'ün otomatik bir şekilde bir web formunu doldurmasını sağlamaktır.
Bir formu curl ile göndermek ve bir tarayıcı ile yapılmış gibi görünmesini sağlamak istiyorsanız, formdaki tüm giriş alanlarını sağlamak önemlidir. Web sayfaları için yaygın bir yöntem, forma birkaç gizli giriş alanı ayarlamak ve bunlara doğrudan HTML içinde değerler atamaktır. Başarılı bir form gönderimi elbette bu alanları da içerir ve bunu otomatik olarak yapmak için önce formu tutan HTML sayfasını indirmeniz, ayrıştırmanız ve gizli alan değerlerini çıkarmanız gerekebilir, böylece onları curl ile gönderebilirsiniz.
Bir tarayıcının ne gönderdiğini anlama
Yaygın bir kısayol, formu tarayıcınızla doldurup göndermek ve tarayıcının ağ geliştirme araçlarında tam olarak ne gönderdiğini kontrol etmektir.
Biraz farklı bir yol, formu içeren HTML sayfasını kaydetmek ve ardından o HTML sayfasını formun 'action=' kısmını kendi sunucunuza veya tam olarak ne aldığını çıktılayan bir test sunucusuna yönlendirecek şekilde düzenlemektir. O form gönderimini tamamlamak size bir tarayıcının onu tam olarak nasıl gönderdiğini gösterir.
Üçüncü bir seçenek, elbette, kablo üzerinden tam olarak neyin gönderildiğini kontrol etmek için Wireshark gibi bir ağ yakalama aracı kullanmaktır. HTTPS ile çalışıyorsanız, form gönderimlerini kablo üzerinde açık metin olarak göremezsiniz, bunun yerine Wireshark'ın TLS özel anahtarınızı tarayıcınızdan çıkarabilmesini sağlamanız gerekir. Bunu yapmayla ilgili ayrıntılar için SSLKEYLOGFILE bölümüne bakın.
JavaScript ve formlar
curl kullanan otomatik ajanlara veya betiklere karşı yaygın bir azaltma yöntemi, HTML formuna sahip sayfanın bazı giriş alanlarının değerlerini ayarlamak için JavaScript kullanmasını sağlamaktır, genellikle gizli olanlardan biri. Genellikle, sayfa yüklendiğinde veya gönder düğmesine basıldığında yürütülen ve sunucunun gönderimi geçerli saymadan önce doğrulayabileceği sihirli bir değer ayarlayan bir JavaScript kodu vardır.
Genellikle JavaScript kodunu okuyarak ve betiğinizde bu mantığı yeniden yaparak bunu aşabilirsiniz. Bir tarayıcının tam olarak ne gönderdiğini kontrol etmek için Bir tarayıcının ne gönderdiğini anlama bölümündeki hileleri kullanmak da iyi bir yardımdır.
Multipart form gönderileri
Multipart (çok parçalı) bir form gönderisi (multipart formpost), bir HTML formu enctype multipart/form-data olarak ayarlanmış şekilde gönderildiğinde bir HTTP istemcisinin gönderdiği şeydir. Bu, istek gövdesi MIME sınırlarıyla ayrılmış bir dizi parça olarak özel olarak biçimlendirilmiş şekilde gönderilen bir HTTP POST isteğidir.
Örnek bir HTML parçası şöyle görünür:
<form action="submit.cgi" method="post" enctype="multipart/form-data">
Name: <input type="text" name="person"><br>
File: <input type="file" name="secret"><br>
<input type="submit" value="Submit">
</form>
Bu, bir web tarayıcısında şuna benzer görünebilir:

Bir kullanıcı 'Name' alanına metin girebilir ve Browse düğmesine basarak Submit düğmesine basıldığında yüklenecek yerel bir dosya seçilebilir.
Böyle bir formu curl ile gönderme
curl ile, her ayrı multipart'ı bir -F (veya --form) bayrağıyla eklersiniz ve ardından forma göndermek istediğiniz her giriş alanı için bir -F ekleyerek devam edersiniz.
Yukarıdaki küçük örnek formun iki parçası vardır; biri düz metin alanı olan 'person' adında ve diğeri bir dosya olan 'secret' adında.
Verilerinizi o forma şöyle gönderin:
curl -F person=anonymous -F secret=@file.txt http://example.com/submit.cgi
Bunun oluşturduğu HTTP
action, POST'un nereye gönderildiğini belirtir. method, bunun bir POST olduğunu söyler ve enctype, bunun bir multipart form gönderisi olduğunu söyler.
Alanlar yukarıda gösterildiği gibi doldurulduğunda, curl example.com ana bilgisayarına şu HTTP istek başlıklarını oluşturur ve gönderir:
POST /submit.cgi HTTP/1.1
Host: example.com
User-Agent: curl/7.46.0
Accept: */*
Content-Length: 313
Expect: 100-continue
Content-Type: multipart/form-data; boundary=------------d74496d66958873e
Content-Length, elbette sunucuya ne kadar veri beklemesi gerektiğini söyler. Bu örneğin 313 baytı gerçekten küçüktür.
Expect başlığı Expect 100 continue bölümünde açıklanmıştır.
Content-Type başlığı biraz özeldir. Bunun bir multipart form gönderisi olduğunu söyler ve ardından sınır (boundary) dizesini ayarlar. Sınır dizesi, formun gönderilen farklı parçaları arasında ayırıcı görevi gören, içinde bir yerlerde bir sürü rastgele basamak bulunan bir karakter satırıdır. Bu örnekte gördüğünüz belirli sınır d74496d66958873e rastgele parçasına sahiptir ancak elbette curl çalıştırdığınızda (veya böyle bir formu bir tarayıcıyla gönderdiğinizde) farklı bir şey alırsınız.
Bu ilk başlık setinden sonra istek gövdesi gelir
--------------------------d74496d66958873e
Content-Disposition: form-data; name="person"
anonymous
--------------------------d74496d66958873e
Content-Disposition: form-data; name="secret"; filename="file.txt"
Content-Type: text/plain
contents of the file
--------------------------d74496d66958873e--
Burada gönderilen iki parçayı, sınır dizeleriyle ayrılmış olarak açıkça görürsünüz. Her parça, bireysel parçayı adı ve muhtemelen daha fazla ayrıntı ile tanımlayan bir veya daha fazla başlıkla başlar. Sonra parçanın başlıklarından sonra, herhangi bir kodlama olmadan parçanın gerçek verileri gelir.
Son sınır dizesinde bitişi işaret etmek için iki ekstra tire -- eklenmiştir.
Content-Type
curl'ün -F seçeneğiyle POST yapmak, yukarıdaki örnekte gösterildiği gibi isteğine varsayılan bir Content-Type başlığı eklemesini sağlar. Bu multipart/form-data der ve ardından MIME sınır dizesini belirtir. Bu Content-Type multipart form gönderileri için varsayılandır ancak elbette bunu kendi komutlarınız için yine de değiştirebilirsiniz ve yaparsanız, curl değiştirilen başlığa sınır sihirini yine de ekleyecek kadar zekidir. Sınır dizesini gerçekten değiştiremezsiniz, çünkü curl POST akışını üretmek için buna ihtiyaç duyar.
Başlığı değiştirmek için -H'yi şöyle kullanın:
curl -F 'name=Dan' -H 'Content-Type: multipart/magic' https://example.com
Bir web formunu dönüştürme
HTML'de görülen bir multipart formu göndermek için bir curl komut satırının nasıl yazılacağını bulmanın birkaç farklı yolu vardır.
-
HTML'yi yerel olarak kaydedin, seçilen bir port numarasını dinlemek için yerel olarak
ncçalıştırın, POST'u yerelncörneğinize göndermek içinactionURL'sini değiştirin. Formu gönderin venc'nin bunu nasıl gösterdiğini izleyin. Sonra bir curl komut satırına çevirin. -
Favori tarayıcınızdaki geliştirme araçlarını kullanın ve gönderdikten sonra ağ sekmesinde POST isteğini inceleyin. Sonra o HTTP verilerini bir curl komut satırına dönüştürün. Ne yazık ki, tarayıcılardaki curl olarak kopyala özelliği genellikle multipart form gönderilerini özellikle iyi yapmaz.
-
Kaynak HTML'yi inceleyin ve doğrudan ondan bir curl komut satırına dönüştürün.
<form>'dan -F'ye
enctype="multipart/form-data" kullanan bir <form>'da ilk adım, POST için hedefi söylediği için action= özelliğini bulmaktır. Bunu curl komut satırınız için tam bir URL'ye dönüştürmeniz gerekir.
Örnek bir action şöyle görünür:
<form action="submit.cgi" method="post" enctype="multipart/form-data">
Form örneğin https://example.com/user/login gibi bir URL'de barındırılan bir web sayfasında bulunuyorsa, action=submit.cgi formun kendisiyle aynı dizin içinde göreceli bir yoldur. Bu formu göndermek için tam URL böylece https://example.com/user/submit.cgi olur. Bu, curl komut satırında kullanılacak URL'dir.
Ardından, gizli olarak işaretlenmiş olanlar da dahil olmak üzere form içinde kullanılan her <input> etiketini tanımlamanız gerekir. Gizli, sadece web sayfasında gösterilmedikleri anlamına gelir, ancak yine de POST içinde gönderilmeleri gerekir.
Formdaki her <input> için komut satırında karşılık gelen bir -F olmalıdır.
metin girişi (text input)
Şu tarzdaki metin kullanan normal bir etiket
<input type="text" name="person">
alan adını şu şekilde içerikle ayarlamalıdır:
curl -F "person=Mr Smith" https://example.com/
dosya girişi (file input)
Giriş türü bir dosyaya ayarlandığında, şunun gibi:
<input type="file" name="image">
Dosya adını belirterek ve @ ve dahil edilecek dosyanın yolunu kullanarak bu parça için bir dosya sağlarsınız:
curl -F image=@funnycat.gif https://example.com/
gizli giriş (hidden input)
Bir formdan durum iletmek için yaygın bir teknik, bir dizi <input> etiketini type="hidden" olarak ayarlamaktır. Bu temelde zaten doldurulmuş bir form alanıyla aynı şeydir, bu nedenle bunu ad ve değeri kullanarak bir komut satırına dönüştürürsünüz. Örneğin:
<input type="hidden" name="username" value="bob123">
Bu normal metin alanı gibi dönüştürülür ve burada içeriğin ne olması gerektiğini bilirsiniz:
curl -F "username=bob123" https://example.com/
Tüm alanlar aynı anda
Yukarıdaki örneklerde gösterilen üç farklı <input> etiketinin aynı <form> içinde kullanıldığı fikriyle oynarsak, yukarıda çıkarılan doğru URL dahil olmak üzere gönderilecek tam bir curl komut satırı şuna benzer:
curl -F "person=Mr Smith" -F image=@funnycat.gif -F "username=bob123" \
https://example.com/user/submit.cgi
-d vs -F
Önceki bölümler normal POST ve multipart form gönderisi hakkında konuştu ve tipik komut satırlarınızda bunları -d veya -F ile yaparsınız.
Hangisini ne zaman kullanırsınız?
Yukarıda belirtilen bölümlerde açıklandığı gibi, bu seçeneklerin her ikisi de belirtilen verileri sunucuya gönderir. Fark, verilerin kablo üzerinden nasıl biçimlendirildiğindedir. Çoğu zaman, alıcı uç belirli bir biçimi bekleyecek şekilde yazılmıştır ve gönderenin verileri doğru şekilde biçimlendirip göndermesini bekler. Bir istemci kendi seçimine göre bir biçim seçemez.
HTML web formları
Tarayıcılar ve HTML'den bahsettiğimizde, standart yol kullanıcıya form doldurulduğunda verileri gönderen bir form sunmaktır. <form> etiketi bunlardan birinin web sayfasında görünmesini sağlayan şeydir. Etiket, tarayıcıya POST'unu nasıl biçimlendireceğini söyler. Form etiketi enctype=multipart/form-data içeriyorsa, bu tarayıcıya verileri curl'ün -F seçeneğiyle yaptığınız bir multipart form gönderisi olarak göndermesini söyler. Bu yöntem genellikle dosya yüklemeleri için form bir <input type=file> etiketi içerdiğinde kullanılır.
Formlar tarafından kullanılan ve varsayılan olduğu için HTML'de nadiren açıkça belirtilen varsayılan enctype, application/x-www-form-urlencoded'dir. Bu, tarayıcının girdiyi ad=değer çiftleri olarak URL kodlamasını ve verilerin güvenli olmayan karakterlerden kaçınmak için kodlanmasını sağlar. Buna sık sık normal POST deriz ve bunu curl'ün -d ve arkadaşlarıyla gerçekleştirirsiniz.
HTML dışında POST
POST normal bir HTTP yöntemidir ve HTML tarafından tetiklenmesi veya bir tarayıcı içermesi şartı yoktur. Pek çok hizmet, API ve diğer sistemler bugünlerde işleri halletmek için veri iletmenize izin verir.
Bu hizmetler düz ham veri veya belki JSON veya benzeri şekilde biçimlendirilmiş veri bekliyorsa, normal POST yaklaşımını istersiniz. curl'ün -d seçeneği verileri hiç değiştirmez veya kodlamaz, sadece tam olarak söylediğinizi gönderir. -d'nin varsayılan bir Content-Type: ayarladığına dikkat edin, bu istediğiniz şey olmayabilir.
HTTP PUT
PUT ve POST arasındaki fark incedir. Farklı yöntem dizeleri dışında hemen hemen aynı iletimlerdir. POST'un verileri uzak bir kaynağa iletmesi amaçlanırken, PUT'un o kaynağın yeni sürümü olması amaçlanır.
Bu açıdan PUT, diğer protokollerde bulunan eski güzel standart dosya yüklemesine benzer. Kaynağın yeni bir sürümünü PUT ile yüklersiniz. URL kaynağı tanımlar ve siz oraya koyulacak yerel dosyayı işaret edersiniz:
curl -T localfile http://example.com/new/resource/file
-T bir PUT anlamına gelir ve curl'e hangi dosyanın gönderileceğini söyler. POST ve PUT arasındaki benzerlikler, -d kullanan normal curl POST mekanizmasını kullanarak ancak bunun yerine bir PUT kullanmasını isteyerek bir dize (string) ile bir PUT göndermenize de olanak tanır:
curl -d "data to PUT" -X PUT http://example.com/new/resource/file
Yönlendirmeler (Redirects)
"Yönlendirme" (redirect), HTTP protokolünün temel bir parçasıdır. Kavram zaten 1996'da yayınlanan ilk spesifikasyonda (RFC 1945) mevcuttu ve belgelenmişti ve o zamandan beri iyi bir şekilde kullanılmaya devam etti.
Bir yönlendirme tam olarak kulağa geldiği gibidir. Sunucunun istemcinin istediği içeriği geri vermek yerine istemciye bir talimat göndermesidir. Sunucu, "istediğin o şey için şuraya bak" der.
Yönlendirmelerin hepsi aynı değildir. Yönlendirme kalıcı mı? İstemci bir sonraki istekte hangi istek yöntemini kullanmalı?
Tüm yönlendirmelerin ayrıca, istenmesi gereken yeni URI ile (mutlak veya göreceli olabilir) bir Location: başlığı geri göndermesi gerekir.
Kalıcı ve geçici
Yönlendirme kalıcı mı yoksa sadece şimdilik geçerli mi? Bir GET'in kullanıcıları kalıcı olarak başka bir GET ile B kaynağına yönlendirmesini istiyorsanız, bir 301 geri gönderin. Bu ayrıca kullanıcı aracısının (tarayıcınızın) bunu önbelleğe alması ve orijinal URI istendiğinde bundan sonra yeni URI'ye gitmeye devam etmesi gerektiği anlamına gelir.
Geçici alternatif 302'dir. Şu anda sunucu istemcinin B'ye bir GET isteği göndermesini istiyor ancak bunu önbelleğe almamalı, bir dahaki sefere yönlendirildiğinde orijinal URI'yi denemeye devam etmelidir.
Hem 301 hem de 302'nin tarayıcıların bir sonraki istekte bir GET yapmasını sağladığını unutmayın; bu, bir POST (ve sadece POST ise) ile başladıysa yöntemi değiştirmek anlamına gelebilir. 301 ve 302 yanıtları için HTTP yönteminin GET olarak değiştirilmesinin "tarihsel nedenlerle" olduğu söylenir ancak tarayıcıların yaptığı yine de budur, bu nedenle genel webin çoğu bu şekilde davranır.
Uygulamada, 303 kodu 302'ye benzer. Önbelleğe alınmaz ve istemcinin bir sonraki istekte bir GET vermesini sağlar. 302 ve 303 arasındaki farklar incedir, ancak 303 sadece bir yönlendirmeden ziyade orijinal isteğe "dolaylı bir yanıt" için daha fazla tasarlanmış gibi görünmektedir.
Bu üç kod, HTTP/1.0 spesifikasyonundaki tek yönlendirme kodlarıydı.
Ancak curl, hiçbir yönlendirmeyi hatırlamaz veya önbelleğe almaz, bu nedenle onun için kalıcı ve geçici yönlendirmeler arasında gerçekten hiçbir fark yoktur.
curl'e yönlendirmeleri izlemesini söyleyin
curl'ün aksi söylenmedikçe yalnızca temel olanı yapma geleneğinde, varsayılan olarak HTTP yönlendirmelerini takip etmez. Bunu yapmasını söylemek için -L, --location seçeneğini kullanın.
Yönlendirmeleri izleme etkinleştirildiğinde, curl varsayılan olarak 30'a kadar yönlendirmeyi izler. Sonsuz döngülere yakalanma riskini önlemek için çoğunlukla bir maksimum sınır vardır. 30 sizin için yeterli değilse, --max-redirs seçeneğiyle izlenecek maksimum yönlendirme sayısını değiştirebilirsiniz.
GET mi POST mu?
Bu yanıt kodlarının üçü de, 301 ve 302/303, istemcinin ilk istekte bir POST göndermiş olsa bile yeni URI'yi almak için bir GET gönderdiğini varsayar. Bu, en azından GET kullanmayan bir şey yapıyorsanız önemlidir.
Sunucu bunun yerine istemciyi yeni bir URI'ye yönlendirmek ve ikinci istekte ilkinde yaptığı gibi aynı yöntemi göndermesini istiyorsa, örneğin önce POST gönderdiyse bir sonraki istekte tekrar POST göndermesini istiyorsa, sunucu farklı yanıt kodları kullanır.
İstemciye "POST gönderdiğin URI kalıcı olarak B'ye yönlendirildi, POST'unu şimdi ve gelecekte oraya göndermelisin" demek için sunucu bir 308 ile yanıt verir. İşleri karmaşıklaştırmak gerekirse, 308 kodu yalnızca yakın zamanda tanımlanmıştır (spesifikasyon Haziran 2014'te yayınlandı), bu nedenle eski istemciler bunu doğru işlemeyebilir. Eğer öyleyse, sizin için kalan tek yanıt kodu şudur...
Bir müşteriye bir sonraki istekte de POST göndermesini, ancak geçici olarak söyleyen (eski) yanıt kodu 307'dir. Ancak bu yönlendirme istemci tarafından önbelleğe alınmaz, bu nedenle tekrar istenirse yine A'ya gönderir. 307 kodu HTTP/1.1'de tanıtıldı.
Ve, yönlendirmeler HTTP/2'de HTTP/1.1'de olduğu gibi aynı şekilde çalışır.
| Kalıcı | Geçici | |
|---|---|---|
| GET'e geçiş yap | 301 | 302 ve 303 |
| Orijinal yöntemi koru | 308 | 307 |
Yönlendirmelerde hangi yöntemin kullanılacağına karar verin
Dünyada orijinal URL'ye bir POST gönderilmesini isteyen, ancak 301, 302 veya 303 yanıt kodlarını kullanan HTTP yönlendirmeleriyle yanıt veren ve hala HTTP istemcisinin bir sonraki isteği bir POST olarak göndermesini isteyen web hizmetleri olduğu ortaya çıktı. Yukarıda açıklandığı gibi, tarayıcılar bunu yapmaz ve varsayılan olarak curl de yapmaz.
Bu kurulumlar var olduğundan ve aslında çok nadir olmadığından, curl davranışını değiştirmek için seçenekler sunar.
curl'e 30x yanıtından sonra GET olmayan istek yöntemini GET olarak değiştirmemesini, buna özel seçenekleri kullanarak söyleyebilirsiniz: --post301, --post302 ve --post303. Bunun yerine libcurl tabanlı bir uygulama yazıyorsanız, bu davranışı CURLOPT_POSTREDIR seçeneğiyle kontrol edersiniz.
Diğer ana bilgisayar adlarına yönlendirme
curl kullandığınızda belirli bir site için kullanıcı adı ve şifre gibi kimlik bilgileri sağlayabilirsiniz, ancak bir HTTP yönlendirmesi farklı bir ana bilgisayara taşınabileceğinden, curl aynı transfer içinde orijinalden başka ana bilgisayarlara gönderdiklerini sınırlar.
Kimlik bilgilerinin, orijinalle aynı olmasalar bile (muhtemelen onlara güvendiğiniz ve bunu yapmanın bir zararı olmadığını bildiğiniz için) aşağıdaki ana bilgisayar adlarına da gönderilmesini istiyorsanız, --location-trusted seçeneğini kullanarak curl'e bunun uygun olduğunu söyleyebilirsiniz.
HTTP olmayan yönlendirmeler
Tarayıcılar, yönlendirmeleri yapmak için bazen bir curl kullanıcısı için hayatı karmaşıklaştıran daha fazla yolu destekler, çünkü bu yöntemler curl tarafından desteklenmez veya tanınmaz.
HTML yönlendirmeleri
Yukarıdakiler yeterli değilse, web dünyası ayrıca tarayıcıları düz HTML ile yönlendirmek için bir yöntem sağlar. Aşağıdaki örnek <meta> etiketine bakın. Bu curl ile biraz karmaşıktır çünkü curl asla HTML'yi ayrıştırmaz ve bu nedenle bu tür yönlendirmeler hakkında hiçbir bilgisi yoktur.
<meta http-equiv="refresh" content="0; url=http://example.com/">
JavaScript yönlendirmeleri
Modern web JavaScript ile doludur ve bildiğiniz gibi, JavaScript, web sitelerini ziyaret ederken tarayıcıda kodun yürütülmesine izin veren bir dil ve tam bir çalışma zamanıdır.
JavaScript ayrıca tarayıcıya başka bir siteye geçmesi - isterseniz bir yönlendirme - talimatı vermesi için araçlar sağlar.
HTTP'nizi özelleştirme
Daha önce açıklandığı gibi, her HTTP transferi curl'ün bir istek göndermesiyle başlar. Bu istek bir istek satırından ve bir dizi istek başlığından oluşur ve bu bölüm bunları nasıl özelleştirebileceğinizi ayrıntılandırır.
- İstek yöntemi (Request method)
- İstek hedefi (Request target)
- Parça (Fragment)
- Başlıkları özelleştirme
- Referer
- User-agent
- Aralıklar (Ranges)
- Koşullular (Conditionals)
- Sıkıştırma (Compression)
Elbette, HTTP sürümünü değiştirmek isteği değiştirmenin başka bir yoludur.
İstek yöntemi (Request method)
Bir HTTP isteğinin ilk satırı yöntemi (method) içerir - bazen fiil (verb) olarak da adlandırılır. Bu komut satırının yapacağı gibi basit bir GET isteği yaparken:
curl http://example.com/file
…ilk istek satırı şöyle görünür:
GET /file HTTP/1.1
-X veya --request komut satırı seçeneklerini ve ardından gerçek yöntem adını kullanarak curl'e yöntemi başka bir şeye değiştirmesini söyleyebilirsiniz. Örneğin, GET yerine DELETE'i şöyle gönderebilirsiniz:
curl http://example.com/file -X DELETE
Bu komut satırı seçeneği yalnızca giden istekteki metni değiştirir, herhangi bir davranışı değiştirmez. Bu özellikle önemlidir; örneğin, curl'den -X ile bir HEAD göndermesini isterseniz, çünkü HEAD bir GET yanıtının alacağı tüm başlıkları göndermek ancak asla bir yanıt gövdesi göndermemek üzere belirtilmiştir (başlıklar aksi takdirde bir tane geleceğini ima etse bile). Bu nedenle, aksi takdirde bir GET yapacak olan bir komut satırına -X HEAD eklemek, curl'ün asılı kalmasına ve gelmeyen bir yanıt gövdesini beklemesine neden olur.
curl'den HTTP transferleri gerçekleştirmesini isterken, seçeneğe göre doğru yöntemi seçer, bu nedenle nadiren -X ile açıkça istemek zorunda kalırsınız. Ayrıca, curl -L ile istendiği gibi yönlendirmeleri izlediğinde, -X ile ayarlanan istek yönteminin sonraki yönlendirmelerde bile gönderildiğini belirtmek gerekir.
İstek hedefi (Request target)
http://example.com/file gibi bir giriş URL'si verildiğinde, URL'nin yol (path) bölümü çıkarılır ve HTTP istek satırında /file haline getirilir. Protokoldeki bu öğeye HTTP'de istek hedefi (request target) denir. Bu, bu isteğin etkileşime girdiği kaynaktır. Normalde bu istek hedefi URL'den çıkarılır ve ardından istekte kullanılır ve bir kullanıcı olarak bunu düşünmenize gerek yoktur.
Bazı nadir durumlarda, kullanıcı yaratıcı olmak ve bu istek hedefini URL'nin gerçekten izin vermediği şekillerde değiştirmek isteyebilir. Örneğin, HTTP OPTIONS yönteminin belirli bir yol için değil sunucu ile ilgili sihir için özel olarak tanımlanmış bir istek hedefi vardır ve bunun için * kullanır. Evet, tek bir yıldız işareti. Bunu için bir URL belirtmenin bir yolu yoktur, yani OPTIONS gibi bir sunucuya istek hedefinde tek bir yıldız işareti iletmek istiyorsanız, bunu şöyle yapmanız gerekir:
curl -X OPTIONS --request-target "*" http://example.com/
Bu örnek komut satırı, giden HTTP isteğinin ilk satırının şöyle görünmesini sağlar:
OPTIONS * HTTP/1.1
--path-as-is
URL'nin yol kısmı, ana bilgisayar adından sonraki ilk eğik çizgiyle başlayan ve URL'nin sonunda veya bir '?' veya '#' işaretinde (kabaca konuşursak) biten kısımdır.
Yolun içine /../ veya /./ içeren alt dizeler eklerseniz, curl, standartlar ve bu tür dizelerin yerel dosya sistemlerinde çalışma eğilimi tarafından dikte edildiği gibi, yol sunucuya gönderilmeden önce bunları otomatik olarak ezer (düzenler). /../ dizisi önceki bölümü kaldırır, böylece /hello/sir/../ sadece /hello/ ile biter ve /./ basitçe kaldırılır, böylece /hello/./sir/ /hello/sir/ olur.
Sunucuya gönderilmeden önce curl'ün bu sihirli dizileri ezmesini önlemek ve böylece geçmelerine izin vermek için --path-as-is seçeneği mevcuttur.
Sunucuyu /etc/passwd dosyasını teslim etmesi için kandırmaya yönelik (beceriksizce) bir girişim:
curl --path-as-is https://example.com/../../etc/passwd
Parça (Fragment)
Bir URL, URL'nin sonunda bir kare (diez) işareti ve dize ile yazılan, parça (fragment) olarak da bilinen bir çapa (anchor) içerebilir. Örneğin http://example.com/foo.html#here-it-is gibi. O parça kısmı, kare/diez işaretinden URL'nin sonuna kadar olan her şey, yalnızca yerel kullanım içindir ve ağ üzerinden gönderilmez. curl bu veriyi basitçe kesip atar.
Bir aralık hilesi
Parçanın kablo üzerinden gönderilmediği gerçeğinden yararlanmanın pratik bir yolu, aynı URL'yi komut satırında birçok kez kullanmak istiyorsanız bu alanı aralıklar için kullanmaktır.
Örneğin, bu URL'yi yirmi kez indirin:
curl "https://example.com/#[1-20]"
Başlıkları özelleştirme
Bir HTTP isteğinde, ilk istek satırından sonra tipik olarak bir dizi istek başlığı gelir. Bu, başlıkları izleyen istek gövdesinden (bazen boştur) ayıran boş bir satırla biten bir ad: değer (name: value) çiftleri kümesidir.
curl, isteklerde kendi adına Host:, Accept:, User-Agent: gibi varsayılan birkaç başlığı ve kullanıcının curl'den ne yapmasını istediğine bağlı olabilecek diğer birkaç başlığı iletir.
curl tarafından ayarlanan tüm başlıklar kullanıcı tarafından değiştirilebilir. O zaman curl'ün -H veya --header seçeneğine kullanılacak yeni başlığı söylersiniz ve başlık alanı o başlıklardan biriyle eşleşirse dahili olanı değiştirir veya belirtilen başlığı istekte gönderilecek başlıklar listesine ekler.
Host: başlığını değiştirmek için şunu yapın:
curl -H "Host: test.example" http://example.com/
Bir Elevator: floor-9 başlığı eklemek için şunu yapın:
curl -H "Elevator: floor-9" http://example.com/
Dahili olarak oluşturulan bir başlığı silmek istiyorsanız, onu curl'e bir değer olmadan, iki nokta üst üstenin sağ tarafında hiçbir şey olmadan verin.
User-Agent: başlığını kapatmak için şunu yapın:
curl -H "User-Agent:" http://example.com/
Son olarak, eğer gerçekten iki nokta üst üstenin sağ tarafında içerik olmayan bir başlık eklemek istiyorsanız (ki bu nadir bir durumdur), bunun için sihirli işaretleyici, başlık alanı adını bunun yerine bir noktalı virgül ile bitirmektir. Şunun gibi:
curl -H "Empty;" http://example.com
Referer
Bir kullanıcı bir web sayfasındaki bir bağlantıya tıkladığında ve tarayıcı kullanıcıyı bir sonraki URL'ye götürdüğünde, yeni URL'ye nereden geldiğini söyleyen bir Referer: başlığı gönderir. Bu referer başlığıdır. Referer: yanlış yazılmıştır (İngilizcede doğrusu Referrer'dır) ancak olması gereken şekli budur.
curl ile referer başlığını -e veya --referer ile şu şekilde ayarlarsınız:
curl --referer http://comes-from.example.com https://www.example.com/
User-agent
User-Agent, her istemcinin sunucuya hangi kullanıcı aracısı olduğunu bildirmek için istekte ayarlayabileceği bir başlıktır . Bazen sunucular bu başlığa bakar ve içeriğine göre nasıl davranacaklarını belirler.
Varsayılan başlık değeri 'curl/[sürüm]'dür; curl sürüm 7.54.1 için User-Agent: curl/7.54.1 gibi.
-A veya --user-agent seçeneğini artı kullanılacak dizeyi kullanarak veya sadece bir başlık olduğu için -H "User-Agent: foobar/2000" kullanarak istediğiniz herhangi bir değeri ayarlayabilirsiniz.
Karşılaştırma olarak, bir Linux makinesindeki Firefox'un test sürümü bir zamanlar şu User-Agent başlığını gönderdi:
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:58.0) Gecko/20100101 Firefox/58.0
Aralıklar (Ranges)
Ya istemci uzak bir kaynaktan yalnızca ilk 200 baytı veya ortada bir yerde 300 baytı istiyorsa? HTTP protokolü, bir istemcinin yalnızca belirli bir veri aralığını istemesine izin verir. İstemci sunucudan bir başlangıç ofseti ve bir bitiş ofseti ile belirli aralığı ister. Hatta şeyleri birleştirebilir ve sadece bir sürü parçayı yan yana listeleyerek aynı istekte birkaç aralık isteyebilir. Bir sunucu böyle bir talebi yanıtlamak için birden fazla bağımsız parça geri gönderdiğinde, bunları mime sınır dizeleriyle ayrılmış olarak alırsınız ve buna göre işlemek kullanıcı uygulamasına bağlıdır. curl böyle bir yanıtı daha fazla ayırmaz.
Ancak, bir bayt aralığı sunucuya yalnızca bir istektir. İsteğe saygı duymak zorunda değildir ve sunucunun içeriği istendiğinde anında otomatik olarak oluşturduğu durumlar gibi birçok durumda, bunu yapmayı reddeder ve bunun yerine tam içeriği yanıtlar.
curl'ün -r veya --range ile bir aralık istemesini sağlayabilirsiniz. Bir şeyin ilk 200 baytını istiyorsanız:
curl -r 0-199 http://example.com
Veya 200. indisten başlayan dosyadaki her şeyi:
curl -r 200- http://example.com
İndeks 0'dan 200 bayt ve indeks 1000'den 200 bayt alın:
curl -r 0-199,1000-1199 http://example.com/
Koşullular (Conditionals)
Bazen kullanıcılar, aynı dosya belki bir gün önce zaten indirilmişse, bir dosyayı tekrar indirmekten kaçınmak isterler. Bu, HTTP transferini bir şeye koşullandırarak yapılabilir. curl iki farklı koşulu destekler: dosya zaman damgası ve etag.
Değiştirilme tarihine göre kontrol et
Dosyayı -z veya --time-cond seçeneğiyle yalnızca belirli bir tarihten daha yeniyse indirin:
curl -z "Jan 10, 2017" https://example.com/file -O
Veya tam tersi, tarihin başına bir tire koyarak dosyayı yalnızca belirli bir zamandan daha eskiyse alın:
curl --time-cond "-Jan 10, 2017" https://example.com/file -O
Tarih ayrıştırıcısı liberaldir ve tarihi yazabileceğiniz çoğu biçimi kabul eder ve ayrıca bir saat ile tam olarak belirtebilirsiniz:
curl --time-cond "Sun, 12 Sep 2004 15:05:58 -0700" \
https://www.example.org/file.html
-z seçeneği ayrıca yerel bir dosyadan zaman damgasını çıkarabilir ve kullanabilir, bu da bir dosyayı yalnızca uzaktan güncellenmişse indirmek için kullanışlıdır:
curl -z file.html https://example.com/file.html -O
-z kullanımını yerel olarak oluşturulan dosyanın zamanını uzak dosyanın sahip olduğu zaman damgasıyla aynı zamana ayarlayan --remote-time bayrağıyla birleştirmek genellikle yararlıdır:
curl -z file.html -o file.html --remote-time https://example.com/file.html
İçeriğin değiştirilmesine göre kontrol et
HTTP sunucuları, belirli bir kaynak sürümü için belirli bir ETag döndürebilir. Belirli bir URL'deki kaynak değişirse, yeni bir Etag değeri oluşturulmalıdır, böylece bir istemci ETag aynı kaldığı sürece içeriğin değişmediğini bilir.
ETag'leri kullanarak curl, zamanlara veya dosya tarihlerine güvenmek zorunda kalmadan uzaktan güncellemeleri kontrol edebilir. Bu ayrıca kontrolün saniye altı değişiklikleri algılamasını da sağlar ki zaman damgası tabanlı kontroller bunu yapamaz.
curl kullanarak uzak bir dosyayı indirebilir ve ETag'ini (eğer sağlıyorsa), --etag-save komut satırı seçeneğini kullanarak ayrı bir önbelleğe kaydedebilirsiniz. Şunun gibi:
curl --etag-save etag.txt https://example.com/file -o output
Daha sonraki bir komut satırı, daha önce kaydedilmiş bu etag'i kullanabilir ve dosyayı yalnızca değişmişse tekrar indirdiğinden emin olabilir, şöyle:
curl --etag-compare etag.txt https://example.com/file -o output
İki etag seçeneği aynı komut satırında da birleştirilebilir, böylece dosya gerçekten güncellendiyse curl güncelleme ETag'ini dosyaya tekrar kaydeder:
curl --etag-compare etag.txt --etag-save etag.txt \
https://example.com/file -o output
Sıkıştırma (Compression)
curl, HTTP ve HTTPS sunucularından verilerin sıkıştırılmış sürümlerini sağlamasını ve ardından varışta otomatik olarak açılmasını istemeyi destekler. Bant genişliğinin CPU'dan daha sınırlı olduğu durumlarda bu, daha fazla veriyi daha kısa sürede almanıza yardımcı olur.
HTTP sıkıştırması iki farklı mekanizma kullanılarak yapılabilir; biri "Doğru Yol" olarak kabul edilebilecek, diğeri ise herkesin aslında kullandığı ve bunu yapmanın yaygın ve popüler yolu olandır. HTTP içeriğini sıkıştırmanın yaygın yolu Content-Encoding başlığını kullanmaktır. curl'den bunu --compressed seçeneğiyle kullanmasını istersiniz:
curl --compressed http://example.com/
Bu seçenek etkinleştirildiğinde (ve sunucu destekliyorsa), verileri sıkıştırılmış bir şekilde teslim eder ve curl kaydetmeden veya stdout'a göndermeden önce açar. Bu genellikle bir kullanıcı olarak, daha hızlı bir transfer fark etmek dışında sıkıştırmayı gerçekten görmediğiniz veya deneyimlemediğiniz anlamına gelir.
--compressed seçeneği, desteklenen sıkıştırma algoritmalarından birini kullanarak Content-Encoding sıkıştırması ister. Ayrıca, bu otomatik yöntem için oluşturulan ancak hiçbir zaman gerçekten yaygın olarak benimsenmeyen istek başlığı olan nadir Transfer-Encoding yöntemi de vardır. curl'e --tr-encoding ile Transfer-Encoded sıkıştırma istemesini söyleyebilirsiniz:
curl --tr-encoding http://example.com/
Teoride, aynı komut satırında ikisini de kullanmanızı engelleyen hiçbir şey yoktur, ancak pratikte, iki farklı şekilde sıkıştırma istendiğinde bazı sunucuların kafasının biraz karıştığını deneyimleyebilirsiniz. Genellikle sadece birini seçmek daha güvenlidir.
HTTP başlıkları
HTTP/1.x başlıkları sıkıştırılamaz. Öte yandan HTTP/2 ve HTTP/3 başlıkları her zaman sıkıştırılır ve sıkıştırılmamış olarak gönderilemez. Ancak, kullanıcılara bir kolaylık olarak, curl, çıktıyı ve görünümü tutarlı hale getirmek için başlıkları her zaman HTTP/1.x için göründükleri stile benzer bir tarzda sıkıştırılmamış olarak gösterir.
HTTP yüklemeleri (HTTP uploads)
POST veya PUT ile HTTP yüklemeleri için sıkıştırma yapmanın standart bir yolu yoktur. Yukarıda belirtilen HTTP sıkıştırma yöntemleri yalnızca indirmeler için çalışır.
Elbette verileri sunucuya göndermeden önce yerel olarak sıkıştırabilirsiniz.
Çerezler (Cookies)
HTTP çerezleri, bir istemcinin bir sunucu adına sakladığı anahtar/değer çiftleridir. Sonraki isteklerde, istemcilerin istekler arasında durumu korumasını sağlamak için geri gönderilirler. HTTP protokolünün kendisinin bir durumu olmadığını, bunun yerine istemcinin sunucunun haberdar olmasını istediği sonraki isteklerde tüm verileri yeniden göndermesi gerektiğini unutmayın.
Çerezler, sunucu tarafından Set-Cookie: başlığı ile ayarlanır ve sunucu her çerezle birlikte istemcinin çerezi geri göndermesi için eşleşmesi gereken bir dizi ek özellik gönderir. Alan adı ve yol gibi ve belki de en önemlisi çerezin ne kadar süre yaşayacağı gibi.
Bir çerezin süresi ya gelecekte belirli bir zamana (veya belirli bir saniye sayısı kadar yaşayacak şekilde) ayarlanır ya da hiç süre almaz. Süresi olmayan bir çereze oturum çerezi denir ve oturum (session) boyunca yaşaması amaçlanır, ancak daha uzun değil. Bu açıdan bir oturum, tipik olarak bir siteyi görüntülemek için kullanılan tarayıcının ömrü olarak düşünülür. Tarayıcıyı kapattığınızda oturumunuzu sonlandırırsınız. Çerezleri destekleyen bir komut satırı istemcisiyle HTTP işlemleri yapmak, bir oturumun gerçekte ne zaman sona erdiği sorusunu akla getirir...
- Çerez motoru
- Çerezleri dosyadan okuma
- Çerezleri dosyaya yazma
- Yeni çerez oturumu
- Çerez dosya formatı
Çerez motoru
curl'ün aksi söylenmedikçe yalnızca asgariyi yapma genel kavramı, varsayılan olarak çerezleri tanımasını engeller. curl'ün aldığı çerezleri takip etmesini ve ardından eşleşen çerezlere sahip isteklerde bunları göndermesini sağlamak için çerez motorunu açmanız gerekir.
Çerez motorunu curl'den çerez okumasını veya yazmasını isteyerek etkinleştirirsiniz. curl'e boş isimli dosyadan çerez okumasını söylerseniz, yalnızca motoru açarsınız ancak boş bir dahili çerez deposuyla başlarsınız:
curl -b "" http://example.com
Sadece çerez motorunu açmak, tek bir kaynak almak ve ardından çıkmak anlamsız olurdu çünkü curl'ün aldığı herhangi bir çerezi gerçekten gönderme şansı olmazdı. Bu örnekteki sitenin çerezleri ayarlayacağını ve ardından bir yönlendirme yapacağını varsayarsak şunu yapardık:
curl -L -b "" http://example.com
Çerezleri dosyadan okuma
Boş bir çerez deposuyla başlamak istenmeyebilir. Neden önceki bir getirme işleminde sakladığınız veya başka bir şekilde edindiğiniz çerezlerle başlamayasınız? curl'ün çerezler için kullandığı dosya formatına Netscape çerez formatı denir çünkü bir zamanlar tarayıcılar tarafından kullanılan dosya formatıydı ve o zamanlar curl'e tarayıcının çerezlerini kullanmasını kolayca söyleyebilirdiniz.
Bir kolaylık olarak, curl ayrıca bir çerez dosyasının çerezleri ayarlayan bir HTTP başlıkları kümesi olmasını da destekler. Bu daha düşük bir formattır ancak sahip olduğunuz tek şey olabilir.
curl'e ilk çerezleri hangi dosyadan okuyacağını söyleyin:
curl -L -b cookies.txt http://example.com
Bunun dosyadan yalnızca okuduğunu unutmayın. Sunucu yanıtında çerezleri güncellerse, curl bu çerezi bellek içi deposunda günceller ancak çıktığında hepsini atar ve aynı giriş dosyasının sonraki çağrısı orijinal çerez içeriğini tekrar kullanır.
Çerezleri dosyaya yazma
Çerezlerin saklandığı yer bazen çerez kavanozu (cookie jar) olarak adlandırılır. curl'de çerez motorunu etkinleştirdiğinizde ve çerezleri aldığında, curl'e çıkmadan önce bilinen tüm çerezlerini bir dosyaya, çerez kavanozuna yazmasını söyleyebilirsiniz. curl'ün verilen girişin işlenmesi ne kadar sürerse sürsün, çıktı çerez kavanozunu kullanım ömrü boyunca değil, yalnızca çıkışta güncellediğini unutmamak önemlidir.
Çerez kavanozu çıktısını -c ile belirtirsiniz:
curl -c cookie-jar.txt http://example.com
-c çerezleri bir dosyaya yazma talimatıdır, -b çerezleri bir dosyadan okuma talimatıdır. Genellikle her ikisini de istersiniz.
curl çerezleri bu dosyaya yazdığında, oturum çerezleri (belirli bir yaşam süresi olmayanlar) dahil bilinen tüm çerezleri kaydeder. curl'ün kendisinin bir oturum kavramı yoktur ve bir oturumun ne zaman bittiğini bilmez, bu nedenle siz ona söylemedikçe oturum çerezlerini temizlemez.
Yeni çerez oturumu
Sunucu tarafından ayarlanan bir çerez, yalnızca oturum (session) sürdüğü sürece saklanması amaçlanan bir oturum çerezi olabilir. curl bir oturumun ne kadar sürdüğü veya ne zaman bittiği hakkında hiçbir fikre sahip değildir.
curl'e bir oturumun ne zaman bittiğini söylemek yerine, curl kullanıcının yeni bir oturumun ne zaman başlayacağına karar vermesini sağlayan bir seçeneğe sahiptir.
Yeni bir çerez oturumu, tüm eski oturum çerezlerinin atılması anlamına gelir. Bu, bir tarayıcıyı kapatıp yeniden başlatmanın eşdeğeridir.
curl'e yeni bir çerez oturumunun başladığını -j, --junk-session-cookies kullanarak söyleyin:
curl -j -b cookies.txt http://example.com/
Çerez dosya formatı
Netscape bir zamanlar çerezleri diskte saklamak için bir dosya formatı oluşturdu, böylece tarayıcı yeniden başlatmalarında hayatta kalabilirlerdi. curl, çerezleri tarayıcılarla paylaşmaya izin vermek için bu dosya formatını benimsedi, ancak kısa süre sonra tarayıcıların bu formattan uzaklaşmasını izledi. Modern tarayıcılar artık onu kullanmıyor, ancak curl hala kullanıyor.
Netscape çerez dosya formatı, dosyadaki her fiziksel satırda bir çerez saklar ve her alan TAB ile ayrılmış bir dizi ilişkili meta veriye sahiptir. Bu dosyaya curl terminolojisinde çerez kavanozu (cookiejar) denir.
libcurl bir çerez kavanozu kaydettiğinde, bu belgenin web sürümüne bağlanan bir URL bahsinin bulunduğu kendi dosya başlığını oluşturur.
Dosya formatı
Çerez dosya formatı metin tabanlıdır ve her satırda bir çerez depolar. # ile başlayan satırlar yorum olarak kabul edilir.
Tek bir çerezi belirten her satır, TAB karakterleriyle (ASCII sekizlisi 9) ayrılmış yedi metin alanından oluşur. Geçerli bir satır yeni satır karakteriyle bitmelidir.
Dosyadaki alanlar
Alan numarası, hangi tür ve örnek veri ve anlamı:
- dize
example.com- alan adı - boolean
FALSE- alt alan adlarını dahil et - dize
/foobar/- yol - boolean
TRUE- yalnızca HTTPS üzerinden gönder/al - sayı
1462299217- sona erme zamanı - 1 Ocak 1970'ten bu yana saniye veya 0 - dize
person- çerezin adı - dize
daniel- çerezin değeri
HTTPS
HTTPS aslında Güvenli HTTP'dir (Secure HTTP). Güvenli kısım, TCP taşıma katmanının TLS kullanımıyla kimlik doğrulama, gizlilik (şifreleme) ve veri bütünlüğü sağlamak üzere geliştirildiği anlamına gelir.
Bir HTTPS transferinde TLS ayrıntılarının nasıl değiştirileceği ve ayarlanacağı hakkında derinlemesine bilgi için TLS Kullanımı bölümüne bakın.
HSTS
HTTPS'in otomatik kullanımı.
HTTP Strict Transport Security, HSTS, HTTPS sunucularını protokol düşürme (downgrade) saldırıları ve çerez ele geçirme (cookie hijacking) gibi ortadaki adam saldırılarına karşı korumaya yardımcı olan bir protokol mekanizmasıdır. Bir HTTPS sunucusunun, istemcilerin bundan sonra bu ana bilgisayar adıyla otomatik olarak yalnızca HTTPS bağlantılarını kullanarak etkileşime girmesi gerektiğini - ve açıkça onunla düz metin protokolleri kullanmamasını - beyan etmesini sağlar.
HSTS önbelleği
Belirli bir sunucu adı için HSTS durumu bir yanıt başlığında ayarlanır ve bir sona erme süresi vardır. Her HSTS ana bilgisayar adı için durumun, curl'ün onu alması ve durumu ve sona erme süresini güncellemesi için bir dosyaya kaydedilmesi gerekir.
curl'ü çağırın ve ona hsts önbelleği olarak hangi dosyayı kullanacağını söyleyin:
curl --hsts hsts.txt https://example.com
curl, hsts bilgisini yalnızca başlık güvenli bir transfer üzerinden okunduğunda günceller, yani düz metin protokolü üzerinden yapıldığında değil.
Güvenli olmayan protokolleri güncellemek için HSTS kullanın
Önbellek dosyası şimdi verilen ana bilgisayar adı için bir giriş içeriyorsa, güvenli olmayan bir protokolle bağlanmaya çalışsanız bile otomatik olarak güvenli bir protokole geçer:
curl --hsts hsts.txt http://example.com
Alternatif Hizmetler (Alternative Services)
RFC 7838, bir sunucunun, Alt-Svc: yanıt başlığını kullanarak bir istemciye o sunucu için başka bir yerde bir veya daha fazla alternatif olduğunu söylemesini sağlayan bir HTTP başlığı tanımlar.
Sunucunun önerdiği alternatifler, aynı ana bilgisayarda başka bir bağlantı noktasında, tamamen farklı bir ana bilgisayar adında çalışan bir sunucuyu içerebilir ve hatta belki hizmeti başka bir protokol üzerinden sunabilir.
Etkinleştirme
curl'ün sunulan alternatifleri dikkate almasını sağlamak için, curl'e şunun gibi belirli bir alt-svc önbellek dosyası kullanmasını söyleyin:
curl --alt-svc altcache.txt https://example.com/
o zaman curl başlangıçta mevcut alternatif hizmet girişlerini dosyadan yükler ve HTTP istekleri yaparken bunları dikkate alır ve sunucular yeni veya güncellenmiş Alt-Svc: başlıkları gönderirse, curl bunları çıkışta önbelleğe kaydeder.
alt-svc önbelleği
alt-svc önbelleği bir çerez kavanozuna benzer. Satır başına bir alternatif depolayan metin tabanlı bir dosyadır ve her girişi o belirli alternatifin geçerli olduğu süre için bir sona erme zamanına da sahiptir.
Yalnızca HTTPS
Alt-Svc:, yalnızca HTTPS üzerinden bağlanıldığında sunuculardan güvenilir ve ayrıştırılır.
HTTP/3
Alt-Svc: başlıklarının kullanımı, Ağustos 2019 itibarıyla bir istemci ve sunucuyu HTTP/3 kullanmaya önyüklemenin (bootstrap) tek tanımlı yoludur. Sunucu daha sonra HTTP/1 veya HTTP/2 üzerinden istemciye HTTP/3 üzerinden de kullanılabilir olduğunu ima eder ve ardından alt-svc önbelleği öyle söylüyorsa curl sonraki istekte HTTP/3 kullanarak ona bağlanabilir.
Tarayıcı benzeri görevleri senaryolaştırma (Scripting browser-like tasks)
curl, favori tarayıcınızın yapabileceği hemen hemen her HTTP işlemini ve transferini yapabilir. Aslında bundan çok daha fazlasını da yapabilir, ancak bu bölümde curl'ü aksi takdirde bir tarayıcıyla manuel olarak yapmanız gerekenleri yeniden üretmek veya senaryolaştırmak için kullanabileceğiniz gerçeğine odaklanıyoruz.
İşte bunu yaparken nasıl ilerleyeceğiniz konusunda bazı püf noktaları ve tavsiyeler.
Tarayıcının ne yaptığını anlayın
Bu gerçekten gerekli bir ilk adımdır. Ne yaptığını tahmin etmeye çalışmak, yanlış sorun bataklığında kaybolma riskini taşır. Bu soruna bilimsel yaklaşım, öncelikle tarayıcının ne yaptığını anlamanızı gerektirir.
Tarayıcının belirli bir görevi yerine getirmek için ne yaptığını öğrenmek için, üzerinde çalıştığınız HTML sayfalarını okuyabilirsiniz ve yeterince derin bir bilgiyle, bir tarayıcının bunu başarmak için ne yapacağını görebilir ve ardından aynısını curl ile yapmaya çalışabilirsiniz.
Sayfanın gizlenmiş JavaScript ile dolu olduğu durumlarda bile çalışan biraz daha etkili yol, tarayıcıyı çalıştırmak ve hangi HTTP işlemlerini gerçekleştirdiğini izlemektir.
Curl olarak kopyala bölümü, bir tarayıcının isteğini nasıl kaydedebileceğinizi ve bunu kolayca bir curl komut satırına nasıl dönüştürebileceğinizi açıklar.
Kopyalanan curl komut satırları genellikle tam olarak o isteği kopyalama eğiliminde olduklarından yeterince iyi değildir; oysa muhtemelen aynı işlemi yeniden üretebilmek ve sadece kelimesi kelimesine isteği yeniden göndermemek için biraz daha dinamik olmak istersiniz.
Çerezler (Cookies)
Bugün web'in çoğu bir yerlerde bir kullanıcı adı ve şifre giriş istemiyle çalışır. Çoğu durumda, bir süre önce tarayıcınızla giriş yapmışsınızdır ancak o durumu korumuş ve sizi giriş yapmış durumda tutmuştur.
Giriş yapmış durumu neredeyse her zaman çerezler kullanılarak yapılır. Yaygın bir işlem, önce giriş yapmak ve dönen çerezleri bir dosyaya kaydetmek ve ardından siteyi curl ile dolaşırken sitenin sonraki komut satırlarında çerezleri güncellemesine izin vermektir.
Web girişleri ve oturumları
https://example.com/ sitesi bir giriş istemi içerir. Web sitesindeki giriş, bir HTTP POST gönderdiğiniz bir HTML formudur. Yanıt çerezlerini ve yanıt (HTML) çıktısını kaydedin.
Giriş sayfası (bir tarayıcı kullansaydınız) https://example.com/ üzerinde görünür olsa da, o sayfadaki HTML form etiketi action parametresini kullanarak POST'u tam olarak hangi URL'ye göndereceğiniz konusunda sizi bilgilendirir.
Hayali durumumuzda, form etiketi şöyle görünür:
<form action="login.cgi" method="POST">
<input type="text" name="user">
<input type="password" name="secret">
<input type="hidden" name="id" value="bc76">
</form>
Önemli üç alan vardır. user, secret ve id. Sonuncusu, id, hidden (gizli) olarak işaretlenmiştir; bu, tarayıcıda görünmediği ve bir kullanıcının doldurduğu bir alan olmadığı anlamına gelir. Site tarafından oluşturulur ve curl girişinizin başarılı olması için o değeri çıkarmanız ve verilerin geri kalanıyla birlikte POST gönderiminizde kullanmanız gerekir.
Doğru içerikleri alanlara ve doğru hedef URL'ye gönderin:
curl -d user=daniel -d secret=qwerty -d id=bc76 \
https://example.com/login.cgi -o out
Birçok giriş sayfası, girişi sunarken size zaten bir oturum çerezi gönderir ve zaten genellikle <form> etiketinden gizli alanları çıkarmanız gerektiğinden, önce şuna benzer bir şey yapabilirsiniz:
curl -c cookies https://example.com/ -o loginform
Genellikle oradan id alanını çıkarmak için bir HTML ayrıştırıcısına veya bir betik diline ihtiyacınız olur ve ardından yukarıda belirtildiği gibi ancak eklenen çerez yüklemesi ile devam edip giriş yapabilirsiniz (daha okunabilir hale getirmek için satırı iki satıra bölüyorum):
curl -d user=daniel -d secret=qwerty -d id=bc76 \
https://example.com/login.cgi -b cookies -c cookies -o out
Hem dosyadan çerez okumak için -b'yi hem de çerezleri tekrar saklamak için (sunucu güncellenmiş çerezler geri gönderdiğinde) -c'yi kullandığını görebilirsiniz.
Ayrıntıları çözerken komut satırlarına her zaman, her zaman -v ekleyin. Bununla ilgili daha fazla ayrıntı için ayrıntılı bölümüne de bakın.
Yönlendirmeler (Redirects)
Sunucuların bir giriş POST'una yanıt verirken yönlendirmeler kullanması yaygındır. O kadar yaygındır ki, muhtemelen bir yönlendirme ile çözülmediği durumların nadir olduğunu söyleyebilirim.
O zaman sadece curl'ün yönlendirmeleri otomatik olarak takip etmediğini hatırlamanız gerekir. -L komut satırı seçeneğini ekleyerek ona bunu yapmasını söylemelisiniz. Bunu önceki komut satırına eklemek, tam halini şöyle yapar:
curl -d user=daniel -d secret=qwerty -d id=bc76 \
https://example.com/login.cgi -b cookies -c cookies -L -o out
Giriş sonrası (Post-login)
Yukarıdaki örnek komut satırlarında, giriş yanıtı çıktısını 'out' adlı bir dosyaya kaydediyoruz ve betiğinizde muhtemelen girişin başarılı olduğunu onaylayan bir metin veya bir şey içerdiğini doğrulamalısınız.
Başarıyla giriş yaptıktan sonra, ihtiyacınız olan dosyaları alın veya HTTP işlemlerini gerçekleştirin ve çerezleri kullanmak ve güncellemek için komut satırlarında hem -b hem de -c kullanmaya devam etmeyi unutmayın.
Referer
Bazı siteler, bir şey istediğinizde veya giriş yaptığınızda veya benzeri durumlarda Referer:'ın gerçekten meşru ana URL'yi tanımladığını doğrular. O zaman -e https://example.com/ vb. kullanarak sunucuya hangi URL'den geldiğinizi bildirebilirsiniz. Bunu önceki giriş denemesine eklemek şöyle olur:
curl -d user=daniel -d secret=qwerty -d id=bc76 \
https://example.com/login.cgi \
-b cookies -c cookies -L -e "https://example.com/" -o out
TLS parmak izi (TLS fingerprinting)
Günümüzde bot karşıtı tespitler, bir isteğin bir tarayıcıdan gelip gelmediğini anlamak için TLS parmak izini kullanır. Curl'ün parmak izi ortamınıza bağlı olarak değişebilir ve büyük olasılıkla tarayıcılarınkinden farklıdır. Curl'ün CLI'sı parmak izinin tüm çeşitli parçalarını değiştirmek için seçeneklere sahip değildir, ancak ileri düzey bir kullanıcı libcurl kullanarak ve curl'ü kaynaktan kendisi derleyerek parmak izini özelleştirebilir.
Komut satırı FTP
FTP (Dosya Aktarım Protokolü), curl'ün desteklediği muhtemelen en eski ağ protokolüdür; 1970'lerin başında oluşturulmuştur. Hala başvurulan resmi belge, ilk curl sürümünden on yıldan fazla bir süre önce, 1985'te yayınlanan RFC 959'dur.
FTP, İnternet ve bilgisayarların farklı bir çağında yaratılmıştır ve bu nedenle diğer çoğu protokolden biraz farklı çalışır. Bu farklılıklar genellikle göz ardı edilebilir ve her şey çalışır, ancak işler planlandığı gibi gitmediğinde bunları bilmek de önemlidir.
Ping-pong
FTP protokolü bir komut ve yanıt protokolüdür; istemci bir komut gönderir ve sunucu yanıt verir. curl'ün -v seçeneğini kullanırsanız, bir transfer sırasındaki tüm komutları ve yanıtları görürsünüz.
Sıradan bir transfer için, gönderilmesi gereken yaklaşık 5 ila 8 komut ve beklenip okunması gereken bir o kadar yanıt vardır. Belki de söylemeye gerek yok, eğer sunucu uzak bir konumdaysa, gerçek dosya transferi ayarlanıp başlayabilmeden önce ping pong'un gerçekleşmesi için çok zaman harcanır. Küçük dosyalar için, ilk komutlar gerçek veri transferinden daha uzun sürebilir.
Transfer modu
Bir FTP istemcisi veri aktarmak üzereyken, sunucuya yaklaşan transferin hangi transfer modunu kullanmasını istediğini belirtir. curl'ün desteklediği iki transfer modu 'ASCII' ve 'BINARY'dir. Ascii metin içindir ve genellikle sunucunun dosyaları dönüştürülmüş yeni satırlarla gönderdiği anlamına gelirken, binary (ikili) verilerin değiştirilmeden gönderilmesi ve dosyanın metin olmadığının varsayılması anlamına gelir.
curl, FTP için varsayılan olarak binary transfer modunu kullanır ve bunun yerine -B, --use-ascii ile veya URL'nin ;type=A ile bittiğinden emin olarak ascii modunu istersiniz.
Kimlik Doğrulama
FTP, normalde bir kullanıcı adı ve şifre olmadan erişmediğiniz protokollerden biridir. Sadece anonim FTP erişimine izin veren sistemler için hemen hemen istediğiniz herhangi bir isim ve şifreyle giriş yapabilirsiniz. curl, herhangi bir kullanıcı adı veya şifre verilmeden transfer yapmak için bir FTP URL'sinde kullanıldığında, anonymous adını ve ftp@example.com şifresini kullanır.
Başka bir kullanıcı adı ve şifre sağlamak istiyorsanız, bunları curl'e -u, --user seçeneğiyle iletebilir veya bilgiyi URL'ye gömebilirsiniz:
curl --user daniel:secret ftp://example.com/download
curl ftp://daniel:secret@example.com/download
FTP Dizin listeleme
URL'nin sonunun eğik çizgiyle bittiğinden emin olarak curl ile uzak bir FTP dizinini listeleyebilirsiniz. URL bir eğik çizgiyle bitiyorsa, curl listelemek istediğiniz şeyin bir dizin olduğunu varsayar. Eğer aslında bir dizin değilse, muhtemelen bunun yerine bir hata alırsınız.
curl ftp://ftp.example.com/directory/
FTP ile, standart FTP komutu LIST kullanan bu tür bir komut için döndürülen dizin çıktısı için standart bir sözdizimi yoktur. Listeleme genellikle insanlar tarafından okunabilir ve tamamen anlaşılabilirdir ancak farklı sunucular listelemeyi biraz farklı düzenler kullanarak döndürebilir.
Bir dizindeki tüm isimlerin sadece bir listesini almanın ve böylece normal dizin listelemelerinin özel formatlamasından kaçınmanın bir yolu, curl'e --list-only (veya sadece -l) demektir. curl daha sonra bunun yerine NLST FTP komutunu verir:
curl --list-only ftp://ftp.example.com/directory/
Ancak NLST'nin kendi tuhaflıkları vardır, çünkü bazı FTP sunucuları NLST'ye yanıtlarında yalnızca gerçek dosyaları listeler; dizinleri ve sembolik bağlantıları dahil etmezler.
FTP ile yükleme
Bir FTP sunucusuna yükleme yapmak için, URL'de tüm hedef dosya yolunu ve adını belirtirsiniz ve yüklenecek yerel dosya adını -T, --upload-file ile belirtirsiniz. İsteğe bağlı olarak, hedef URL'yi bir eğik çizgiyle bitirirsiniz ve ardından yerel yoldaki dosya bileşeni curl tarafından eklenir ve uzak dosya adı olarak kullanılır.
Şöyle:
curl -T localfile ftp://ftp.example.com/dir/path/remote-file
veya yerel dosya adını uzak ad olarak kullanmak için:
curl -T localfile ftp://ftp.example.com/dir/path/
Yükleme yaparken üzerine yazmak yerine --append seçeneğiyle yerel dosyayı hedef dosyaya ekleyin:
curl -T uploadthis --append ftp://example.com/directory/remotename
curl ayrıca -T argümanında globbing destekler, böylece bir dizi dosyayı kolayca yüklemeyi seçebilirsiniz:
curl -T 'image[1-99].jpg' ftp://ftp.example.com/upload/
veya bir dosya serisi:
curl -T '{file1,file2}' ftp://ftp.example.com/upload/
veya
curl -T '{Huey,Dewey,Louie}.jpg' ftp://ftp.example.com/nephews/
Özel FTP komutları
FTP protokolü, istemcinin curl'ün odaklandığı düz dosya transferleri dışındaki eylemleri gerçekleştirmesine izin veren çok çeşitli farklı komutlar sunar.
Bir curl kullanıcısı, dosya transfer dizisindeki bir adım olarak sunucuya bu tür ek (özel) komutları iletebilir. curl, bu komutların sürecin farklı noktalarında çalıştırılmasını bile teklif eder.
Quote
Eskiden standart eski ftp istemcisinin quote adında bir komutu vardı. Komutları sunucuya kelimesi kelimesine göndermek için kullanılırdı. curl neredeyse aynı işlevsellik için aynı adı kullanır: belirtilen komutu sunucuya kelimesi kelimesine gönderin. Aslında bir veya daha fazla komut. -Q veya --quote.
Hangi komutların mevcut olduğunu ve bir sunucuya gönderilebileceğini bilmek için, FTP protokolü hakkında biraz bilgi sahibi olmanız ve muhtemelen ayrıntılar için RFC 959'u biraz okumanız gerekir.
Transfer başlamadan önce sunucuya basit bir NOOP (hiçbir şey yapmaz) göndermek için, curl'e şöyle verin:
curl -Q NOOP ftp://example.com/file
Bunun yerine aynı komutu transferden hemen sonra göndermek için, FTP komutunun önüne bir tire koyun:
curl -Q -NOOP ftp://example.com/file
curl ayrıca çalışma dizinini değiştirdikten sonra, transferi başlatan komutlardan hemen önce komut göndermeyi de teklif eder. O zaman komut göndermek için, komutun önüne bir '+' (artı) koyun.
Bir komut serisi
Aslında komut satırında birden fazla -Q kullanarak üç farklı zamanda da komut gönderebilirsiniz. Ayrıca daha fazla -Q seçeneği kullanarak aynı konumda birden fazla komut da gönderebilirsiniz.
Varsayılan olarak, verilen komutlardan herhangi biri sunucudan bir hata döndürürse, curl işlemlerini durdurur, transferi iptal eder (transfer başlamadan önce gerçekleşirse) ve daha fazla özel komut göndermez.
Örnek, bir dosyayı yeniden adlandırın ve ardından bir transfer yapın:
curl -Q "RNFR original" -Q "RNTO newname" ftp://example.com/newname
Hata verebilir komutlar
Her şeyin durmasına neden olmadan sunucudan bir hata döndürülmesini sağlamak için, başarısız olmasına izin verilen bireysel quote komutları göndermeyi seçebilirsiniz.
Komutun önüne bir yıldız işareti (*) koyarak komutu hata verebilir hale getirirsiniz. Örneğin, bir transferden sonra bir silme (DELE) gönderin ve başarısız olmasına izin verin:
curl -Q "-*DELE file" ftp://example.com/moo
İki bağlantı
FTP iki TCP bağlantısı kullanır. İlk bağlantı, istemci bir FTP sunucusuna bağlandığında kurulur ve kontrol bağlantısı olarak adlandırılır. İlk bağlantı olarak, kimlik doğrulama ve uzak sunucuda doğru dizine geçme vb. işlemleri halleder. İstemci daha sonra bir dosya aktarmaya hazır olduğunda, ikinci bir TCP bağlantısı kurulur ve veriler bunun üzerinden aktarılır.
İkinci bir bağlantının kurulması, çeşitli nedenlerle sıkıntılara ve baş ağrılarına neden olur.
Aktif bağlantılar
İstemci, sunucunun istemciye bağlanarak kurulumu yapmasını, yani aktif bir bağlantı talep etmeyi seçebilir. Bu, PORT veya EPRT komutları ile yapılır. Uzak bir ana bilgisayarın, istemcinin açtığı bir bağlantı noktasına geri bağlanmasına izin vermek, arada bunun geçmesini engelleyen bir güvenlik duvarı veya başka bir ağ cihazı olmamasını gerektirir ve bu durum her zaman böyle olmaktan uzaktır. curl -P [arg] (uzun biçimde --ftp-port olarak da bilinir) kullanarak aktif bir transfer istersiniz ve seçenek tam olarak hangi adresin kullanılacağını belirtmenize izin verirken, geldiğiniz adresi ayarlamak neredeyse her zaman doğru seçimdir ve bunu -P - ile yaparsınız, işte bir dosya istemenin yolu:
curl -P - ftp://example.com/foobar.txt
Ayrıca --no-eprt komut satırı seçeneğiyle curl'den açıkça EPRT (PORT'tan biraz daha yeni bir komuttur) kullanmamasını isteyebilirsiniz.
Pasif bağlantılar
Curl varsayılan olarak pasif bir bağlantı istemeyi seçer; bu, sunucuya bir PASV veya EPSV komutu gönderdiği ve ardından sunucunun, curl'ün bağlandığı ikinci bağlantı için yeni bir bağlantı noktası açtığı anlamına gelir. Yeni bir bağlantı noktasına yapılan giden bağlantılar genellikle son kullanıcılar ve istemciler için daha kolay ve daha az kısıtlıdır ancak sunucunun tarafındaki ağın buna izin vermesini gerektirir.
Pasif bağlantılar varsayılan olarak etkindir, ancak daha önce aktifi açtıysanız, --ftp-pasv ile tekrar pasife geçebilirsiniz.
Ayrıca --no-epsv komut satırı seçeneğiyle curl'den açıkça EPSV (PASV'tan biraz daha yeni bir komuttur) kullanmamasını isteyebilirsiniz.
Bazen sunucu garip bir kurulum çalıştırıyor olabilir, öyle ki curl PASV komutunu verdiğinde ve sunucu curl'ün bağlanması için bir IP adresiyle yanıt verdiğinde, bu adres yanlıştır ve curl veri bağlantısını kuramaz. Bu (nadir) durum için, curl'den PASV yanıtında belirtilen IP adresini yok saymasını (--ftp-skip-pasv-ip) ve bunun yerine ikinci bağlantı için bile kontrol bağlantısı için sahip olduğu aynı IP adresini kullanmasını isteyebilirsiniz.
Güvenlik duvarı sorunları
Aktif veya pasif transferler kullanıldığında, ağ yolundaki mevcut güvenlik duvarlarının, FTP trafiğinin durum bilgisine sahip denetimini (stateful inspection) yapması, açılacak yeni bağlantı noktasını bulması ve ikinci bağlantı için kabul etmesi gerekir.
Dizin dolaşma
Uzak dosya sistemini dolaşmak için FTP komutları yaparken, curl'ün hedef dosyaya, kullanıcının aktarmak istediği dosyaya ulaşmak için izleyebileceği birkaç farklı yol vardır.
multicwd
curl, dosya ağacı hiyerarşisindeki her bir dizin için bir dizin değiştirme (CWD) komutu yapabilir. Tam yol one/two/three/file.txt ise, bu yöntem file.txt dosyasının aktarılmasını istemeden önce üç CWD komutu yapmak anlamına gelir. Bu yöntem, yol birçok seviye derinliğindeyse oldukça fazla sayıda komut oluşturur. Bu yöntem erken bir spesifikasyon (RFC 1738) tarafından zorunlu kılınmıştır ve curl varsayılan olarak böyle davranır:
curl --ftp-method multicwd ftp://example.com/one/two/three/file.txt
Bu daha sonra şu FTP komut/yanıt dizisine eşittir (basitleştirilmiş):
> CWD one
< 250 OK. Current directory is /one
> CWD two
< 250 OK. Current directory is /one/two
> CWD three
< 250 OK. Current directory is /one/two/three
> RETR file.txt
nocwd
Her dizin parçası için bir CWD yapmanın tersi, dizini hiç değiştirmemektir. Bu yöntem, tüm yolu kullanarak sunucuya bir kerede istekte bulunur ve bu nedenle hızlıdır. Ara sıra sunucuların bununla ilgili bir sorunu olur ve tamamen standartlara uygun değildir:
curl --ftp-method nocwd ftp://example.com/one/two/three/file.txt
Bu daha sonra şu FTP komut/yanıt dizisine eşittir (basitleştirilmiş):
> RETR one/two/three/file.txt
singlecwd
Bu, diğer iki FTP yönteminin arasındadır. Bu, hedef dizine tek bir CWD komutu yapar ve ardından verilen dosyayı ister:
curl --ftp-method singlecwd ftp://example.com/one/two/three/file.txt
Bu daha sonra şu FTP komut/yanıt dizisine eşittir (basitleştirilmiş):
> CWD one/two/three
< 250 OK. Current directory is /one/two/three
> RETR file.txt
FTPS
FTPS, TLS ile güvenli FTP'dir. Düz FTP'nin açık metin güvensiz bağlantılar kullandığı yerde, tam güvenli TLS bağlantıları için pazarlık yapar.
curl ile FTPS yapmanın iki yolu vardır. Zımni (implicit) yol ve açık (explicit) yol. (Bu terimler FTPS RFC'sinden gelmektedir). Genellikle çalıştığınız sunucu, ona karşı bu yöntemlerden hangisini kullanabileceğinizi ve kullanmanız gerektiğini belirler.
Zımni FTPS
Zımni yol, URL'nizde ftps:// kullandığınız zamandır. Bu, curl'ün ana bilgisayara bağlanmasını ve açıkta hiçbir şey yapmadan hemen bir TLS el sıkışması yapmasını sağlar. URL'de hiçbir bağlantı noktası numarası belirtilmezse, curl bunun için 990 portunu kullanır. Bu genellikle FTPS'in yapılma şekli değildir.
Açık FTPS
FTPS yapmanın açık yolu, bir ftp:// URL'si kullanmaya devam etmek ancak curl'e AUTH TLS FTP komutunu kullanarak bağlantıyı güvenli bir bağlantıya yükseltmesi talimatını vermektir.
curl'e bir yükseltme denemesini ve yükseltme başarısız olursa (--ssl ile) her zamanki gibi devam etmesini söyleyebilir veya --ssl-reqd kullanarak curl'ü yükseltmeye zorlayabilir veya yükseltme başarısız olursa her şeyi sert bir şekilde başarısızlığa uğratabilirsiniz. İkinciyi kullanmanızı şiddetle tavsiye ederiz, böylece - eğer yapılacaksa - güvenli bir transferin yapıldığından emin olabilirsiniz.
Yaygın FTPS sorunları
FTPS ile ilgili en yaygın tek sorun, FTP protokolünün (FTPS transferlerinin dayandığı) veri transferi için ayrı bir bağlantı kurulumu kullanmasından kaynaklanmaktadır. Bu bağlantı başka bir porta yapılır ve FTP açık metin (FTPS olmayan) üzerinden yapıldığında, güvenlik duvarları ve ağ denetçileri vb. bunun devam eden FTP olduğunu anlayabilir ve yeni bağlantı için şeyleri ve kuralları uyarlayabilir.
FTP kontrol kanalı TLS ile şifrelendiğinde, güvenlik duvarları neler olduğunu göremez ve hiçbir dış taraf buna dayanarak ağ kurallarını veya izinlerini dinamik olarak uyarlayamaz.
libcurl
curl komut satırı aracındaki motor libcurl'dür. libcurl aynı zamanda bugün internet veri transferlerini gerçekleştiren binlerce araç, hizmet ve uygulamadaki motordur.
C API
libcurl, C ile yazılmış uygulamalar için bir C API'si ile sağlanan bir işlevler kütüphanesidir. Sadece birkaç hususla (bkz. C++ programcıları için libcurl) C++'tan da kolayca kullanabilirsiniz. Diğer diller için, libcurl kütüphanesi ile sevdiğiniz belirli dil için karşılık gelen işlevler arasında ara katmanlar olarak çalışan bağlayıcılar (bindings) mevcuttur.
Transfer odaklı
libcurl'ü, kullanıcıları protokol uzmanı olmaya veya aslında ağ oluşturma veya ilgili protokoller hakkında çok fazla şey bilmeye zorlamadan genellikle transfer odaklı olacak şekilde tasarladık. Bir transferi yapabildiğiniz ve istediğiniz kadar ayrıntı ve özel bilgi ile ayarlarsınız ve ardından libcurl'e o transferi gerçekleştirmesini söylersiniz.
Bununla birlikte, ağ oluşturma ve protokoller birçok tuzak ve özel durum içeren alanlardır, bu nedenle bu şeyler hakkında ne kadar çok şey bilirseniz, libcurl'ün seçeneklerini ve çalışma yollarını o kadar iyi anlayabilirsiniz. Bahsetmeye gerek yok, işler planladığınız gibi gitmediğinde hata ayıklama yaparken ve bir sonraki adımda ne yapacağınızı anlamanız gerektiğinde bu tür bilgiler paha biçilmezdir.
En temel libcurl kullanan uygulama sadece birkaç satır kod kadar küçük olabilir, ancak çoğu uygulama elbette bundan daha fazla koda ihtiyaç duyar.
Varsayılan olarak basit, talep üzerine daha fazlası
libcurl genellikle varsayılan olarak basit ve temel transferi yapar ve daha gelişmiş özellikler eklemek istiyorsanız, bunu doğru seçenekleri ayarlayarak eklersiniz. Örneğin, libcurl varsayılan olarak HTTP çerezlerini desteklemez, ancak ona söylediğinizde destekler.
Bu, libcurl'ün davranışlarını tahmin etmeyi ve bunlara güvenmeyi kolaylaştırır ve ayrıca eski davranışı sürdürmeyi ve yeni özellikler eklemeyi kolaylaştırır. Yalnızca yeni özellikleri gerçekten isteyen ve kullanan uygulamalar bu davranışı alır.
- Başlık dosyaları (Header files)
- Küresel başlatma (Global initialization)
- API uyumluluğu
- --libcurl
- çoklu iş parçacığı (multi-threading)
- CURLcode dönüş kodları
- Ayrıntılı operasyonlar
- Önbellekler
- Performans
- C++ programcıları için
Başlık dosyaları (Header files)
libcurl kullanan uygulamanızın dahil etmesi gereken tek bir başlık vardır:
#include <curl/curl.h>
Bu dosya sırayla diğer birkaç genel başlık dosyasını içerir ancak onların var olmadığını varsayabilirsiniz. (Tarihsel olarak konuşursak, biraz farklı başladık ancak zamanla dahil etmeler için yalnızca tek bir tane kullanma şekli etrafında istikrar kazandık.)
Küresel başlatma (Global initialization)
Programınızda libcurl ile ilgili herhangi bir şey yapmadan önce, curl_global_init() ile küresel bir libcurl başlatma çağrısı yapmalısınız. Bu gereklidir çünkü libcurl'ün kullanabileceği bazı temel kütüphanelerin düzgün bir şekilde kurulması ve başlatılması için önceden bir çağrıya ihtiyacı vardır.
curl_global_init(), ne yazık ki, iş parçacığı güvenli (thread safe) değildir, bu nedenle bunu yalnızca bir kez yaptığınızdan ve asla başka bir çağrıyla aynı anda yapmadığınızdan emin olmalısınız. Küresel durumu başlatır, bu nedenle yalnızca bir kez çağırmalısınız ve programınız libcurl'ü kullanmayı tamamen bitirdiğinde, init çağrısının ayırdığı ilişkili küresel kaynakları serbest bırakmak ve temizlemek için curl_global_cleanup() işlevini çağırabilirsiniz.
libcurl, curl_global_init() çağrısını atladığınız durumu ele almak için oluşturulmuştur, ancak bunu (herhangi bir gerçek dosya transferi başlamadan önce yapmadıysanız) kendisi çağırarak yapar ve ardından kendi varsayılanlarını kullanır. O zaman bile iş parçacığı güvenli olmadığına dikkat edin, bu nedenle sizin için bazı "ilginç" yan etkilere neden olabilir. curl_global_init()'i kontrollü bir şekilde kendiniz çağırmak çok daha iyidir.
API uyumluluğu
libcurl, API kararlılığı vaat eder ve bugün yazılan programınızın gelecekte de çalışmaya devam edeceğini garanti eder. Uyumluluğu bozmuyoruz.
Zamanla, API'lere özellikler, yeni seçenekler ve yeni işlevler ekliyoruz ancak davranışı uyumlu olmayan bir şekilde değiştirmiyoruz veya işlevleri kaldırmıyoruz.
API'yi uyumlu olmayan bir şekilde en son değiştirdiğimiz zaman 2006'daki 7.16.0 içindi ve bunu bir daha asla yapmayı planlamıyoruz.
Sürüm numaraları
Curl ve libcurl ayrı ayrı sürümlendirilir, ancak çoğunlukla birbirlerini oldukça yakından takip ederler.
Sürüm numaralandırması her zaman aynı sistem kullanılarak oluşturulur:
X.Y.Z
- X ana sürüm numarasıdır
- Y yayın sürüm numarasıdır
- Z yama numarasıdır
Numaraları yükseltme
Bu X.Y.Z numaralarından biri her yeni sürümde yükseltilir. Yükseltilen bir numaranın sağındaki numaralar sıfıra sıfırlanır.
Ana sürüm numarası X, gerçekten büyük, dünyayı çarpıştıran değişiklikler yapıldığında yükseltilir. Yayın numarası Y, değişiklikler yapıldığında veya şeyler/özellikler eklendiğinde yükseltilir. Yama numarası Z, değişiklikler sadece hata düzeltmeleri olduğunda yükseltilir.
Bu, 1.2.3 sürümünden sonra, gerçekten büyük bir şey yapılmışsa 2.0.0, o kadar büyük değişiklikler yapılmamışsa 1.3.0 veya çoğunlukla hatalar düzeltilmişse 1.2.4 yayınlayabileceğimiz anlamına gelir.
Yükseltme, numarayı 1 artırma olarak, koşulsuz olarak yalnızca numaralardan birini etkiler (ve sağındakiler sıfıra ayarlanır). 1, 2 olur; 3, 4 olur; 9, 10 olur; 88, 89 olur ve 99, 100 olur. Yani, 1.2.9'dan sonra 1.2.10 gelir. 3.99.3'ten sonra 3.100.0 gelebilir.
Tüm orijinal curl kaynak yayın arşivleri libcurl sürümüne göre adlandırılır (daha önce belirtildiği gibi farklı olabilen curl istemci sürümüne göre değil).
Hangi libcurl sürümü
Hala eski sürümlerle derlenebilirken yeni libcurl özelliklerini desteklemek isteyebilecek herhangi bir uygulamaya hizmet olarak, tüm sürümlerin libcurl sürümü karşılaştırma için kullanılabilecek statik bir numaralandırma şeması kullanılarak curl/curlver.h dosyasında saklanır. Sürüm numarası şöyle tanımlanır:
#define LIBCURL_VERSION_NUM 0xXXYYZZ
Burada XX , YY ve ZZ onaltılık (hexadecimal) olarak ana sürüm, yayın ve yama numaralarıdır. Her üç numara alanı da her zaman iki basamak kullanılarak temsil edilir (her biri sekiz bit). 1.2.0 0x010200 olarak görünürken 9.11.7 sürümü 0x090b07 olarak görünür.
Bu 6 basamaklı onaltılık sayı, daha yeni bir sürümde her zaman daha büyük bir sayıdır. Büyüktür ve küçüktür ile karşılaştırmaların çalışmasını sağlar.
Bu numara ayrıca üç ayrı tanım olarak da mevcuttur:
LIBCURL_VERSION_MAJOR, LIBCURL_VERSION_MINOR ve LIBCURL_VERSION_PATCH.
Bu tanımlar elbette yalnızca şu an derlenen sürüm numarasını anlamak için uygundur ve şu andan üç yıl sonra çalışma zamanında hangi libcurl sürümünün kullanıldığını anlamanıza yardımcı olmaz.
Hangi libcurl sürümü çalışıyor
Uygulamanızın şu an hangi libcurl sürümünü kullandığını anlamak için curl_version_info() sizin içindir.
Uygulamalar, dinamik/DLL kütüphaneler uygulamalardan bağımsız olarak değiştirilebildiğinden, derleme zamanı kontrollerini kullanmak yerine, işlerin yapılıp yapılamayacağını değerlendirmek için bu işlevi kullanmalıdır.
curl_version_info(), çalışan libcurl sürümündeki sürüm numaraları ve çeşitli özellikler hakkında bilgi içeren bir yapıya (struct) işaretçi döndürür. Ona özel bir yaş sayacı vererek çağırırsınız, böylece libcurl onu çağıran libcurl'ün yaşını bilir. Yaş, CURLVERSION_NOW adlı bir tanımdır ve curl gelişimi boyunca düzensiz aralıklarla artırılan bir sayaçtır. Yaş numarası, libcurl'e hangi yapı setini döndürebileceğini söyler.
İşlevi şöyle çağırırsınız:
curl_version_info_data *version = curl_version_info( CURLVERSION_NOW );
Veriler daha sonra aşağıdaki düzene sahip olan veya en azından sahip olabilen yapıya işaret eder:
struct {
CURLversion age; /* aşağıda açıklamaya bakın */
/* 'age' 0 veya daha yüksek olduğunda, aşağıdaki üyeler de mevcuttur: */
const char *version; /* insan tarafından okunabilir dize */
unsigned int version_num; /* sayısal temsil */
const char *host; /* insan tarafından okunabilir dize */
int features; /* bitmask, aşağıya bakın */
char *ssl_version; /* insan tarafından okunabilir dize */
long ssl_version_num; /* kullanılmaz, her zaman sıfır */
const char *libz_version; /* insan tarafından okunabilir dize */
const char * const *protocols; /* protokoller */
/* 'age' 1 veya daha yüksek olduğunda, aşağıdaki üyeler de mevcuttur: */
const char *ares; /* insan tarafından okunabilir dize */
int ares_num; /* numara */
/* 'age' 2 veya daha yüksek olduğunda, aşağıdaki üye de mevcuttur: */
const char *libidn; /* insan tarafından okunabilir dize */
/* 'age' 3 veya daha yüksek olduğunda (7.16.1 veya daha yenisi),
aşağıdaki üyeler de mevcuttur */
int iconv_ver_num; /* iconv etkinse '_libiconv_version' */
const char *libssh_version; /* insan tarafından okunabilir dize */
/* 'age' 4 veya daha yüksek olduğunda, aşağıdaki üye de mevcuttur: */
unsigned int brotli_ver_num; /* Sayısal Brotli sürümü
(MAJOR << 24) | (MINOR << 12) | PATCH */
const char *brotli_version; /* insan tarafından okunabilir dize. */
/* 'age' 5 veya daha yüksek olduğunda, aşağıdaki üye de mevcuttur: */
unsigned int nghttp2_ver_num; /* Sayısal nghttp2 sürümü
(MAJOR << 16) | (MINOR << 8) | PATCH */
const char *nghttp2_version; /* insan tarafından okunabilir dize. */
const char *quic_version; /* insan tarafından okunabilir quic
(+ HTTP/3) kütüphanesi + sürüm veya
NULL */
/* 'age' 6 veya daha yüksek olduğunda, aşağıdaki üye de mevcuttur: */
const char *cainfo; /* yerleşik varsayılan CURLOPT_CAINFO, NULL
olabilir */
const char *capath; /* yerleşik varsayılan CURLOPT_CAPATH, NULL
olabilir */
/* 'age' 7 veya daha yüksek olduğunda, aşağıdaki üye de mevcuttur: */
unsigned int zstd_ver_num; /* Sayısal Zstd sürümü
(MAJOR << 24) | (MINOR << 12) | PATCH */
const char *zstd_version; /* insan tarafından okunabilir dize. */
/* 'age' 8 veya daha yüksek olduğunda, aşağıdaki üye de mevcuttur: */
const char *hyper_version; /* insan tarafından okunabilir dize. */
} curl_version_info_data;
--libcurl
Kullanıcıları, yapmak istedikleri transferi önce curl komut satırı aracıyla denemeye ve kabaca istedikleri gibi çalıştıktan sonra komut satırına --libcurl [dosyaadı] seçeneğini ekleyip tekrar çalıştırmaya aktif olarak teşvik ediyoruz.
--libcurl komut satırı seçeneği, sağlanan dosya adında bir C programı oluşturur. Bu C programı, curl komut satırı aracına az önce yaptırdığınız transferi çalıştırmak için libcurl kullanan bir uygulamadır. Bazı istisnalar vardır ve her zaman %100 eşleşme olmaz, ancak hangi libcurl seçeneklerini istediğinizi veya kullanabileceğinizi ve bunlara hangi ek argümanları sağlayacağınızı görmek için mükemmel bir ilham kaynağı olarak hizmet edebileceğini görebilirsiniz.
Dosya adını tek bir tire olarak belirtirseniz (--libcurl - şeklinde), programın bir dosya yerine stdout'a yazılmasını sağlarsınız.
Örnek olarak, http://example.com adresini almak için bir komut çalıştırıyoruz:
curl http://example.com --libcurl example.c
Bu, mevcut dizinde şuna benzer görünen example.c dosyasını oluşturur:
/****** curl komut satırı aracı tarafından oluşturulan örnek kod ******/
* Tüm curl_easy_setopt() seçenekleri şurada belgelenmiştir:
* https://curl.se/libcurl/c/curl_easy_setopt.html
************************************************************************/
#include <curl/curl.h>
int main(int argc, char *argv[])
{
CURLcode ret;
CURL *hnd;
hnd = curl_easy_init();
curl_easy_setopt(hnd, CURLOPT_URL, "http://example.com");
curl_easy_setopt(hnd, CURLOPT_NOPROGRESS, 1L);
curl_easy_setopt(hnd, CURLOPT_USERAGENT, "curl/7.45.0");
curl_easy_setopt(hnd, CURLOPT_MAXREDIRS, 50L);
curl_easy_setopt(hnd, CURLOPT_SSH_KNOWNHOSTS,
"/home/daniel/.ssh/known_hosts");
curl_easy_setopt(hnd, CURLOPT_TCP_KEEPALIVE, 1L);
/* İşte curl kodunun kullandığı ancak kaynak olarak
kolayca oluşturulamayan seçeneklerin bir listesi.
Bunları kullanmamayı veya kendiniz uygulamayı seçebilirsiniz.
CURLOPT_WRITEDATA set to a objectpointer
CURLOPT_WRITEFUNCTION set to a functionpointer
CURLOPT_READDATA set to a objectpointer
CURLOPT_READFUNCTION set to a functionpointer
CURLOPT_SEEKDATA set to a objectpointer
CURLOPT_SEEKFUNCTION set to a functionpointer
CURLOPT_ERRORBUFFER set to a objectpointer
CURLOPT_STDERR set to a objectpointer
CURLOPT_HEADERFUNCTION set to a functionpointer
CURLOPT_HEADERDATA set to a objectpointer
*/
ret = curl_easy_perform(hnd);
curl_easy_cleanup(hnd);
hnd = NULL;
return (int)ret;
}
/**** Örnek kodun sonu ****/
çoklu iş parçacığı (multi-threading)
libcurl iş parçacığı güvenlidir (thread safe) ancak dahili iş parçacığı senkronizasyonu yoktur. libcurl'ü iş parçacıklı olarak düzgün bir şekilde kullanmak için kendi kilitlemenizi sağlamanız veya seçenekleri değiştirmeniz gerekebilir. Tam olarak neyin gerekli olduğu libcurl'ün nasıl derlendiğine bağlıdır. Lütfen en son bilgileri içeren libcurl iş parçacığı güvenliği web sayfasına bakın.
CURLcode dönüş kodları
Birçok libcurl işlevi bir CURLcode döndürür. Bu, hata kodları için libcurl'de typedef edilmiş özel bir değişkendir. Her şey yolundaysa CURLE_OK (değeri sıfırdır) döndürür ve bir sorun algılanırsa sıfır olmayan bir sayı döndürür. Kullanımda neredeyse yüz CURLcode hatası vardır ve hepsini curl/curl.h başlık dosyasında bulabilir ve libcurl-errors kılavuz sayfasında belgelenmiş olarak görebilirsiniz.
Bir CURLcode'u curl_easy_strerror() işleviyle insan tarafından okunabilir bir dizeye dönüştürebilirsiniz—ancak bu hataların nadiren bir kullanıcı arayüzünde veya bir son kullanıcıya gösterilmeye uygun bir şekilde ifade edildiğini unutmayın:
const char *str = curl_easy_strerror( error );
printf("libcurl said %s\n", str);
Hata durumunda biraz daha iyi bir hata metni almanın başka bir yolu, CURLOPT_ERRORBUFFER seçeneğini programınızdaki bir arabelleği işaret edecek şekilde ayarlamaktır; libcurl bir hata döndürmeden önce ilgili bir hata mesajını orada saklar:
char error[CURL_ERROR_SIZE]; /* en az bu kadar büyük olması gerekir */
CURLcode ret = curl_easy_setopt(handle, CURLOPT_ERRORBUFFER, error);
Ayrıntılı operasyonlar
Tamam, hatayı insan tarafından okunabilir bir metin olarak nasıl alacağımızı gösterdik, çünkü bu belirli bir transferde neyin yanlış gittiğini anlamak için mükemmel bir yardımdır ve genellikle neden böyle yapılabileceğini veya o anki sorunun ne olduğunu açıklar.
libcurl uygulamaları geliştirirken herkesin bilmesi ve kapsamlı bir şekilde kullanması gereken bir sonraki cankurtaran, en azından libcurl uygulamaları geliştirirken veya libcurl'ün kendisinde hata ayıklarken, CURLOPT_VERBOSE ile ayrıntılı (verbose) modu etkinleştirmektir:
CURLcode ret = curl_easy_setopt(handle, CURLOPT_VERBOSE, 1L);
libcurl'e ayrıntılı olması söylendiğinde, transfer devam ederken transferle ilgili ayrıntıları ve bilgileri stderr'e verir. Bu, işlerin neden başarısız olduğunu anlamak ve ona farklı şeyler sorduğunuzda libcurl'ün tam olarak ne yaptığını öğrenmek için harikadır. CURLOPT_STDERR ile stderr'i değiştirerek çıktıyı başka bir yere yönlendirebilir veya hata ayıklama geri çağırımı (debug callback) (sonraki bir bölümde daha ayrıntılı açıklanacaktır) ile daha süslü bir şekilde daha fazla bilgi alabilirsiniz.
Her şeyi izle
Ayrıntılı kesinlikle iyidir, ancak bazen daha fazlasına ihtiyacınız olur. libcurl ayrıca, ayrıntılı modun yaptığı her şeyi size göstermenin yanı sıra, gönderilen ve alınan tüm verileri de ileten bir izleme geri çağırımı (trace callback) sunar, böylece uygulamanız her şeyin tam bir izini alır.
İzleme geri çağırımına iletilen gönderilen ve alınan veriler, geri çağırıma şifrelenmemiş biçimde verilir; bu, ağdan verileri yakalamanın hata ayıklama için pratik olmadığı durumlarda TLS veya SSH tabanlı protokollerle çalışırken kullanışlı olabilir.
CURLOPT_DEBUGFUNCTION seçeneğini ayarladığınızda, yine de CURLOPT_VERBOSE'un etkinleştirilmiş olması gerekir ancak izleme geri çağırımı ayarlandığında, libcurl dahili işlemi yerine o geri çağırımı kullanır.
İzleme geri çağırımı şuna benzer bir prototiple eşleşmelidir:
int my_trace(CURL *handle, curl_infotype type, char *data, size_t size,
void *user);
handle ilgili easy handle'dır, type geri çağırıma iletilen belirli veriyi tanımlar (veri giriş/çıkış, başlık giriş/çıkış, TLS veri giriş/çıkış ve metin), data, size bayt sayısı kadar olan verilere işaret eden bir işaretçidir. user, CURLOPT_DEBUGDATA ile ayarladığınız özel işaretçidir.
data tarafından işaret edilen veriler null ile sonlandırılmış değildir, ancak tam olarak size argümanıyla belirtilen boyuttadır.
Geri çağırım 0 döndürmelidir, aksi takdirde libcurl bunu bir hata olarak kabul eder ve transferi iptal eder.
curl web sitesinde, ilham almak için basit bir izleme işlevi içeren debug.c adında bir örnek barındırıyoruz.
Ayrıca CURLOPT_DEBUGFUNCTION man sayfasında ek ayrıntılar da mevcuttur.
Transfer ve bağlantı tanımlayıcıları
Hata ayıklama geri çağırımına geçen izleme bilgi akışı sürekli bir akış olduğundan, uygulamanız libcurl'ün çok sayıda ayrı bağlantı ve farklı transfer kullanmasını sağlasa bile, çeşitli bilgilerin hangi belirli transferlere veya bağlantılara ait olduğunu görmek istediğiniz zamanlar vardır. İzleme çıktısını daha iyi anlamak için.
Daha sonra transfer ve bağlantı tanımlayıcılarını geri çağırımın içinden alabilirsiniz:
curl_off_t conn_id;
curl_off_t xfer_id;
res = curl_easy_getinfo(curl, CURLINFO_CONN_ID, &conn_id);
res = curl_easy_getinfo(curl, CURLINFO_XFER_ID, &xfer_id);
Bunlar iki ayrı tanımlayıcıdır çünkü bağlantılar yeniden kullanılabilir ve birden fazla transfer aynı bağlantıyı kullanabilir. Bu tanımlayıcıları (gerçekte sayılar) kullanarak, hangi günlüklerin hangi transferler ve bağlantılarla ilişkili olduğunu görebilirsiniz.
Daha fazlasını izle
Hata ayıklama geri çağırımına iletilen varsayılan izleme verisi miktarı yeterli değilse. Daha temel bir alt protokol seviyesinde bir sorundan şüphelendiğinizde ve hata ayıklamak istediğinizde, libcurl sizin için curl_global_trace() işlevini sağlar.
Bu işlevle libcurl'e, aksi takdirde varsayılan olarak dahil etmediği bileşenler hakkında ayrıntılı günlük kaydı da eklemesini söylersiniz. TLS, HTTP/2 veya HTTP/3 protokol parçaları hakkındaki ayrıntılar gibi.
curl_global_trace() işlevleri, izlemesini istediğiniz alanları içeren virgülle ayrılmış bir liste tutan bir dize belirttiğiniz bir argüman alır. Örneğin, TLS ve HTTP/2 ayrıntılarını dahil edin:
/* HTTP/2 ve SSL işlemenin ayrıntılarını günlüğe kaydet */
curl_global_trace("http/2,ssl");
Tam seçenek seti değişir, ancak denenecek bazıları şunlardır:
| alan | açıklama |
|---|---|
all | mümkün olan her şeyi göster |
tls | TLS protokol değişimi ayrıntıları |
http/2 | HTTP/2 çerçeve bilgisi |
http/3 | HTTP/3 çerçeve bilgisi |
* | gelecek sürümlerde ek olanlar |
all ile hızlı bir çalıştırma yapmak, hangi belirli alanların gösterildiğini görmenin genellikle iyi bir yoludur, çünkü daha sonra daha spesifik alanlar ayarlanarak takip çalışmaları yapabilirsiniz.
Önbellekler
libcurl, sonraki transferlerin daha hızlı gerçekleşmesine yardımcı olmak için farklı bilgileri önbelleğe alır. Dört temel önbellek vardır: DNS, bağlantılar, TLS oturumları ve CA sertifikaları.
Multi arayüz kullanıldığında, bu önbellekler varsayılan olarak o tek multi handle'a eklenen tüm easy handle'lar arasında paylaşılır ve easy arayüz kullanıldığında o handle içinde tutulurlar.
libcurl'e paylaşım arayüzü ile önbelleklerin bazılarını paylaşması talimatını verebilirsiniz.
DNS önbelleği
libcurl bir ana bilgisayar adını bir veya daha fazla IP adresine çözümlediğinde, bu DNS önbelleğinde saklanır, böylece yakın vadede sonraki transferlerin aynı çözümlemeyi tekrar yapması gerekmez. Bir ad çözümlemesi kolayca birkaç yüz milisaniye ve bazen çok daha uzun sürebilir.
Varsayılan olarak, bu tür her ana bilgisayar adı önbellekte 60 saniye saklanır (CURLOPT_DNS_CACHE_TIMEOUT ile değiştirilebilir).
libcurl aslında DNS girişleri için TTL (Yaşam Süresi) değerinin ne olduğunu genellikle bilmez, çünkü bu genellikle bu amaçla kullandığı sistem fonksiyon çağrılarında ifşa edilmez, bu nedenle bu değeri artırmak, libcurl'ün eski adresleri gereğinden uzun süre kullanmaya devam etmesi riskiyle birlikte gelir.
Bağlantı önbelleği
Ayrıca bazen bağlantı havuzu olarak da adlandırılır. Bu, kullanımdan sonra kapatılmak yerine canlı tutulan, böylece aynı ana bilgisayar adını hedefleyen ve diğer birkaç kontrolü de eşleşen sonraki transferlerin yeni bir bağlantı oluşturmak yerine bunları kullanabileceği, önceden kullanılmış bağlantıların bir koleksiyonudur.
Yeniden kullanılan bir bağlantı genellikle bir DNS araması, bir TCP bağlantısı kurma, bir TLS el sıkışması yapma ve daha fazlasını yapmaktan tasarruf sağlar.
Bağlantılar yalnızca ad aynıysa yeniden kullanılır. İki farklı ana bilgisayar adı aynı IP adreslerine çözümlense bile, libcurl ile her zaman iki ayrı bağlantı kullanırlar.
Bağlantı yeniden kullanımı ana bilgisayar adına dayandığından ve bir transfer için bağlantı yeniden kullanıldığında DNS çözümleme aşaması tamamen atlandığından, libcurl DNS'deki ana bilgisayar adının mevcut durumunu bilmez, çünkü bağlantı hayatta kalıp orijinal IP adresi üzerinden yeniden kullanılmaya devam ederken aslında zamanla IP değiştirebilir.
Bağlantı önbelleğinin boyutu - orada tutulacak canlı bağlantı sayısı - easy handle'lar için CURLOPT_MAXCONNECTS (varsayılan 5'tir) ve multi handle'lar için CURLMOPT_MAXCONNECTS ile ayarlanabilir. Multi handle'lar için varsayılan boyut, eklenen easy handle sayısının 4 katıdır.
TLS oturum önbelleği
TLS oturum kimlikleri ve biletleri, bir istemcinin daha önce bağlantı kurduğu bir sunucuya sonraki TLS el sıkışmalarını kısayoldan yapmak için bir sunucuya iletebileceği özel TLS mekanizmalarıdır.
libcurl, ana bilgisayar adları ve bağlantı noktası numaralarıyla ilişkili oturum kimliklerini ve biletleri önbelleğe alır, bu nedenle libcurl'ün önbelleğe alınmış bir kimliğe veya bilete sahip olduğu bir ana bilgisayara sonraki bir bağlantı girişimi yapılırsa, bunu kullanmak TLS el sıkışma sürecini ve dolayısıyla tamamlanana kadar gereken süreyi büyük ölçüde azaltabilir.
CA sertifika önbelleği
curl'ün desteklediği bazı TLS arka uçlarıyla, bellekte bir CA sertifika deposu önbelleği oluşturur ve sonraki transferlerin kullanması için orada tutar. Bu, transferlerin bazen oldukça büyük CA sertifika demetlerini (bundles) yüklemekten ve işlemekten kaynaklanan gereksiz yükleme ve ayrıştırma süresini atlamasını sağlar.
CA sertifika demeti güncellenebileceğinden, önbelleğin ömrü varsayılan olarak 24 saate ayarlanmıştır, böylece uzun süreli çalışan uygulamalar önbelleği temizler ve depolamanın yeni bir sürümünü yükleyip kullanabilmek için dosyayı en az günde bir kez yeniden yükler.
Bu varsayılanın yeterince iyi olmadığı durumlarda uygulamalar CURLOPT_CA_CACHE_TIMEOUT seçeneğiyle CA sertifika önbellek zaman aşımını değiştirebilir.
Performans
Bu bölüm, libcurl'den maksimum performans elde etmek için bir uygulama yazarı olarak yapabilecekleriniz hakkında genel tavsiyeleri toplar.
libcurl varsayılan olarak mümkün olduğunca hızlı çalışacak şekilde tasarlanmış ve amaçlanmıştır. Özellikle fazladan bir şey yapmadan zaten en yüksek performansı almanız beklenir. Ancak bakılması gereken bazı yaygın şeyler veya belki kaçınılması gereken hatalar vardır.
handle'ları yeniden kullanın
Bu, libcurl ne zaman tartışılsa genel bir mantradır. Easy arayüzü kullanıyorsanız, yüksek performansın birincil anahtarı, sonraki transferleri yaparken handle'ları (tanıtıcıları) yeniden kullanmaktır. Bu, libcurl'ün bağlantıları yeniden kullanmasını, TLS oturumlarını yeniden kullanmasını, DNS önbelleğini mümkün olduğunca kullanmasını ve daha fazlasını sağlar.
tampon boyutları
Veri indiriyorsanız, CURLOPT_BUFFERSIZE'ı uygun bir boyuta ayarlayın. Başlangıçta daha küçük bir boyuttadır ve özellikle yüksek hızlı transferlerde, boyutunu artırarak libcurl'den daha fazlasını elde edebilirsiniz. Kullanım durumunuzla bir kıyaslamada (benchmark) birkaç boyutu denemenizi öneririz.
Benzer şekilde, veri yüklüyorsanız, aynı nedenlerle CURLOPT_UPLOAD_BUFFERSIZE'ı ayarlamak isteyebilirsiniz.
havuz boyutu
CURLOPT_MAXCONNECTS ile ayarladığınız bağlantı havuzunda tutulan canlı bağlantı sayısı, ince ayar yapmak için ilginç olabilir. Elbette uygulamanızın bağlantıları nasıl kullandığına bağlı olarak, ancak örneğin kısa bir süre içinde N ana bilgisayar adı üzerinde yineleniyorsa, libcurl'ün tüm bu bağlantıları canlı tutabildiğinden emin olmak sizin için mantıklı olabilir.
CA deposu önbelleğe alma
TLS kullanılarak yapılan her yeni bağlantı için, libcurl'ün uzak sunucunun sertifikasını doğrulamak üzere CA deposuna erişmesi gerekir. Uygulamalarınız çok sayıda bağlantı yapıyorsa, libcurl'ün diskten yüzlerce kilobayt'ı tekrar tekrar yüklemekten ve ayrıştırmaktan kaçınabilmesi için libcurl'ün CA önbelleğe almasından yararlandığınızdan emin olun. Ancak bu henüz tüm TLS arka uçları tarafından desteklenmemektedir.
geri çağırımları (callback) mümkün olduğunca hızlı yapın
Yüksek hızlı veri indirmelerinde, yazma geri çağırımı birçok kez çağrılır. Bu işlev mümkün olan en hızlı şekilde yürütülecek şekilde yazılmazsa, bu işlevin tek başına tüm transferleri aksi takdirde olabileceklerinden daha yavaş hale getirme riski vardır.
Aynısı elbette yüklemeler için okuma geri çağırımı için de geçerlidir.
libcurl geri çağırımlarınızda karmaşık mantık yapmaktan veya kilitler/mutexler kullanmaktan kaçının.
verileri paylaşın
Birden fazla easy handle kullanıyorsanız, performansı artırmak için verileri ve önbellekleri aralarında yine de paylaşabilirsiniz. Paylaşım API'sine daha yakından bakın.
iş parçacıkları (threads)
Transfer iş parçacığınız %100 CPU tüketmeye başlarsa, bant genişliğini artırmak için yükü birden fazla iş parçacığına dağıtmaktan fayda sağlayabilirsiniz.
Normalde o zaman, birbirlerinin performansına müdahale etmekten kaçınmak veya paylaşılan handle'lar nedeniyle iş parçacığı güvenliği sorunlarına girme riskinden kaçınmak için her iş parçacığının transferleri mümkün olduğunca bağımsız yapmasını istersiniz. Bağlantı yeniden kullanımının optimize edilebilmesi için aynı ana bilgisayar adlarının aynı iş parçacığında aktarılmasını sağlamaya çalışın.
curl_multi_socket_action
Uygulamanız birçok paralel transfer gerçekleştiriyorsa, örneğin yüzden fazla eşzamanlı transfer gibi, o zaman "normal" multi API yerine curl_multi_socket_action() ve olay tabanlı API'ye geçmeyi kesinlikle düşünmelisiniz. Bu, uygulamanızın hem poll() hem de select() kullanmaktan kaçınmasını sağlayan olay tabanlı bir yaklaşım kullanmanıza izin verir ve sizi buna zorlar; bu, yüksek derecede paralellik ile birlikte yüksek performansın anahtarıdır.
C++ programcıları için
libcurl bir C API'si sağlar. C ve C++ benzerdir ancak aynı değildir. libcurl'ü C++ içinde kullanırken akılda tutulması gereken birkaç şey vardır.
Dizeler C++ dize nesneleri değil, C dizeleridir
char * kabul eden libcurl API'lerine dizeler ilettiğinizde, bu, o işlevlere C++ dizeleri veya nesneleri iletemeyeceğiniz anlamına gelir.
Örneğin, C++ ile bir dize oluşturursanız ve ardından o dizenin bir URL olarak kullanılmasını isterseniz:
std::string url = "https://example.com/foo.asp?name=" + i;
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
Geri çağırım (Callback) hususları
libcurl bir C kütüphanesi olduğundan, C++ üye işlevleri veya nesneleri hakkında hiçbir şey bilmez. Sınıfa bir işaretçi iletilen statik bir üye işlevi kullanarak bu sınırlamanın üstesinden nispeten kolaylıkla gelebilirsiniz.
İşte geri çağırım olarak bir C++ yöntemini kullanan bir yazma geri çağırımı örneği:
// f, nesnenize olan işaretçidir.
static size_t YourClass::func(void *buffer, size_t sz, size_t n, void *f)
{
// Statik olmayan üye işlevini çağırın.
static_cast<YourClass*>(f)->nonStaticFunction();
}
// Statik işleve işaretçiyi şöyle iletirsiniz:
curl_easy_setopt(hcurl, CURLOPT_WRITEFUNCTION, YourClass::func);
curl_easy_setopt(hcurl, CURLOPT_WRITEDATA, this);
libcurl transferleri
Bu bölümde, libcurl ile İnternet transferlerinin nasıl yapılacağına dair adımları inceliyoruz. Temel işlev.
- Easy handle
- curl easy seçenekleri
- Transferleri yürütme (Drive)
- Geri çağırımlar (Callbacks)
- Bağlantı kontrolü
- Transfer kontrolü
- Kimlik Doğrulama
- Temizleme
- Transfer sonrası bilgi
Easy handle
libcurl ile öğrenmeniz gereken temeller:
Önce bir "easy handle" oluşturursunuz, bu gerçekten bir transfere olan tutamacınızdır:
CURL *easy_handle = curl_easy_init();
Daha sonra yaklaşan transferi kontrol etmek için o handle'da seçenekleri ayarlarsınız. Bu örnek URL'yi ayarlar:
/* üzerinde çalışılacak URL'yi ayarla */
res = curl_easy_setopt(easy_handle, CURLOPT_URL, "http://example.com/");
curl_easy_setopt() CURLE_OK döndürürse, seçeneği sorunsuz bir şekilde sakladığını biliriz.
Easy handle oluşturmak ve üzerinde seçenekler ayarlamak, herhangi bir transferin gerçekleşmesini sağlamaz ve genellikle libcurl'ün isteğinizi daha sonra transfer gerçekleştiğinde kullanılmak üzere saklamasından başka pek bir şey yapmaz. Sözdizimi kontrolü ve girdinin doğrulanmasının çoğu da ertelenebilir, bu nedenle curl_easy_setopt şikayet etmedi diye, girdinin doğru ve geçerli olduğu anlamına gelmez; daha sonra bir hata döndürülebilir.
Daha fazlasını easy seçenekleri hakkındaki ayrı bölümünde okuyun.
Easy handle'ınız için seçenekleri ayarlamayı bitirdiğinizde, gerçek transferi başlatabilirsiniz.
Transferin gerçek performansı, uygulamanızda ne tür bir davranış istediğinize ve libcurl'ün mimarinize en iyi nasıl entegre edildiğine bağlı olarak farklı yöntemler ve işlev çağrıları kullanılarak yapılabilir. Bunlar daha sonra bu bölümde daha ayrıntılı olarak açıklanmaktadır.
Transfer devam ederken libcurl, veri iletmek, veri okumak ve çeşitli şeyler yapmak için geri çağırımlar (callbacks) olarak bilinen belirtilen işlevlerinizi çağırır.
Transfer tamamlandıktan sonra, başarılı olup olmadığını anlayabilir ve transfer sırasında libcurl'ün topladığı istatistikleri ve diğer bilgileri easy handle'dan çıkarabilirsiniz. Transfer sonrası bilgi bölümüne bakın.
Yeniden kullanım (Reuse)
Easy handle'lar yeniden kullanılmak üzere tasarlanmıştır. Easy handle ile tek bir transfer yaptığınızda, bir sonraki transferiniz için hemen tekrar kullanabilirsiniz. Bundan elde edilecek çok fazla kazanç vardır.
Tüm seçenekler "yapışkandır". Aynı handle ile ikinci bir transfer yaparsanız, aynı seçenekler kullanılır. Siz onları tekrar değiştirene veya handle üzerinde curl_easy_reset() çağırana kadar handle'da ayarlı kalırlar.
Sıfırlama (Reset)
curl_easy_reset() çağrılarak, verilen easy handle için tüm seçenekler sıfırlanır ve varsayılan değerlerine geri döndürülür. Handle ilk oluşturulduğunda seçeneklerin sahip olduğu değerlerle aynıdır. Önbellekler bozulmadan kalır.
Çoğaltma (Duplicate)
Bir easy handle, şu anda ayarlanmış tüm seçenekleriyle birlikte, curl_easy_duphandle() kullanılarak çoğaltılabilir. Kendisine iletilen handle'ın bir kopyasını döndürür.
Önbellekler ve diğer durum bilgileri taşınmaz.
curl easy seçenekleri
O transferin nasıl yapılacağını kontrol etmek için easy handle'da seçenekler ayarlarsınız veya bazı durumlarda aslında seçenekleri ayarlayabilir ve transfer devam ederken transferin davranışını değiştirebilirsiniz. Seçenekleri curl_easy_setopt() ile ayarlarsınız ve handle'ı, ayarlamak istediğiniz seçeneği ve seçeneğin argümanını sağlarsınız. Tüm seçenekler tam olarak bir argüman alır ve curl_easy_setopt() çağrılarına her zaman tam olarak üç parametre iletmelisiniz.
curl_easy_setopt() çağrısı birkaç yüz farklı seçeneği kabul ettiğinden ve çeşitli seçenekler çeşitli farklı türde argümanları kabul ettiğinden, ayrıntıları okumak ve tam olarak o seçeneğin desteklediği ve beklediği argüman türünü sağlamak önemlidir. Yanlış türü iletmek, beklenmedik yan etkilere veya anlaşılması zor aksaklıklara yol açabilir.
Belki de her transferin ihtiyaç duyduğu en önemli seçenek URL'dir. libcurl hangi URL ile ilgili olduğunu bilmeden bir transfer gerçekleştiremez, bu yüzden ona söylemelisiniz. Tüm seçenekler CURLOPT_ ve ardından açıklayıcı adla - tümü büyük harfler kullanılarak - ön eklendiğinden, URL seçeneği adı CURLOPT_URL'dir. http://example.com HTTP içeriğini almak için URL'yi ayarlayan örnek bir satır şöyle görünebilir:
CURLcode ret = curl_easy_setopt(easy, CURLOPT_URL, "http://example.com");
Tekrar: bu sadece handle'daki seçeneği ayarlar. Gerçek transferi veya herhangi bir şeyi yapmaz. Sadece libcurl'e verilen dizeyi kopyalamasını söyler ve eğer bu çalışırsa OK döndürür.
Hiçbir şeyin yanlış gitmediğini görmek için dönüş kodunu kontrol etmek elbette iyi bir formdur.
Seçenekleri al
curl_easy_setopt() ile daha önce ayarlanmış değerleri çıkarmanın bir yolu yoktur. Daha önce ayarladığınız bilgileri tekrar çıkarabilmeniz gerekiyorsa, bu verileri uygulamanızda kendinizin takip etmesini öneririz.
- Sayısal seçenekleri ayarla
- Dize (string) seçeneklerini ayarla
- TLS seçenekleri
- Tüm seçenekler
- Seçenek bilgisini al
Sayısal seçenekleri ayarla
curl_easy_setopt(), 3. argümanın duruma bağlı olarak farklı türler kullanabildiği bir değişken argümanlı (vararg) işlev olduğundan, normal C dili tür dönüşümü yapılamaz. Belgeler size öyle söylüyorsa, bir int değil, gerçekten bir long ilettiğinizden emin olmalısınız. Aynı boyutta oldukları mimarilerde herhangi bir sorun yaşamayabilirsiniz ancak hepsi böyle çalışmaz. Benzer şekilde, curl_off_t türünü kabul eden seçenekler için, o türü ve başka hiçbir türü kullanmayan bir argüman iletmeniz çok önemlidir.
Bir long zorla:
curl_easy_setopt(handle, CURLOPT_TIMEOUT, 5L); /* 5 saniye zaman aşımı */
Bir curl_off_t zorla:
curl_off_t no_larger_than = 0x50000;
curl_easy_setopt(handle, CURLOPT_MAXFILESIZE_LARGE, no_larger_than);
Dize (string) seçeneklerini ayarla
Şu anda curl_easy_setopt() için üçüncü argümanı olarak bir dize kabul eden 80'den fazla seçenek vardır.
Bir handle'da bir dize ayarlandığında, libcurl verileri hemen kopyalar, böylece uygulamanın transfer yapılırken verileri etrafta tutması gerekmez - bir önemli istisna dışında: CURLOPT_POSTFIELDS.
Handle'da bir URL ayarla:
curl_easy_setopt(handle, CURLOPT_URL, "https://example.com");
CURLOPT_POSTFIELDS
libcurl'ün her zaman verileri kopyaladığı kuralının istisnası olan CURLOPT_POSTFIELDS, yalnızca verilere işaretçiyi saklar, yani bu seçeneği kullanan bir uygulama, ilişkili transferin tüm süresi boyunca belleği etrafta tutmalıdır.
Bu sorunluysa, bir alternatif bunun yerine verileri kopyalayan CURLOPT_COPYPOSTFIELDS kullanmaktır. Veriler ikiliyse ve bir null baytının ilk varlığında durmuyorsa, CURLOPT_POSTFIELDSIZE'ın bu seçenek kullanılmadan önce ayarlandığından emin olun.
Neden?
CURLOPT_POSTFIELDS'ın bir istisna olmasının nedeni mirastan kaynaklanmaktadır. Başlangıçta (curl 7.17.0'dan önce), libcurl hiçbir dize argümanını kopyalamıyordu ve bu mevcut davranış tanıtıldığında, bu seçenek davranışı bozmadan dönüştürülemedi, bu yüzden eskisi gibi çalışmaya devam etmek zorundaydı. Şimdi bu göze batıyor, çünkü başka hiçbir seçenek bunu yapmıyor...
C++
libcurl'ü bir C++ programından kullanırsanız, libcurl'ün bir dize beklediği yere bir dize nesnesi iletemeyeceğinizi hatırlamak önemlidir. Null ile sonlandırılmış bir C dizesi olmalıdır. Genellikle bunu c_str() yöntemiyle gerçekleştirebilirsiniz.
Örneğin, URL'yi bir dize nesnesinde tutun ve handle'da ayarlayın:
std::string url("https://example.com/");
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
TLS seçenekleri
Bunu yazarken, libcurl'ün SSL ve TLS'yi nasıl yapacağını kontrol etmek için ayrılmış curl_easy_setopt için kırktan az olmayan farklı seçenek vardır.
TLS kullanılarak yapılan transferler güvenli varsayılanları kullanır ancak curl birçok farklı senaryoda ve kurulumda kullanıldığından, bu davranışları değiştirmek isteyeceğiniz durumlara düşme ihtimaliniz vardır.
Protokol sürümü
CURLOPT_SSLVERSION ve CURLOPT_PROXY_SSLVERSION ile sizin için kabul edilebilir SSL veya TLS protokol aralığını belirtebilirsiniz. Geleneksel olarak SSL ve TLS protokol sürümleri zamanla kusurlu ve kullanıma uygunsuz bulundu ve curl'ün kendisi zamanla varsayılan alt sürümünü yükseltse bile, yalnızca en son ve en güvenli protokol sürümlerini kullanmayı tercih etmek isteyebilirsiniz.
Bu seçenekler en düşük kabul edilebilir sürümü ve isteğe bağlı olarak maksimumu alır. Sunucu bu koşulla bir bağlantı kuramazsa, transfer başarısız olur.
Örnek:
curl_easy_setopt(easy, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2);
Protokol ayrıntıları ve davranış
CURLOPT_SSL_CIPHER_LIST ve CURLOPT_PROXY_SSL_CIPHER_LIST ayarlayarak hangi şifrelerin kullanılacağını seçebilirsiniz.
CURLOPT_SSL_FALSESTART ile SSL "False Start"ı etkinleştirmeyi isteyebilirsiniz ve CURLOPT_SSL_OPTIONS kullanarak ince ayar yapılacak birkaç başka davranış değişikliği vardır.
Doğrulama
TLS kullanan bir istemcinin, konuştuğu sunucunun doğru ve güvenilir sunucu olduğunu doğrulaması gerekir. Bu, sunucunun sertifikasının curl'ün genel anahtarına sahip olduğu bir Sertifika Otoritesi (CA) tarafından imzalandığını ve sertifikanın sunucunun adını içerdiğini doğrulayarak yapılır. Bu kontrollerden herhangi birinin başarısız olması, transferin başarısız olmasına neden olur.
Geliştirme amaçları ve deneme için, curl bir uygulamanın sunucu veya bir HTTPS proxy için bu kontrollerden birini veya her ikisini de kapatmasına izin verir.
-
CURLOPT_SSL_VERIFYPEER, sertifikanın güvenilir bir CA tarafından imzalandığı kontrolünü yönetir. -
CURLOPT_SSL_VERIFYHOST, sertifika içindeki adın kontrolünü yönetir. -
CURLOPT_PROXY_SSL_VERIFYPEER,CURLOPT_SSL_VERIFYPEER'ın proxy sürümüdür. -
CURLOPT_PROXY_SSL_VERIFYHOST,CURLOPT_SSL_VERIFYHOST'un proxy sürümüdür.
İsteğe bağlı olarak, CURLOPT_PINNEDPUBLICKEY veya CURLOPT_PROXY_PINNEDPUBLICKEY kullanarak curl'e sertifikanın genel anahtarını bilinen bir karmaya karşı doğrulamasını söyleyebilirsiniz. Burada da bir uyuşmazlık transferin başarısız olmasına neden olur.
Kimlik Doğrulama
TLS İstemci sertifikaları
TLS kullanırken ve sunucu istemciden sertifikaları kullanarak kimlik doğrulamasını istediğinde, genellikle CURLOPT_SSLKEY ve CURLOPT_SSLCERT kullanarak özel anahtarı ve ilgili istemci sertifikasını belirtirsiniz. Anahtarın şifresinin de genellikle CURLOPT_SSLKEYPASSWD ile ayarlanması gerekir.
Yine, HTTPS proxy'lerine bağlantılar için aynı seçenek seti ayrı olarak mevcuttur: CURLOPT_PROXY_SSLKEY, CURLOPT_PROXY_SSLCERT vb.
TLS yetkilendirmesi
TLS bağlantıları Güvenli Uzak Şifreler (Secure Remote Passwords) adı verilen (nadiren kullanılan) bir özellik sunar. Bunu kullanarak, bir ad ve şifre kullanarak sunucu için bağlantıyı doğrularsınız ve seçenekler CURLOPT_TLSAUTH_USERNAME ve CURLOPT_TLSAUTH_PASSWORD olarak adlandırılır.
STARTTLS
Bağlantıyı TLS'ye yükseltmek için STARTTLS yöntemini kullanan protokoller (FTP, IMAP, POP3 ve SMTP) için, genellikle bir URL belirtirken curl'e protokolün TLS olmayan sürümünü kullanmasını söylersiniz ve ardından CURLOPT_USE_SSL seçeneğiyle curl'den TLS'yi etkinleştirmesini istersiniz.
Bu seçenek, TLS'ye yükseltemezse curl'ün devam etmesine izin veren bir istemciye izin verir, ancak bu, güvenli olmayan bir protokol kullandığınızı fark etmeden kullanabileceğiniz için önerilen bir yol değildir.
/* bunun için SSL kullanımını zorunlu kıl, yoksa başarısız ol */
curl_easy_setopt(curl, CURLOPT_USE_SSL, CURLUSESSL_ALL);
Tüm seçenekler
Bu, curl_easy_setopt() için mevcut seçeneklerin bir tablosudur.
| Seçenek | Amaç |
|---|---|
CURLOPT_ABSTRACT_UNIX_SOCKET | soyut Unix etki alanı soketi |
CURLOPT_ACCEPT_ENCODING | HTTP indirmelerinin otomatik açılması |
CURLOPT_ACCEPTTIMEOUT_MS | FTP sunucusunun geri bağlanmasını beklerken zaman aşımı |
CURLOPT_ADDRESS_SCOPE | IPv6 adresleri için kapsam kimliği |
CURLOPT_ALTSVC_CTRL | alt-svc davranışını kontrol et |
CURLOPT_ALTSVC | alt-svc önbellek dosya adı |
CURLOPT_APPEND | uzak dosyaya ekle |
CURLOPT_AUTOREFERER | referer başlığını otomatik olarak güncelle |
CURLOPT_AWS_SIGV4 | V4 imzası |
CURLOPT_BUFFERSIZE | alma tampon boyutu |
CURLOPT_CA_CACHE_TIMEOUT | önbelleğe alınan sertifika depoları için kullanım ömrü |
CURLOPT_CAINFO_BLOB | PEM formatında Sertifika Otoritesi (CA) demeti |
CURLOPT_CAINFO | Sertifika Otoritesi (CA) demetine giden yol |
CURLOPT_CAPATH | CA sertifikalarını tutan dizin |
CURLOPT_CERTINFO | SSL sertifika bilgisini iste |
CURLOPT_CHUNK_BGN_FUNCTION | FTP joker eşleşmeli bir transferden önce geri çağırım |
CURLOPT_CHUNK_DATA | FTP yığın geri çağırımlarına iletilen işaretçi |
CURLOPT_CHUNK_END_FUNCTION | FTP joker eşleşmeli bir transferden sonra geri çağırım |
CURLOPT_CLOSESOCKETDATA | soket kapatma geri çağırımına iletilen işaretçi |
CURLOPT_CLOSESOCKETFUNCTION | soket kapatma değişimi için geri çağırım |
CURLOPT_CONNECT_ONLY | hedef sunucuya bağlanıldığında dur |
CURLOPT_CONNECT_TO | URL'nin ana bilgisayarı ve portu yerine belirli bir ana bilgisayara ve porta bağlan |
CURLOPT_CONNECTTIMEOUT_MS | bağlanma aşaması için zaman aşımı |
CURLOPT_CONNECTTIMEOUT | bağlanma aşaması için zaman aşımı |
CURLOPT_CONV_FROM_NETWORK_FUNCTION | verileri ağdan ana bilgisayar kodlamasına dönüştür |
CURLOPT_CONV_FROM_UTF8_FUNCTION | verileri UTF8'den ana bilgisayar kodlamasına dönüştür |
CURLOPT_CONV_TO_NETWORK_FUNCTION | verileri ana bilgisayar kodlamasından ağa dönüştür |
CURLOPT_COOKIE | HTTP Çerez başlığı |
CURLOPT_COOKIEFILE | çerezlerin okunacağı dosya adı |
CURLOPT_COOKIEJAR | çerezlerin saklanacağı dosya adı |
CURLOPT_COOKIELIST | bellekte tutulan çerezleri ekle veya değiştir |
CURLOPT_COOKIESESSION | yeni bir çerez oturumu başlat |
CURLOPT_COPYPOSTFIELDS | libcurl'ün verileri POST'a kopyalamasını sağla |
CURLOPT_CRLF | CRLF dönüşümü |
CURLOPT_CRLFILE | Sertifika İptal Listesi dosyası |
CURLOPT_CURLU | CURLU * formatında URL |
CURLOPT_CUSTOMREQUEST | özel istek yöntemi |
CURLOPT_DEBUGDATA | hata ayıklama geri çağırımına iletilen işaretçi |
CURLOPT_DEBUGFUNCTION | hata ayıklama geri çağırımı |
CURLOPT_DEFAULT_PROTOCOL | URL eksikse kullanılacak varsayılan protokol |
CURLOPT_DIRLISTONLY | bir dizin listesinde sadece adları iste |
CURLOPT_DISALLOW_USERNAME_IN_URL | URL'de kullanıcı adı belirtilmesine izin verme |
CURLOPT_DNS_CACHE_TIMEOUT | DNS önbellek girişleri için kullanım ömrü |
CURLOPT_DNS_INTERFACE | DNS üzerinden konuşulacak arayüz |
CURLOPT_DNS_LOCAL_IP4 | DNS çözümlemelerinin bağlanacağı IPv4 adresi |
CURLOPT_DNS_LOCAL_IP6 | DNS çözümlemelerinin bağlanacağı IPv6 adresi |
CURLOPT_DNS_SERVERS | kullanılacak DNS sunucuları |
CURLOPT_DNS_SHUFFLE_ADDRESSES | ana bilgisayar adı için IP adreslerini karıştır |
CURLOPT_DNS_USE_GLOBAL_CACHE | küresel DNS önbelleği |
CURLOPT_DOH_SSL_VERIFYHOST | DoH SSL sertifikasındaki ana bilgisayar adını doğrula |
CURLOPT_DOH_SSL_VERIFYPEER | DoH SSL sertifikasını doğrula |
CURLOPT_DOH_SSL_VERIFYSTATUS | DoH SSL sertifikasının durumunu doğrula |
CURLOPT_DOH_URL | DNS-over-HTTPS URL'sini sağla |
CURLOPT_EGDSOCKET | EGD soket yolu |
CURLOPT_ERRORBUFFER | hata mesajları için hata arabelleği |
CURLOPT_EXPECT_100_TIMEOUT_MS | Expect: 100-continue yanıtı için zaman aşımı |
CURLOPT_FAILONERROR | HTTP yanıtı >= 400 olduğunda istek başarısız olsun |
CURLOPT_FILETIME | uzak kaynağın değişiklik zamanını al |
CURLOPT_FNMATCH_DATA | fnmatch geri çağırımına iletilen işaretçi |
CURLOPT_FNMATCH_FUNCTION | joker eşleşme geri çağırımı |
CURLOPT_FOLLOWLOCATION | HTTP 3xx yönlendirmelerini takip et |
CURLOPT_FORBID_REUSE | kullanımdan hemen sonra bağlantının kapatılmasını sağla |
CURLOPT_FRESH_CONNECT | yeni bir bağlantı kullanılmasını zorla |
CURLOPT_FTP_ACCOUNT | FTP için hesap bilgisi |
CURLOPT_FTP_ALTERNATIVE_TO_USER | FTP ile USER yerine kullanılacak komut |
CURLOPT_FTP_CREATE_MISSING_DIRS | FTP ve SFTP için eksik dizinleri oluştur |
CURLOPT_FTP_FILEMETHOD | FTP için dizin dolaşma yöntemini seç |
CURLOPT_FTP_RESPONSE_TIMEOUT | FTP yanıtı için beklemeye izin verilen süre |
CURLOPT_FTP_SKIP_PASV_IP | PASV yanıtındaki IP adresini yoksay |
CURLOPT_FTP_SSL_CCC | FTP ile kimlik doğrulamasından sonra SSL'i tekrar kapat |
CURLOPT_FTP_USE_EPRT | FTP için EPRT kullan |
CURLOPT_FTP_USE_EPSV | FTP için EPSV kullan |
CURLOPT_FTP_USE_PRET | FTP için PRET kullan |
CURLOPT_FTPPORT | FTP transferini aktif hale getir |
CURLOPT_FTPSSLAUTH | TLS ve SSL deneme sırası |
CURLOPT_GSSAPI_DELEGATION | izin verilen GSS-API yetkilendirmesi |
CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS | happy eyeballs için ipv6 başlama avantajı |
CURLOPT_HAPROXY_CLIENT_IP | HAProxy PROXY protokolü istemci IP'sini ayarla |
CURLOPT_HAPROXYPROTOCOL | HAProxy PROXY protokolü v1 başlığını gönder |
CURLOPT_HEADER | başlıkları veri akışına geçir |
CURLOPT_HEADERDATA | başlık geri çağırımına iletilecek işaretçi |
CURLOPT_HEADERFUNCTION | başlık verilerini alan geri çağırım |
CURLOPT_HEADEROPT | HTTP başlıklarını hem proxy'ye hem de ana bilgisayara veya ayrı ayrı gönder |
CURLOPT_HSTS_CTRL | HSTS davranışını kontrol et |
CURLOPT_HSTS | HSTS önbellek dosya adı |
CURLOPT_HSTSREADDATA | HSTS okuma geri çağırımına iletilen işaretçi |
CURLOPT_HSTSREADFUNCTION | HSTS ana bilgisayarları için okuma geri çağırımı |
CURLOPT_HSTSWRITEDATA | HSTS yazma geri çağırımına iletilen işaretçi |
CURLOPT_HSTSWRITEFUNCTION | HSTS ana bilgisayarları için yazma geri çağırımı |
CURLOPT_HTTP09_ALLOWED | HTTP/0.9 yanıtına izin ver |
CURLOPT_HTTP200ALIASES | HTTP 200 OK için alternatif eşleşmeler |
CURLOPT_HTTP_CONTENT_DECODING | HTTP içerik çözme kontrolü |
CURLOPT_HTTP_TRANSFER_DECODING | HTTP transfer çözme kontrolü |
CURLOPT_HTTP_VERSION | kullanılacak HTTP protokol sürümü |
CURLOPT_HTTPAUTH | denecek HTTP sunucusu kimlik doğrulama yöntemleri |
CURLOPT_HTTPGET | bir HTTP GET isteği iste |
CURLOPT_HTTPHEADER | HTTP başlıkları seti |
CURLOPT_HTTPPOST | çok parçalı (multipart) formpost içeriği |
CURLOPT_HTTPPROXYTUNNEL | HTTP proxy üzerinden tünel aç |
CURLOPT_IGNORE_CONTENT_LENGTH | içerik uzunluğunu (content length) yoksay |
CURLOPT_INFILESIZE_LARGE | gönderilecek girdi dosyasının boyutu |
CURLOPT_INFILESIZE | gönderilecek girdi dosyasının boyutu |
CURLOPT_INTERFACE | giden trafik için kaynak arayüz |
CURLOPT_INTERLEAVEDATA | RTSP interleave geri çağırımına iletilen işaretçi |
CURLOPT_INTERLEAVEFUNCTION | RTSP interleaved verileri için geri çağırım |
CURLOPT_IOCTLDATA | G/Ç (I/O) geri çağırımına iletilen işaretçi |
CURLOPT_IOCTLFUNCTION | G/Ç işlemleri için geri çağırım |
CURLOPT_IPRESOLVE | kullanılacak IP protokol sürümü |
CURLOPT_ISSUERCERT_BLOB | bellek bloğundan veren (issuer) SSL sertifikası |
CURLOPT_ISSUERCERT | veren (issuer) SSL sertifikası dosya adı |
CURLOPT_KEEP_SENDING_ON_ERROR | erken HTTP yanıtı >= 300'de göndermeye devam et |
CURLOPT_KEYPASSWD | özel anahtar için parola |
CURLOPT_KRBLEVEL | FTP kerberos güvenlik seviyesi |
CURLOPT_LOCALPORT | soket için kullanılacak yerel port numarası |
CURLOPT_LOCALPORTRANGE | denenecek ek yerel port sayısı |
CURLOPT_LOGIN_OPTIONS | giriş seçenekleri |
CURLOPT_LOW_SPEED_LIMIT | saniye başına bayt cinsinden düşük hız sınırı |
CURLOPT_LOW_SPEED_TIME | düşük hız sınırı zaman aralığı |
CURLOPT_MAIL_AUTH | SMTP kimlik doğrulama adresi |
CURLOPT_MAIL_FROM | SMTP gönderen adresi |
CURLOPT_MAIL_RCPT_ALLOWFAILS | RCPT TO komutunun bazı alıcılar için başarısız olmasına izin ver |
CURLOPT_MAIL_RCPT | SMTP posta alıcıları listesi |
CURLOPT_MAX_RECV_SPEED_LARGE | veri indirme hızını sınırla |
CURLOPT_MAX_SEND_SPEED_LARGE | veri yükleme hızını sınırla |
CURLOPT_MAXAGE_CONN | bir bağlantıyı yeniden kullanmak için izin verilen maksimum boşta kalma süresi |
CURLOPT_MAXCONNECTS | maksimum bağlantı önbellek boyutu |
CURLOPT_MAXFILESIZE_LARGE | indirmeye izin verilen maksimum dosya boyutu |
CURLOPT_MAXFILESIZE | indirmeye izin verilen maksimum dosya boyutu |
CURLOPT_MAXLIFETIME_CONN | bir bağlantıyı yeniden kullanmak için izin verilen maksimum ömür (oluşturulduğundan beri) |
CURLOPT_MAXREDIRS | izin verilen maksimum yönlendirme sayısı |
CURLOPT_MIME_OPTIONS | MIME seçenek bayraklarını ayarla |
CURLOPT_MIMEPOST | mime yapısından veri gönder |
CURLOPT_NETRC_FILE | .netrc bilgisinin okunacağı dosya adı |
CURLOPT_NETRC | .netrc kullanımını etkinleştir |
CURLOPT_NEW_DIRECTORY_PERMS | uzaktan oluşturulan dizinler için izinler |
CURLOPT_NEW_FILE_PERMS | uzaktan oluşturulan dosyalar için izinler |
CURLOPT_NOBODY | indirme isteğini gövdeyi almadan yap |
CURLOPT_NOPROGRESS | ilerleme ölçeri kapat |
CURLOPT_NOPROXY | belirli ana bilgisayarlar için proxy kullanımını devre dışı bırak |
CURLOPT_NOSIGNAL | tüm sinyal işlemeyi atla |
CURLOPT_OPENSOCKETDATA | açık soket geri çağırımına iletilen işaretçi |
CURLOPT_OPENSOCKETFUNCTION | soket açma için geri çağırım |
CURLOPT_PASSWORD | kimlik doğrulamasında kullanılacak şifre |
CURLOPT_PATH_AS_IS | nokta nokta dizilerini işleme |
CURLOPT_PINNEDPUBLICKEY | sabitlenmiş genel anahtar |
CURLOPT_PIPEWAIT | pipelining/multiplexing için bekle |
CURLOPT_PORT | bağlanılacak uzak port numarası |
CURLOPT_POST | bir HTTP POST yap |
CURLOPT_POSTFIELDS | sunucuya POST edilecek veriler |
CURLOPT_POSTFIELDSIZE_LARGE | işaret edilen POST verilerinin boyutu |
CURLOPT_POSTFIELDSIZE | işaret edilen POST verilerinin boyutu |
CURLOPT_POSTQUOTE | transferden sonra çalıştırılacak (S)FTP komutları |
CURLOPT_POSTREDIR | bir HTTP POST yönlendirmesinde nasıl davranılacağı |
CURLOPT_PRE_PROXY | kullanılacak ön proxy ana bilgisayarı |
CURLOPT_PREQUOTE | bir FTP transferinden önce çalıştırılacak komutlar |
CURLOPT_PREREQDATA | ön istek geri çağırımına iletilen işaretçi |
CURLOPT_PREREQFUNCTION | bir bağlantı olduğunda çağrılan kullanıcı geri çağırımı |
CURLOPT_PRIVATE | özel bir işaretçi sakla |
CURLOPT_PROGRESSDATA | ilerleme geri çağırımına iletilen işaretçi |
CURLOPT_PROGRESSFUNCTION | ilerleme ölçer geri çağırımı |
CURLOPT_PROTOCOLS_STR | izin verilen protokoller |
CURLOPT_PROTOCOLS | izin verilen protokoller |
CURLOPT_PROXY_CAINFO_BLOB | PEM formatında proxy Sertifika Otoritesi (CA) demeti |
CURLOPT_PROXY_CAINFO | proxy Sertifika Otoritesi (CA) demetine giden yol |
CURLOPT_PROXY_CAPATH | HTTPS proxy CA sertifikalarını tutan dizin |
CURLOPT_PROXY_CRLFILE | HTTPS proxy Sertifika İptal Listesi dosyası |
CURLOPT_PROXY_ISSUERCERT_BLOB | bellek bloğundan proxy veren (issuer) SSL sertifikası |
CURLOPT_PROXY_ISSUERCERT | proxy veren (issuer) SSL sertifikası dosya adı |
CURLOPT_PROXY_KEYPASSWD | proxy özel anahtarı için parola |
CURLOPT_PROXY_PINNEDPUBLICKEY | https proxy için sabitlenmiş genel anahtar |
CURLOPT_PROXY_SERVICE_NAME | proxy kimlik doğrulama hizmet adı |
CURLOPT_PROXY_SSL_CIPHER_LIST | HTTPS proxy için kullanılacak şifreler |
CURLOPT_PROXY_SSL_OPTIONS | HTTPS proxy SSL davranış seçenekleri |
CURLOPT_PROXY_SSL_VERIFYHOST | proxy sertifikasının adını ana bilgisayara karşı doğrula |
CURLOPT_PROXY_SSL_VERIFYPEER | proxy'nin SSL sertifikasını doğrula |
CURLOPT_PROXY_SSLCERT_BLOB | bellek bloğundan SSL proxy istemci sertifikası |
CURLOPT_PROXY_SSLCERT | HTTPS proxy istemci sertifikası |
CURLOPT_PROXY_SSLCERTTYPE | proxy istemci SSL sertifikasının türü |
CURLOPT_PROXY_SSLKEY_BLOB | bellek bloğundan proxy sertifikası için özel anahtar |
CURLOPT_PROXY_SSLKEY | HTTPS proxy istemci sertifikası için özel anahtar dosyası |
CURLOPT_PROXY_SSLKEYTYPE | proxy özel anahtar dosyasının türü |
CURLOPT_PROXY_SSLVERSION | tercih edilen HTTPS proxy TLS sürümü |
CURLOPT_PROXY_TLS13_CIPHERS | proxy TLS 1.3 için şifre takımları |
CURLOPT_PROXY_TLSAUTH_PASSWORD | proxy TLS kimlik doğrulaması için kullanılacak şifre |
CURLOPT_PROXY_TLSAUTH_TYPE | HTTPS proxy TLS kimlik doğrulama yöntemleri |
CURLOPT_PROXY_TLSAUTH_USERNAME | proxy TLS kimlik doğrulaması için kullanılacak kullanıcı adı |
CURLOPT_PROXY_TRANSFER_MODE | proxy için URL'ye FTP transfer modunu ekle |
CURLOPT_PROXY | kullanılacak proxy |
CURLOPT_PROXYAUTH | HTTP proxy kimlik doğrulama yöntemleri |
CURLOPT_PROXYHEADER | proxy'ye iletilecek HTTP başlıkları seti |
CURLOPT_PROXYPASSWORD | proxy kimlik doğrulamasıyla kullanılacak şifre |
CURLOPT_PROXYPORT | proxy'nin dinlediği port numarası |
CURLOPT_PROXYTYPE | proxy protokol türü |
CURLOPT_PROXYUSERNAME | proxy kimlik doğrulaması için kullanılacak kullanıcı adı |
CURLOPT_PROXYUSERPWD | proxy kimlik doğrulaması için kullanılacak kullanıcı adı ve şifre |
CURLOPT_PUT | bir HTTP PUT isteği yap |
CURLOPT_QUICK_EXIT | hızlı çıkışa izin ver |
CURLOPT_QUOTE | transferden önce çalıştırılacak (S)FTP komutları |
CURLOPT_RANDOM_FILE | rastgele verilerin okunacağı dosya |
CURLOPT_RANGE | istenecek bayt aralığı |
CURLOPT_READDATA | okuma geri çağırımına iletilen işaretçi |
CURLOPT_READFUNCTION | veri yüklemeleri için okuma geri çağırımı |
CURLOPT_REDIR_PROTOCOLS_STR | yönlendirmeye izin verilen protokoller |
CURLOPT_REDIR_PROTOCOLS | yönlendirmeye izin verilen protokoller |
CURLOPT_REFERER | HTTP referer başlığı |
CURLOPT_REQUEST_TARGET | bu istek için alternatif hedef |
CURLOPT_RESOLVE | IP adresi çözümlemeleri için özel ana bilgisayar adı sağla |
CURLOPT_RESOLVER_START_DATA | çözümleyici başlatma geri çağırımına iletilen işaretçi |
CURLOPT_RESOLVER_START_FUNCTION | yeni bir ad çözümlemesi başlatılmadan önce çağrılan geri çağırım |
CURLOPT_RESUME_FROM_LARGE | transferi sürdürmek için ofset |
CURLOPT_RESUME_FROM | transferi sürdürmek için ofset |
CURLOPT_RTSP_CLIENT_CSEQ | RTSP istemci CSEQ numarası |
CURLOPT_RTSP_REQUEST | RTSP isteği |
CURLOPT_RTSP_SERVER_CSEQ | RTSP sunucu CSEQ numarası |
CURLOPT_RTSP_SESSION_ID | RTSP oturum kimliği |
CURLOPT_RTSP_STREAM_URI | RTSP akış (stream) URI |
CURLOPT_RTSP_TRANSPORT | RTSP Transport: başlık |
CURLOPT_SASL_AUTHZID | yetkilendirme kimliği (rol yapılacak kimlik) |
CURLOPT_SASL_IR | ilk pakette ilk yanıtı gönder |
CURLOPT_SEEKDATA | seek geri çağırımına iletilen işaretçi |
CURLOPT_SEEKFUNCTION | girdi akışında arama (seeking) yapmak için kullanıcı geri çağırımı |
CURLOPT_SERVER_RESPONSE_TIMEOUT | sunucu yanıtı için saniye cinsinden beklemeye izin verilen süre |
CURLOPT_SERVER_RESPONSE_TIMEOUT_MS | sunucu yanıtı için milisaniye cinsinden beklemeye izin verilen süre |
CURLOPT_SERVICE_NAME | kimlik doğrulama hizmet adı |
CURLOPT_SHARE | kullanılacak paylaşım handle'ı |
CURLOPT_SOCKOPTDATA | sockopt geri çağırımına iletilecek işaretçi |
CURLOPT_SOCKOPTFUNCTION | soket seçeneklerini ayarlamak için geri çağırım |
CURLOPT_SOCKS5_AUTH | SOCKS5 proxy kimlik doğrulama yöntemleri |
CURLOPT_SOCKS5_GSSAPI_NEC | socks proxy gssapi pazarlık koruması |
CURLOPT_SOCKS5_GSSAPI_SERVICE | SOCKS5 proxy kimlik doğrulama hizmet adı |
CURLOPT_SSH_AUTH_TYPES | SFTP ve SCP için yetkilendirme türleri |
CURLOPT_SSH_COMPRESSION | SSH sıkıştırmasını etkinleştir |
CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 | SSH sunucusu genel anahtarının MD5 sağlama toplamı |
CURLOPT_SSH_HOST_PUBLIC_KEY_SHA256 | SSH sunucusu genel anahtarının SHA256 karması |
CURLOPT_SSH_HOSTKEYDATA | SSH ana bilgisayar anahtarı geri çağırımına iletilecek işaretçi |
CURLOPT_SSH_HOSTKEYFUNCTION | ana bilgisayar anahtarını kontrol etmek için geri çağırım |
CURLOPT_SSH_KEYDATA | SSH anahtar geri çağırımına iletilen işaretçi |
CURLOPT_SSH_KEYFUNCTION | bilinen ana bilgisayar eşleştirme mantığı için geri çağırım |
CURLOPT_SSH_KNOWNHOSTS | SSH bilinen ana bilgisayarları tutan dosya adı |
CURLOPT_SSH_PRIVATE_KEYFILE | SSH yetkilendirme için özel anahtar dosyası |
CURLOPT_SSH_PUBLIC_KEYFILE | SSH yetkilendirme için genel anahtar dosyası |
CURLOPT_SSL_CIPHER_LIST | TLS için kullanılacak şifreler |
CURLOPT_SSL_CTX_DATA | ssl_ctx geri çağırımına iletilen işaretçi |
CURLOPT_SSL_CTX_FUNCTION | OpenSSL, wolfSSL veya mbedTLS için SSL bağlam geri çağırımı |
CURLOPT_SSL_EC_CURVES | anahtar değişim eğrileri |
CURLOPT_SSL_ENABLE_ALPN | Uygulama Katmanı Protokol Anlaşması (ALPN) |
CURLOPT_SSL_ENABLE_NPN | NPN kullan |
CURLOPT_SSL_FALSESTART | TLS false start |
CURLOPT_SSL_OPTIONS | SSL davranış seçenekleri |
CURLOPT_SSL_SESSIONID_CACHE | SSL oturum kimliği önbelleğini kullan |
CURLOPT_SSL_VERIFYHOST | sertifikanın adını ana bilgisayara karşı doğrula |
CURLOPT_SSL_VERIFYPEER | eşin SSL sertifikasını doğrula |
CURLOPT_SSL_VERIFYSTATUS | sertifikanın durumunu doğrula |
CURLOPT_SSLCERT_BLOB | bellek bloğundan SSL istemci sertifikası |
CURLOPT_SSLCERT | SSL istemci sertifikası |
CURLOPT_SSLCERTTYPE | istemci SSL sertifikasının türü |
CURLOPT_SSLENGINE_DEFAULT | SSL motorunu varsayılan yap |
CURLOPT_SSLENGINE | SSL motor tanımlayıcısı |
CURLOPT_SSLKEY_BLOB | bellek bloğundan istemci sertifikası için özel anahtar |
CURLOPT_SSLKEY | TLS ve SSL istemci sertifikası için özel anahtar dosyası |
CURLOPT_SSLKEYTYPE | özel anahtar dosyasının türü |
CURLOPT_SSLVERSION | tercih edilen TLS/SSL sürümü |
CURLOPT_STDERR | stderr'i başka bir akışa yönlendir |
CURLOPT_STREAM_DEPENDS_E | bu transferin özel olarak bağlı olduğu akış |
CURLOPT_STREAM_DEPENDS | bu transferin bağlı olduğu akış |
CURLOPT_STREAM_WEIGHT | sayısal akış ağırlığı |
CURLOPT_SUPPRESS_CONNECT_HEADERS | kullanıcı geri çağırımlarından proxy CONNECT yanıt başlıklarını gizle |
CURLOPT_TCP_FASTOPEN | TCP Hızlı Açma |
CURLOPT_TCP_KEEPALIVE | TCP canlı tutma sondalaması |
CURLOPT_TCP_KEEPIDLE | TCP canlı tutma bekleme süresi |
CURLOPT_TCP_KEEPINTVL | TCP canlı tutma aralığı |
CURLOPT_TCP_NODELAY | TCP_NODELAY seçeneği |
CURLOPT_TELNETOPTIONS | telnet seçenekleri seti |
CURLOPT_TFTP_BLKSIZE | TFTP blok boyutu |
CURLOPT_TFTP_NO_OPTIONS | TFTP seçenek istekleri gönderme |
CURLOPT_TIMECONDITION | zaman isteği için koşul seç |
CURLOPT_TIMEOUT_MS | transferin tamamlanmasına izin verilen maksimum süre |
CURLOPT_TIMEOUT | transferin tamamlanmasına izin verilen maksimum süre |
CURLOPT_TIMEVALUE_LARGE | koşullu için zaman değeri |
CURLOPT_TIMEVALUE | koşullu için zaman değeri |
CURLOPT_TLS13_CIPHERS | TLS 1.3 için kullanılacak şifre takımları |
CURLOPT_TLSAUTH_PASSWORD | TLS kimlik doğrulaması için kullanılacak şifre |
CURLOPT_TLSAUTH_TYPE | TLS kimlik doğrulama yöntemleri |
CURLOPT_TLSAUTH_USERNAME | TLS kimlik doğrulaması için kullanılacak kullanıcı adı |
CURLOPT_TRAILERDATA | sondaki başlıklar geri çağırımına iletilen işaretçi |
CURLOPT_TRAILERFUNCTION | sondaki başlıkları göndermek için geri çağırım |
CURLOPT_TRANSFER_ENCODING | HTTP Transfer Encoding iste |
CURLOPT_TRANSFERTEXT | FTP için metin tabanlı bir transfer iste |
CURLOPT_UNIX_SOCKET_PATH | Unix etki alanı soketi |
CURLOPT_UNRESTRICTED_AUTH | kimlik bilgilerini diğer ana bilgisayarlara da gönder |
CURLOPT_UPKEEP_INTERVAL_MS | bağlantı bakım aralığı |
CURLOPT_UPLOAD_BUFFERSIZE | yükleme tampon boyutu |
CURLOPT_UPLOAD | veri yükleme |
CURLOPT_URL | bu transfer için URL |
CURLOPT_USE_SSL | transfer için SSL / TLS kullanılmasını iste |
CURLOPT_USERAGENT | HTTP user-agent başlığı |
CURLOPT_USERNAME | kimlik doğrulamasında kullanılacak kullanıcı adı |
CURLOPT_USERPWD | kimlik doğrulamasında kullanılacak kullanıcı adı ve şifre |
CURLOPT_VERBOSE | ayrıntılı (verbose) mod |
CURLOPT_WILDCARDMATCH | dizin joker karakter transferleri |
CURLOPT_WRITEDATA | yazma geri çağırımına iletilen işaretçi |
CURLOPT_WRITEFUNCTION | alınan verileri yazmak için geri çağırım |
CURLOPT_WS_OPTIONS | WebSocket davranış seçenekleri |
CURLOPT_XFERINFODATA | ilerleme geri çağırımına iletilen işaretçi |
CURLOPT_XFERINFOFUNCTION | ilerleme ölçer geri çağırımı |
CURLOPT_XOAUTH2_BEARER | OAuth 2.0 erişim belirteci |
Seçenek bilgisini al
libcurl, uygulamaların o anda desteklenen tüm easy seçenekleri hakkında bilgi almasına izin veren bir API, aslında bir dizi işlev sunar. Seçenekler için değerleri döndürmez, bunun yerine seçeneğin adı, kimliği ve türü hakkında bilgi verir.
Tüm seçenekler üzerinde yinele
Modern libcurl 300'den fazla farklı seçeneği destekler. curl_easy_option_by_next() kullanımıyla, bir uygulama bilinen tüm seçenekler üzerinde yineleme yapabilir ve bunlar için bir struct curl_easyoption'a işaretçi döndürebilir.
Bu işlev yalnızca bu tam libcurl derlemesinin bildiği seçenekler hakkında bilgi döndürür. Diğer seçenekler daha yeni libcurl derlemelerinde veya derleme zamanında seçenekleri farklı şekilde etkinleştiren/devre dışı bırakan derlemelerde mevcut olabilir.
Örnek, mevcut tüm seçenekler üzerinde yinele:
const struct curl_easyoption *opt;
opt = curl_easy_option_by_next(NULL);
while(opt) {
printf("Name: %s\n", opt->name);
opt = curl_easy_option_by_next(opt);
}
Ada göre belirli bir seçeneği bul
Belirli bir easy seçenek adı verildiğinde, libcurl'den bunun için bir struct curl_easyoption'a işaretçi döndürmesini isteyebilirsiniz. Ad, CURLOPT_ öneki olmadan sağlanmalıdır.
Örnek olarak, bir uygulama libcurl'e CURLOPT_VERBOSE seçeneğini şöyle sorabilir:
const struct curl_easyoption *opt = curl_easy_option_by_name("VERBOSE");
if(opt) {
printf("This option wants CURLoption %x\n", (int)opt->id);
}
Kimliğe göre belirli bir seçeneği bul
Belirli bir easy seçenek kimliği verildiğinde, libcurl'den bunun için bir struct curl_easyoption'a işaretçi döndürmesini isteyebilirsiniz. "ID" (Kimlik), genel curl/curl.h başlık dosyasında sağlandığı şekliyle CURLOPT_ önekli semboldür.
Bir uygulama libcurl'den CURLOPT_VERBOSE seçeneğinin adını şöyle isteyebilir:
const struct curl_easyoption *opt =
curl_easy_option_by_id(CURLOPT_VERBOSE);
if(opt) {
printf("This option has the name: %s\n", opt->name);
}
curl_easyoption yapısı
struct curl_easyoption {
const char *name;
CURLoption id;
curl_easytype type;
unsigned int flags;
};
'flags' içinde tanımlanmış bir anlama sahip tek bir bit vardır: CURLOT_FLAG_ALIAS ayarlanmışsa, bu seçeneğin bir "takma ad" olduğu anlamına gelir. Geriye dönük uyumluluk için sağlanan ve günümüzde daha çok başka bir ada sahip bir seçenek tarafından sunulan bir ad. Bir takma ad için kimliğe bakarsanız, o seçenek için yeni kanonik adı alırsınız.
Transferleri yürütme (Drive transfers)
libcurl, transferi gerçekleştirmek için üç farklı yol sunar. Sizin durumunuzda hangi yolun kullanılacağı tamamen size ve neye ihtiyacınız olduğuna bağlıdır.
-
'easy' arayüzü, eşzamanlı (synchronous) bir şekilde tek bir transfer yapmanızı sağlar. libcurl, transferin tamamını yapar ve tamamlandığında - başarılı veya başarısız - kontrolü uygulamanıza geri döndürür.
-
'multi' arayüzü, aynı anda birden fazla transfer yapmak istediğinizde veya sadece engellemeyen (non-blocking) bir transfer istediğinizde kullanılır.
-
'multi_socket' arayüzü, normal multi arayüzün hafif bir varyasyonudur, ancak olay tabanlıdır (event-based) ve eşzamanlı transfer sayısını yüzlere veya binlere çıkarmayı düşünüyorsanız gerçekten kullanılması önerilen API'dir.
Her birine biraz daha yakından bakalım…
Easy ile yürütme
'easy' (kolay) adı sadece libcurl'ü kullanmanın gerçekten kolay yolu olduğu için seçildi ve easy ile elbette birkaç sınırlama gelir. Örneğin, aynı anda yalnızca bir transfer yapabilmesi ve tüm transferi tek bir işlev çağrısında yapması ve tamamlandığında geri dönmesi gibi:
res = curl_easy_perform( easy_handle );
Sunucu yavaşsa, transfer büyükse veya ağda bazı hoş olmayan zaman aşımları veya benzeri durumlar varsa, bu işlev çağrısı uzun zaman alabilir. Elbette, N saniyeden fazla harcamasına izin vermemek için zaman aşımları ayarlayabilirsiniz ancak bu yine de belirli koşullara bağlı olarak önemli miktarda zaman anlamına gelebilir.
libcurl easy arayüzüyle transfer yaparken uygulamanızın başka bir şey yapmasını istiyorsanız, birden fazla iş parçacığı (threads) kullanmanız gerekir. Easy arayüzünü kullanırken birden fazla eşzamanlı transfer yapmak istiyorsanız, transferlerin her birini kendi iş parçacığında gerçekleştirmeniz gerekir.
Multi ile yürütme
'multi' adı, hepsi aynı tek iş parçacığında yapılan çoklu paralel transferlerde olduğu gibi çoklu (multiple) anlamına gelir. Multi API engellemesizdir (non-blocking), bu nedenle tek transferler için kullanmak da mantıklı olabilir.
Transfer, yukarıda açıklandığı gibi hala bir "easy" CURL * handle'ında ayarlanır, ancak multi arayüzüyle ayrıca oluşturulmuş bir multi CURLM * handle'ına ihtiyacınız vardır ve tüm bireysel transferleri yürütmek için bunu kullanırsınız. Multi handle, bir veya daha fazla easy handle'ı "tutabilir":
CURLM *multi_handle = curl_multi_init();
Bir multi handle ayrıca curl_multi_setopt() ile belirli seçenekleri ayarlayabilir, ancak en basit durumda orada ayarlayacak hiçbir şeyiniz olmayabilir.
Bir multi arayüz transferini yürütmek için, önce multi handle'a aktarılması gereken tüm bireysel easy handle'ları eklemeniz gerekir. Bunları herhangi bir noktada multi handle'a ekleyebilir ve istediğiniz zaman tekrar kaldırabilirsiniz. Bir easy handle'ı bir multi handle'dan kaldırmak ilişkiyi kaldırır ve o belirli transfer hemen durur.
Multi handle'a bir easy handle eklemek kolaydır:
curl_multi_add_handle( multi_handle, easy_handle );
Birini kaldırmak da bir o kadar kolay yapılır:
curl_multi_remove_handle( multi_handle, easy_handle );
Gerçekleştirmek istediğiniz transferleri temsil eden easy handle'ları ekledikten sonra, transfer döngüsünü yazarsınız. Multi arayüz ile döngüyü siz yaparsınız, böylece libcurl'den bir dizi dosya tanımlayıcısı (file descriptors) ve bir zaman aşımı değeri isteyebilir ve select() çağrısını kendiniz yapabilirsiniz veya bunu bizim için yapan biraz basitleştirilmiş sürümü curl_multi_wait ile kullanabilirsiniz. En basit döngü şöyle görünebilir: (gerçek bir uygulamanın dönüş kodlarını kontrol edeceğini unutmayın)
int transfers_running;
do {
curl_multi_wait ( multi_handle, NULL, 0, 1000, NULL);
curl_multi_perform ( multi_handle, &transfers_running );
} while (transfers_running);
Yukarıdaki örnekte 1000 olarak ayarlanan curl_multi_wait'in dördüncü argümanı milisaniye cinsinden bir zaman aşımıdır. Bu, işlevin yine de dönmeden önce herhangi bir etkinlik için beklediği en uzun süredir. curl_multi_perform'u tekrar çağırmadan önce çok uzun süre kilitlenmek istemezsiniz çünkü bunu yaparsanız hassasiyetini kaybedebilecek zaman aşımları, ilerleme geri çağırımları ve daha fazlası vardır.
Bunun yerine select()'i kendi başımıza yapmak için, libcurl'den dosya tanımlayıcılarını ve zaman aşımı değerini şöyle çıkarırız (gerçek bir uygulamanın dönüş kodlarını kontrol edeceğini unutmayın):
int transfers_running;
do {
fd_set fdread;
fd_set fdwrite;
fd_set fdexcep;
int maxfd = -1;
long timeout;
/* zaman aşımı değerini çıkar */
curl_multi_timeout(multi_handle, &timeout);
if (timeout < 0)
timeout = 1000;
/* select tarafından kullanılabilir yapıya dönüştür */
timeout.tv_sec = timeout / 1000;
timeout.tv_usec = (timeout % 1000) * 1000;
FD_ZERO(&fdread);
FD_ZERO(&fdwrite);
FD_ZERO(&fdexcep);
/* transferlerden dosya tanımlayıcılarını al */
mc = curl_multi_fdset(multi_handle, &fdread, &fdwrite,
&fdexcep, &maxfd);
if (maxfd == -1) {
SHORT_SLEEP;
}
else
select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
/* zaman aşımı veya okunabilir/yazılabilir soketler */
curl_multi_perform(multi_handle, &transfers_running);
} while ( transfers_running );
Bu döngülerin her ikisi de, kendi soketlerinizden veya bir borudan (pipe) veya benzerinden okumanız gibi, beklemek için kendi dosya tanımlayıcılarınızdan birini veya birkaçını kullanmanıza izin verir.
Tekrar: döngü sırasında herhangi bir noktada multi handle'a easy handle'lar ekleyebilir ve kaldırabilirsiniz. Transfer ortasında bir handle'ı kaldırmak o transferi iptal eder.
Tek bir transfer ne zaman biter?
Yukarıdaki örneklerin gösterdiği gibi, bir program transfers_running değişkeninin azaldığını görerek tek bir transferin ne zaman tamamlandığını algılayabilir.
Ayrıca curl_multi_info_read() çağrılabilir; bu, bir transfer sona erdiyse bir yapıya (bir "mesaj") işaretçi döndürür ve daha sonra o yapıyı kullanarak o transferin sonucunu öğrenebilirsiniz.
Birden fazla paralel transfer yaptığınızda, aynı curl_multi_perform çağrısında elbette birden fazla transfer tamamlanabilir ve o zaman tamamlanan her transfer hakkında bilgi almak için curl_multi_info_read'e birden fazla çağrı yapmanız gerekebilir.
multi_socket ile yürütme
multi_socket, normal multi arayüzünün ekstra baharatlı sürümüdür ve olay güdümlü (event-driven) uygulamalar için tasarlanmıştır. Önce Multi arayüz ile yürütme bölümünü okuduğunuzdan emin olun.
multi_socket, hepsi aynı tek iş parçacığında yapılan çoklu paralel transferleri destekler ve tek bir uygulamada on binlerce transferi çalıştırmak için kullanılmıştır. Çok sayıda (>100 veya civarı) paralel transfer yapıyorsanız genellikle en mantıklı olan API'dir.
Bu durumda olay güdümlü, uygulamanızın bir dizi sokete abone olan bir sistem seviyesi kütüphanesi veya kurulumu kullandığı ve bu soketlerden biri okunabilir veya yazılabilir olduğunda uygulamanıza bildirdiği ve tam olarak hangisi olduğunu söylediği anlamına gelir.
Bu kurulum, istemcilerin eşzamanlı transfer sayısını diğer sistemlere göre çok daha yükseğe çıkarmasına ve yine de iyi performansı korumasına olanak tanır. Normal API'ler aksi takdirde tüm soketlerin listelerini taramak için çok fazla zaman harcar.
Birini seç
Dışarıda seçebileceğiniz çok sayıda olay tabanlı sistem vardır ve libcurl hangisini kullandığınız konusunda tamamen agnostiktir. libevent, libev ve libuv popüler üç tanesidir ancak epoll, kqueue, /dev/poll, pollset veya Event Completion gibi işletim sisteminizin yerel çözümlerine de doğrudan gidebilirsiniz.
Çok sayıda easy handle
Tıpkı normal multi arayüzde olduğu gibi, curl_multi_add_handle() ile bir multi handle'a easy handle'lar eklersiniz. Gerçekleştirmek istediğiniz her transfer için bir easy handle.
Bunları transferler çalışırken herhangi bir zamanda ekleyebilir ve benzer şekilde curl_multi_remove_handle çağrısını kullanarak easy handle'ları istediğiniz zaman kaldırabilirsiniz. Ancak genellikle, bir handle'ı yalnızca transferi tamamlandıktan sonra kaldırırsınız.
multi_socket geri çağırımları (callbacks)
Yukarıda açıklandığı gibi, bu olay tabanlı mekanizma, libcurl tarafından hangi soketlerin kullanıldığını ve libcurl'ün bu soketlerde hangi etkinlikleri beklediğini bilmek için uygulamaya dayanır: soketin okunabilir, yazılabilir veya her ikisi olmasını bekliyorsa.
Uygulamanın ayrıca zaman aşımı süresi dolduğunda libcurl'e söylemesi gerekir, çünkü her şeyi yürütme kontrolü ondadır, libcurl bunu kendisi yapamaz. libcurl, uygulamaya güncellenmiş zaman aşımı değerlerini ihtiyaç duyduğu anda bildirir.
socket_callback
libcurl, beklenecek soket etkinliği hakkında uygulamayı CURLMOPT_SOCKETFUNCTION adlı bir geri çağırımla bilgilendirir. Uygulamanızın böyle bir işlevi uygulaması gerekir:
int socket_callback(CURL *easy, /* easy handle */
curl_socket_t s, /* soket */
int what, /* ne beklenecek */
void *userp, /* özel geri çağırım işaretçisi */
void *socketp) /* özel soket işaretçisi */
{
/* 's' soketi hakkında bilgi verildi */
}
/* geri çağırımı multi handle'da ayarla */
curl_multi_setopt(multi_handle, CURLMOPT_SOCKETFUNCTION, socket_callback);
Bunu kullanarak libcurl, uygulamanızın izlemesi gereken soketleri ayarlar ve kaldırır. Uygulamanız, altta yatan olay tabanlı sisteme soketleri beklemesini söyler. Beklenecek birden fazla soket varsa bu geri çağırım birden fazla kez çağrılır ve durum değiştiğinde tekrar çağrılır; belki de yazılabilir bir soketi beklemekten, okunabilir olmasını beklemeye geçmelisinizdir.
Uygulamanın libcurl adına izlediği soketlerden biri, istendiği gibi okunabilir veya yazılabilir hale geldiğini kaydettiğinde, curl_multi_socket_action()'ı çağırarak ve etkilenen soketi ve hangi soket etkinliğinin kaydedildiğini belirten ilişkili bir bit maskesini ileterek libcurl'e bunu bildirirsiniz:
int running_handles;
ret = curl_multi_socket_action(multi_handle,
sockfd, /* etkinliğe sahip soket */
ev_bitmask, /* belirli etkinlik */
&running_handles);
timer_callback
Uygulama kontroldedir ve soket etkinliğini bekler. Soket etkinliği olmasa bile libcurl'ün yapması gereken şeyler vardır. Zaman aşımı şeyleri, ilerleme geri çağırımını çağırma, bir yeniden denemeyi baştan başlatma veya çok uzun süren bir transferi başarısız kılma vb. Bunun çalışması için, uygulamanın libcurl'ün ayarladığı tek seferlik (single-shot) bir zaman aşımını da ele aldığından emin olması gerekir.
libcurl zaman aşımını timer_callback CURLMOPT_TIMERFUNCTION ile ayarlar:
int timer_callback(multi_handle, /* multi handle */
timeout_ms, /* beklenecek milisaniye */
userp) /* özel geri çağırım işaretçisi */
{
/* beklenecek yeni zaman aşımı değeri 'timeout_ms' içindedir */
}
/* geri çağırımı multi handle'da ayarla */
curl_multi_setopt(multi_handle, CURLMOPT_TIMERFUNCTION, timer_callback);
Kaç tane bireysel easy handle eklenmiş olduğuna veya kaç transferin devam ettiğine bakılmaksızın, uygulamanın tüm multi handle için ele alması gereken yalnızca bir zaman aşımı vardır. Zamanlayıcı geri çağırımı, beklenecek mevcut en yakın zaman periyoduyla güncellenir. libcurl, soket etkinliği nedeniyle zaman aşımı süresi dolmadan önce çağrılırsa, süresi dolmadan önce zaman aşımı değerini tekrar güncelleyebilir.
Seçtiğiniz olay sistemi sonunda size zamanlayıcının süresinin dolduğunu söylediğinde, bunu libcurl'e bildirmeniz gerekir:
curl_multi_socket_action(multi, CURL_SOCKET_TIMEOUT, 0, &running);
…birçok durumda, bu libcurl'ün timer_callback'i tekrar çağırmasını ve bir sonraki sona erme dönemi için yeni bir zaman aşımı ayarlamasını sağlar.
Her şey nasıl başlatılır
Multi handle'a bir veya daha fazla easy handle eklediğinizde ve multi handle'da soket ve zamanlayıcı geri çağırımlarını ayarladığınızda, transferi başlatmaya hazırsınız demektir.
Her şeyi başlatmak için, libcurl'e zaman aşımına uğradığını söylersiniz (çünkü tüm easy handle'lar kısa bir zaman aşımıyla başlar), bu da libcurl'ün işleri ayarlamak için geri çağırımları çağırmasını sağlar ve o andan itibaren olay sisteminizin sürmesine izin verebilirsiniz:
/* tüm easy handle'lar ve geri çağırımlar ayarlandı */
curl_multi_socket_action(multi, CURL_SOCKET_TIMEOUT, 0, &running);
/* şimdi geri çağırımlar çağrılmış olmalı ve beklememiz gereken
soketlerimiz ve muhtemelen bir zaman aşımımız da var.
Olay sisteminin sihrini yapmasını sağlayın */
event_base_dispatch(event_base); /* libevent2 bu API'ye sahiptir */
/* bu noktada olay döngüsünden çıktık */
Ne zaman biter?
curl_multi_socket_action tarafından döndürülen 'running_handles' (çalışan handle'lar) sayacı, henüz tamamlanmamış mevcut transfer sayısını tutar. Bu sayı sıfıra ulaştığında, devam eden transfer olmadığını biliriz.
'running_handles' sayacı her değiştiğinde, curl_multi_info_read() tamamlanan belirli transferler hakkında bilgi döndürür.
Geri çağırımlar (Callbacks)
libcurl içindeki birçok işlem geri çağırımlar kullanılarak kontrol edilir. Bir geri çağırım, libcurl'e sağlanan ve libcurl'ün daha sonra belirli bir işi yapmak için bir noktada çağırdığı bir işlev işaretçisidir.
Her geri çağırımın kendine özgü belgelenmiş bir amacı vardır ve doğru argümanları kabul etmesi ve libcurl'ün istediğiniz şekilde çalışması için belgelenmiş dönüş kodunu ve dönüş değerini döndürmesi için tam işlev prototipiyle yazmanızı gerektirir.
Her geri çağırım seçeneğinin ayrıca ilişkili kullanıcı işaretçisini ayarlayan bir yardımcı seçeneği vardır. Bu kullanıcı işaretçisi, libcurl'ün dokunmadığı veya umursamadığı, sadece bir argüman olarak geri çağırıma ilettiği bir işaretçidir. Bu, örneğin, yerel verilere işaretçileri geri çağırım işlevinize kadar iletmenize olanak tanır.
Bir libcurl işlev belgesinde açıkça belirtilmedikçe, bir libcurl geri çağırımı içinden libcurl işlevlerini çağırmak yasal değildir.
- Veri yazma (Write data)
- Veri okuma (Read data)
- İlerleme bilgisi (Progress information)
- Başlık verileri (Header data)
- Hata ayıklama (Debug)
- sockopt
- SSL bağlamı (SSL context)
- Arama ve ioctl (Seek and ioctl)
- Ağ veri dönüşümü
- Soket açma ve kapama (Opensocket and closesocket)
- SSH anahtarı
- RTSP serpiştirilmiş veriler
- FTP joker karakter eşleştirme
- Çözümleyici başlatma
- Sondaki başlıkları (Trailers) gönderme
- HSTS
- Ön koşul (Prereq)
Veri yazma (Write data)
Yazma geri çağırımı CURLOPT_WRITEFUNCTION ile ayarlanır:
curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, write_callback);
write_callback işlevi şu prototiple eşleşmelidir:
size_t write_callback(char *ptr, size_t size, size_t nmemb,
void *userdata);
Bu geri çağırım işlevi, kaydedilmesi gereken veriler alındığında libcurl tarafından çağrılır. ptr, teslim edilen verileri işaret eder ve bu verilerin boyutu nmemb ile çarpılan size'dır.
Bu geri çağırım ayarlanmazsa, libcurl varsayılan olarak 'fwrite' kullanır.
Yazma geri çağırımına tüm çağrılarda mümkün olduğunca fazla veri iletilir ancak hiçbir varsayımda bulunulmamalıdır. Bir bayt olabilir, binlerce olabilir. Yazma geri çağırımına iletilen maksimum gövde verisi miktarı curl.h başlık dosyasında tanımlanmıştır: CURL_MAX_WRITE_SIZE (olağan varsayılan 16KB'dir). Bu transfer için CURLOPT_HEADER etkinleştirilirse, bu da başlık verilerinin yazma geri çağırımına iletilmesini sağlar, içine iletilen CURL_MAX_HTTP_HEADER baytına kadar başlık verisi alabilirsiniz. Bu genellikle 100KB anlamına gelir.
Aktarılan dosya boşsa bu işlev sıfır bayt veri ile çağrılabilir.
Bu işleve iletilen veriler sıfır ile sonlandırılmaz. Örneğin, içeriği görüntülemek için printf'in %s operatörünü kullanamazsınız veya kopyalamak için strcpy kullanamazsınız.
Bu geri çağırım, gerçekten ilgilenilen bayt sayısını döndürmelidir. Bu sayı, geri çağırım işlevinize iletilen sayıdan farklıysa, kütüphaneye bir hata durumu bildirir. Bu, transferin iptal edilmesine neden olur ve kullanılan libcurl işlevi CURLE_WRITE_ERROR döndürür.
userdata argümanında geri çağırıma iletilen kullanıcı işaretçisi CURLOPT_WRITEDATA ile ayarlanır:
curl_easy_setopt(handle, CURLOPT_WRITEDATA, custom_pointer);
Bellekte sakla
Popüler bir talep, alınan yanıtı bellekte saklamaktır ve yukarıda açıklanan geri çağırım bunu destekler. Bunu yaparken, yanıt potansiyel olarak muazzam olabileceğinden dikkatli olun.
Geri çağırımı şuna benzer bir şekilde uygularsınız:
struct response {
char *memory;
size_t size;
};
static size_t
mem_cb(void *contents, size_t size, size_t nmemb, void *userp)
{
size_t realsize = size * nmemb;
struct response *mem = (struct response *)userp;
char *ptr = realloc(mem->memory, mem->size + realsize + 1);
if(!ptr) {
/* bellek tükendi! */
printf("yeterli bellek yok (realloc NULL döndürdü)\n");
return 0;
}
mem->memory = ptr;
memcpy(&(mem->memory[mem->size]), contents, realsize);
mem->size += realsize;
mem->memory[mem->size] = 0;
return realsize;
}
int main()
{
struct response chunk = {.memory = malloc(0),
.size = 0};
/* tüm verileri bu işleve gönder */
curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, mem_cb);
/* 'chunk' yapımızı geri çağırım işlevine iletiyoruz */
curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)&chunk);
free(chunk.memory);
}
Veri okuma (Read data)
Okuma geri çağırımı CURLOPT_READFUNCTION ile ayarlanır:
curl_easy_setopt(handle, CURLOPT_READFUNCTION, read_callback);
read_callback işlevi şu prototiple eşleşmelidir:
size_t read_callback(char *buffer, size_t size, size_t nitems,
void *stream);
Bu geri çağırım işlevi, libcurl sunucuya veri göndermek istediğinde çağrılır. Bu, veri yüklemek veya başka bir şekilde sunucuya göndermek için ayarladığınız bir transferdir. Bu geri çağırım, tüm veriler teslim edilene veya transfer başarısız olana kadar tekrar tekrar çağrılır.
stream işaretçisi, CURLOPT_READDATA ile ayarlanan özel verilere işaret eder:
curl_easy_setopt(handle, CURLOPT_READDATA, custom_pointer);
Bu geri çağırım ayarlanmazsa, libcurl varsayılan olarak 'fread' kullanır.
buffer işaretçisi tarafından işaret edilen veri alanı, işleviniz tarafından en fazla nitems sayısı ile çarpılan size kadar bayt ile doldurulmalıdır. Geri çağırım daha sonra o bellek alanında sakladığı bayt sayısını veya verilerin sonuna ulaştıysak 0 döndürmelidir. Geri çağırım ayrıca libcurl'ün hemen başarısız olmasına veya belirli transferi duraklatmasına neden olmak için birkaç "sihirli" dönüş kodu da döndürebilir. Ayrıntılar için CURLOPT_READFUNCTION man sayfasına bakın.
İlerleme bilgisi (Progress information)
İlerleme geri çağırımı, transferin tüm ömrü boyunca her transfer için düzenli ve tekrar tekrar çağrılan şeydir. Eski geri çağırım CURLOPT_PROGRESSFUNCTION ile ayarlanıyordu ancak modern ve tercih edilen geri çağırım CURLOPT_XFERINFOFUNCTION ile ayarlanır:
curl_easy_setopt(handle, CURLOPT_XFERINFOFUNCTION, xfer_callback);
xfer_callback işlevi şu prototiple eşleşmelidir:
int xfer_callback(void *clientp, curl_off_t dltotal, curl_off_t dlnow,
curl_off_t ultotal, curl_off_t ulnow);
Bu seçenek ayarlanırsa ve CURLOPT_NOPROGRESS 0'a (sıfır) ayarlanırsa, bu geri çağırım işlevi libcurl tarafından sık bir aralıkla çağrılır. Veriler aktarılırken sık sık çağrılır ve hiçbir şeyin aktarılmadığı yavaş dönemlerde saniyede yaklaşık bir çağrıya kadar yavaşlayabilir.
clientp işaretçisi, CURLOPT_XFERINFODATA ile ayarlanan özel verilere işaret eder:
curl_easy_setopt(handle, CURLOPT_XFERINFODATA, custom_pointer);
Geri çağırıma libcurl'ün ne kadar veri aktarmak üzere olduğu ve bayt cinsinden ne kadar aktardığı söylenir:
dltotal, libcurl'ün bu transferde indirmeyi beklediği toplam bayt sayısıdır.dlnow, şimdiye kadar indirilen bayt sayısıdır.ultotal, libcurl'ün bu transferde yüklemeyi beklediği toplam bayt sayısıdır.ulnow, şimdiye kadar yüklenen bayt sayısıdır.
Geri çağırıma iletilen bilinmeyen/kullanılmayan argüman değerleri sıfıra ayarlanır (örneğin sadece veri indiriyorsanız, yükleme boyutu sıfır kalır). Çoğu zaman geri çağırım, veri boyutlarını bilmeden önce bir veya daha fazla kez çağrılır, bu nedenle bir program bunu ele alacak şekilde yapılmalıdır.
Bu geri çağırımdan sıfır olmayan bir değer döndürmek, libcurl'ün transferi iptal etmesine ve CURLE_ABORTED_BY_CALLBACK döndürmesine neden olur.
Multi arayüz ile veri aktarırsanız, transferleri gerçekleştiren uygun libcurl işlevini çağırmadığınız sürece bu işlev boşta kalma sürelerinde çağrılmaz.
(Kullanımdan kaldırılan geri çağırım CURLOPT_PROGRESSFUNCTION aynı şekilde çalışıyordu ancak curl_off_t türünde argümanlar almak yerine double kullanıyordu.)
Başlık verileri (Header data)
Başlık geri çağırımı CURLOPT_HEADERFUNCTION ile ayarlanır:
curl_easy_setopt(handle, CURLOPT_HEADERFUNCTION, header_callback);
header_callback işlevi şu prototiple eşleşmelidir:
size_t header_callback(char *ptr, size_t size, size_t nmemb,
void *userdata);
Bu geri çağırım işlevi, bir başlık alınır alınmaz libcurl tarafından çağrılır. ptr, teslim edilen verileri işaret eder ve bu verilerin boyutu nmemb ile çarpılan size'dır. libcurl başlıkları tamponlar ve bu geri çağırıma yalnızca "tam" başlıkları teker teker teslim eder.
Bu işleve iletilen veriler sıfır ile sonlandırılmaz. Örneğin, içeriği görüntülemek için printf'in %s operatörünü kullanamazsınız veya kopyalamak için strcpy kullanamazsınız.
Bu geri çağırım, gerçekten ilgilenilen bayt sayısını döndürmelidir. Bu sayı, geri çağırım işlevinize iletilen sayıdan farklıysa, kütüphaneye bir hata durumu bildirir. Bu, transferin iptal edilmesine neden olur ve kullanılan libcurl işlevi CURLE_WRITE_ERROR döndürür.
userdata argümanında geri çağırıma iletilen kullanıcı işaretçisi CURLOPT_HEADERDATA ile ayarlanır:
curl_easy_setopt(handle, CURLOPT_HEADERDATA, custom_pointer);
Hata ayıklama (Debug)
Hata ayıklama geri çağırımı CURLOPT_DEBUGFUNCTION ile ayarlanır:
curl_easy_setopt(handle, CURLOPT_DEBUGFUNCTION, debug_callback);
debug_callback işlevi şu prototiple eşleşmelidir:
int debug_callback(CURL *handle,
curl_infotype type,
char *data,
size_t size,
void *userdata);
Bu geri çağırım işlevi, kütüphanedeki varsayılan ayrıntılı çıktı işlevinin yerini alır ve uygulamaların neler olup bittiğini anlamasına yardımcı olmak için tüm hata ayıklama ve izleme mesajları için çağrılır. type argümanı ne tür veri sağlandığını açıklar: başlık, veri veya SSL verisi ve hangi yönde aktığı.
Bu geri çağırımın yaygın bir kullanımı, libcurl'ün gönderdiği ve aldığı tüm verilerin tam bir izini almaktır. Bu geri çağırıma gönderilen veriler, örneğin HTTPS veya diğer şifreli protokoller kullanıldığında bile her zaman şifrelenmemiş sürümdür.
Bu geri çağırım sıfır döndürmeli veya transferin bir hata koduyla durmasına neden olmalıdır.
userdata argümanında geri çağırıma iletilen kullanıcı işaretçisi CURLOPT_DEBUGDATA ile ayarlanır:
curl_easy_setopt(handle, CURLOPT_DEBUGDATA, custom_pointer);
sockopt
sockopt geri çağırımı CURLOPT_SOCKOPTFUNCTION ile ayarlanır:
curl_easy_setopt(handle, CURLOPT_SOCKOPTFUNCTION, sockopt_callback);
sockopt_callback işlevi şu prototiple eşleşmelidir:
int sockopt_callback(void *clientp,
curl_socket_t curlfd,
curlsocktype purpose);
Bu geri çağırım işlevi, yeni bir soket oluşturulduğunda ancak bağlan çağrısından önce, uygulamaların belirli soket seçeneklerini değiştirmesine izin vermek için libcurl tarafından çağrılır.
clientp işaretçisi, CURLOPT_SOCKOPTDATA ile ayarlanan özel verilere işaret eder:
curl_easy_setopt(handle, CURLOPT_SOCKOPTDATA, custom_pointer);
Bu geri çağırım şunları döndürmelidir:
- Başarılı durumda CURL_SOCKOPT_OK
- libcurl'e kurtarılamaz bir hata bildirmek için CURL_SOCKOPT_ERROR
- Başarıyı ancak aynı zamanda soketin aslında zaten hedefe bağlı olduğunu bildirmek için CURL_SOCKOPT_ALREADY_CONNECTED
SSL bağlamı (SSL context)
libcurl, CURLOPT_SSL_CTX_FUNCTION adlı özel bir TLS ile ilgili geri çağırım sunar. Bu seçenek yalnızca OpenSSL, wolfSSL veya mbedTLS tarafından desteklenen libcurl için çalışır ve libcurl başka bir TLS arka ucu ile oluşturulmuşsa hiçbir şey yapmaz.
Bu geri çağırım, uygulamanın TLS başlatma davranışını değiştirmesi için son bir şans vermek üzere diğer tüm TLS ile ilgili seçenekleri işledikten sonra, bir TLS bağlantısının başlatılmasından hemen önce libcurl tarafından çağrılır. İkinci argümanda geri çağırıma iletilen ssl_ctx parametresi, aslında OpenSSL veya wolfSSL için SSL kütüphanesinin SSL_CTX'ine bir işaretçi ve mbedTLS için mbedtls_ssl_config'e bir işaretçidir. Geri çağırımdan bir hata döndürülürse, bağlantı kurma girişimi yapılmaz ve işlem geri çağırımın hata kodunu döndürür. userptr argümanını CURLOPT_SSL_CTX_DATA seçeneğiyle ayarlayın.
Bu işlev, TLS pazarlığı sırasında bir sunucuya yapılan tüm yeni bağlantılarda çağrılır. TLS bağlamı her seferinde yeni başlatılan bir nesneye işaret eder.
Arama ve ioctl (Seek and ioctl)
Bu geri çağırım CURLOPT_SEEKFUNCTION ile ayarlanır.
Geri çağırım, giriş akışında belirli bir konuma arama yapmak (seek) için libcurl tarafından çağrılır ve devam ettirilen bir yüklemede (yüklenen tüm baytları normal okuma işlevi/geri çağırımı ile okumak yerine) bir dosyayı hızlı ileri sarmak için kullanılabilir. Ayrıca, veriler sunucuya zaten gönderildiğinde ve tekrar gönderilmesi gerektiğinde bir akışı geri sarmak için de çağrılır. Bu, çok geçişli bir kimlik doğrulama yöntemiyle bir HTTP PUT veya POST yaparken veya mevcut bir HTTP bağlantısı çok geç yeniden kullanıldığında ve sunucu bağlantıyı kapattığında olabilir. İşlev fseek(3) veya lseek(3) gibi çalışmalı ve başlangıç için argüman olarak SEEK_SET, SEEK_CUR veya SEEK_END almalıdır; ancak libcurl şu anda yalnızca SEEK_SET iletir.
Geri çağırıma gönderilen özel userp, CURLOPT_SEEKDATA ile ayarladığınız işaretçidir.
Geri çağırım işlevi başarılı olduğunda CURL_SEEKFUNC_OK, yükleme işleminin başarısız olmasına neden olmak için CURL_SEEKFUNC_FAIL veya arama başarısız olsa da libcurl'ün mümkünse sorunu aşmakta serbest olduğunu belirtmek için CURL_SEEKFUNC_CANTSEEK döndürmelidir. İkincisi, bazen bunun yerine girdiden okuma veya benzeri yöntemlerle yapılabilir.
Giriş argümanlarını doğrudan fseek(3) veya lseek(3)'e iletiyorsanız, ofset için veri türünün birçok sistemde curl_off_t için tanımlananla aynı olmadığına dikkat edin.
Ağ veri dönüşümü
libcurl sürüm 7.82.0'a kadar, bu geri çağırımlar ASCII olmayan platformlarda işlerin yürümesi için sağlanıyordu. Bu geri çağırımlar için destek o zamandan beri kaldırıldı.
Aşağıdaki belgeler bir süre burada tutulacak ve nasıl çalıştıklarını açıklayacaktır. Gelecek bir tarihte bu kitaptan kaldırılacaktır.
Ağa ve ağdan dönüştürme geri çağırımları
ASCII olmayan platformlar için CURLOPT_CONV_FROM_NETWORK_FUNCTION sağlanır. Bu işlev ağ kodlamasından (from) ana bilgisayar kodlamasına (to) dönüştürmelidir.
CURLOPT_CONV_TO_NETWORK_FUNCTION, ana bilgisayar kodlamasından ağ kodlamasına (to) dönüştürmelidir. Komutlar veya ASCII verileri ağ üzerinden gönderildiğinde kullanılır.
UTF-8'den dönüştürme geri çağırımı
CURLOPT_CONV_FROM_UTF8_FUNCTION, UTF-8 kodlamasından ana bilgisayar kodlamasına dönüştürmelidir. Yalnızca SSL işlemleri için gereklidir.
Soket açma ve kapama (Opensocket and closesocket)
Bazen uygulamanızın libcurl'ün operasyonları için tam olarak hangi soketi kullanacağını daha hassas bir şekilde kontrol etmesini istediğiniz bir duruma düşersiniz. libcurl, libcurl'ün kendi socket() çağrısının ve ardından aynı dosya tanımlayıcısının close() çağrısının yerini alan bu geri çağırım çiftini sunar.
Bir dosya tanımlayıcısı (file descriptor) sağla
CURLOPT_OPENSOCKETFUNCTION geri çağırımını ayarlayarak, libcurl'ün kullanması için bir dosya tanımlayıcısı döndürmek üzere özel bir işlev sağlayabilirsiniz:
curl_easy_setopt(handle, CURLOPT_OPENSOCKETFUNCTION, opensocket_callback);
opensocket_callback işlevi şu prototiple eşleşmelidir:
curl_socket_t opensocket_callback(void *clientp,
curlsocktype purpose,
struct curl_sockaddr *address);
Geri çağırım ilk argüman olarak clientp'yi alır; bu, CURLOPT_OPENSOCKETDATA ile ayarladığınız opak bir işaretçidir.
Diğer iki argüman, soketin hangi amaç (purpose) ve adres için kullanılacağını tanımlayan verileri iletir. purpose, soketin hangi koşulda oluşturulduğunu tanımlayan CURLSOCKTYPE_IPCXN veya CURLSOCKTYPE_ACCEPT değerine sahip bir typedef'tir. "accept" durumu, FTP aktif modu kullanıldığında libcurl'ün gelen bir FTP bağlantısını kabul etmek için kullanıldığı durumdur ve diğer tüm durumlarda libcurl kendi giden bağlantıları için bir soket oluşturduğunda IPCXN değeri iletilir.
address işaretçisi, bu soketin oluşturulduğu ağ hedefinin IP adresini tanımlayan bir struct curl_sockaddr'a işaret eder. Geri çağırımınız örneğin bu bilgiyi belirli adresleri veya adres aralıklarını beyaz listeye veya kara listeye almak için kullanabilir.
Soket açma geri çağırımının, bir tür ağ filtresi veya çeviri katmanı sunmak istiyorsanız, o yapıdaki hedef adresi değiştirmesine de açıkça izin verilir.
Geri çağırım bir dosya tanımlayıcısı veya CURL_SOCKET_BAD döndürmelidir; bu daha sonra libcurl içinde kurtarılamaz bir hataya neden olur ve perform işlevinden CURLE_COULDNT_CONNECT döndürür.
Bir sunucuya zaten bağlı bir dosya tanımlayıcısı döndürmek istiyorsanız, o zaman sockopt geri çağırımını da ayarlamalı ve doğru dönüş değerini döndürdüğünden emin olmalısınız.
curl_sockaddress yapısı şöyle görünür:
struct curl_sockaddr {
int family;
int socktype;
int protocol;
unsigned int addrlen;
struct sockaddr addr;
};
Soket kapatma geri çağırımı
Açık sokete karşılık gelen geri çağırım elbette soketi kapatmaktır. Genellikle bir dosya tanımlayıcısı sağlamak için özel bir yol sağladığınızda, kendi temizleme sürümünüzü de sağlamak istersiniz:
curl_easy_setopt(handle, CURLOPT_CLOSESOCKETFUNCTION,
closesocket_callback);
closesocket_callback işlevi şu prototiple eşleşmelidir:
int closesocket_callback(void *clientp, curl_socket_t item);
SSH anahtarı
Bu geri çağırım CURLOPT_SSH_KEYFUNCTION ile ayarlanır.
known_host eşleşmesi yapıldığında, uygulamanın harekete geçmesine ve libcurl için nasıl devam edileceğine karar vermesine izin vermek için çağrılır. CURLOPT_SSH_KNOWNHOSTS da ayarlanmışsa geri çağırım çağrılır.
Geri çağırıma verilen argümanlarda eski anahtar ve yeni anahtar bulunur ve geri çağırımın libcurl'e nasıl hareket edeceğini söyleyen bir dönüş kodu döndürmesi beklenir:
CURLKHSTAT_FINE_REPLACE - Yeni ana bilgisayar+anahtar kabul edilir ve libcurl bağlantıya devam etmeden önce known_hosts dosyasındaki eski ana bilgisayar+anahtarı değiştirir. Bu ayrıca yeni ana bilgisayar+anahtar birleşimini, zaten orada mevcut değilse bellekte tutulan known_host havuzuna ekler. Dosyaya veri ekleme işlemi, dosyanın tamamen yeni bir kopyayla değiştirilmesiyle yapılır, bu nedenle dosyanın izinleri buna izin vermelidir.
CURLKHSTAT_FINE_ADD_TO_FILE - Ana bilgisayar+anahtar kabul edilir ve libcurl bağlantıya devam etmeden önce onu known_hosts dosyasına ekler. Bu ayrıca ana bilgisayar+anahtar birleşimini, zaten orada mevcut değilse bellekte tutulan known_host havuzuna ekler. Dosyaya veri ekleme işlemi, dosyanın tamamen yeni bir kopyayla değiştirilmesiyle yapılır, bu nedenle dosyanın izinleri buna izin vermelidir.
CURLKHSTAT_FINE - Ana bilgisayar+anahtar kabul edilir, libcurl bağlantıya devam eder. Bu ayrıca ana bilgisayar+anahtar birleşimini, zaten orada mevcut değilse bellekte tutulan known_host havuzuna ekler.
CURLKHSTAT_REJECT - Ana bilgisayar+anahtar reddedilir. libcurl bağlantının devam etmesini reddeder ve kapanır.
CURLKHSTAT_DEFER - Ana bilgisayar+anahtar reddedilir ancak SSH bağlantısının canlı tutulması istenir. Bu özellik, uygulama bir şekilde geri dönüp ana bilgisayar+anahtar durumuna göre hareket etmek ve ardından sıfırdan tekrar kurma yükü olmadan yeniden denemek istediğinde kullanılabilir.
RTSP serpiştirilmiş veriler
CURLOPT_INTERLEAVEFUNCTION seçeneğiyle birlikte geri çağırım.
Bu geri çağırım, bir RTSP transferi yaparken serpiştirilmiş (interleaved) RTP verilerini alır almaz libcurl tarafından çağrılır. Her $ bloğu için çağrılır ve bu nedenle tam olarak bir üst katman protokol birimi (örneğin bir RTP paketi) içerir. libcurl, her çağrı için serpiştirilmiş başlığın yanı sıra dahil edilen verileri de yazar. İlk bayt her zaman bir ASCII dolar işaretidir. Dolar işareti, bir baytlık bir kanal tanımlayıcısı ve ardından ağ bayt sırasında 2 baytlık bir tamsayı uzunluğu izler. RTP serpiştirmenin nasıl davrandığı hakkında daha fazla bilgi için RFC2326 Bölüm 10.12'ye bakın. Ayarlanmazsa veya NULL olarak ayarlanırsa, curl varsayılan yazma işlevini kullanır.
CURLOPT_INTERLEAVEDATA işaretçisi, geri çağırımda userdata argümanında iletilir.
FTP joker karakter eşleştirme
libcurl, FTP joker karakter eşleştirmeyi destekler. Bu özelliği CURLOPT_WILDCARDMATCH seçeneğini 1L olarak ayarlayarak ve ardından URL'nin dosya adı kısmında bir "joker karakter deseni" kullanarak kullanırsınız.
Joker karakter desenleri
Varsayılan libcurl joker karakter eşleştirme işlevi şunları destekler:
* - ASTERISK (Yıldız)
ftp://example.com/some/path/*.txt
some/path dizinindeki tüm txt dosyalarıyla eşleşmesi için. Aynı desen dizesi içinde yalnızca iki yıldıza izin verilir.
? - SORU İŞARETİ
Bir soru işareti herhangi bir (tam olarak bir) karakterle eşleşir. photo1.jpeg ve photo7.jpeg adında dosyalarınız varsa, bu desen onlarla eşleşebilir:
ftp://example.com/some/path/photo?.jpeg
[ - KÖŞELİ PARANTEZ İFADESİ
Sol köşeli parantez bir köşeli parantez ifadesi açar. Soru işareti ve yıldızın köşeli parantez ifadesinde özel bir anlamı yoktur. Her köşeli parantez ifadesi sağ köşeli parantez (]) ile biter ve tam olarak bir karakterle eşleşir. Bazı örnekler şunlardır:
[a-zA-Z0-9] veya [f-gF-G] - karakter aralıkları
[abc] - karakter numaralandırması
[^abc] veya [!abc] - olumsuzlama
[[:name:]] sınıf ifadesi. Desteklenen sınıflar alnum, lower, space, alpha, digit, print, upper, blank, graph, xdigit.
[][-!^] - özel durum, yalnızca \-, ], [, ! veya ^ ile eşleşir.
[\\[\\]\\\\] - kaçış sözdizimi. [, ] veya \\ ile eşleşir.
Yukarıdaki kuralları kullanarak bir dosya adı deseni oluşturulabilir:
ftp://example.com/some/path/[a-z[:upper:]\\\\].jpeg
FTP yığın geri çağırımları
FTP joker karakter eşleştirme kullanıldığında, eşleşen bir dosya için bir transfer başlatılmadan önce CURLOPT_CHUNK_BGN_FUNCTION geri çağırımı çağrılır.
Geri çağırım daha sonra libcurl'e dosya ile ne yapılacağını söylemek için bu dönüş kodlarından birini döndürmeyi seçebilir:
CURL_CHUNK_BGN_FUNC_OKdosyayı transfer etCURL_CHUNK_BGN_FUNC_SKIPCURL_CHUNK_BGN_FUNC_FAILhata nedeniyle dur
Eşleşen dosya transfer edildikten veya atlandıktan sonra, CURLOPT_CHUNK_END_FUNCTION geri çağırımı çağrılır.
Son yığın geri çağırımı yalnızca başarı veya hata döndürebilir.
FTP eşleştirme geri çağırımı
Varsayılan desen eşleştirme işlevi hoşunuza gitmiyorsa, CURLOPT_FNMATCH_FUNCTION seçeneğini alternatifinize ayarlayarak kendi değiştirme işlevinizi sağlayabilirsiniz.
Çözümleyici başlatma
CURLOPT_RESOLVER_START_FUNCTION ile ayarlanan bu geri çağırım işlevi, her yeni çözümleme isteği başlatılmadan önce libcurl tarafından çağrılır ve çözümlemenin hangi CURL * handle'ı için amaçlandığını belirtir.
Sondaki başlıkları (Trailers) gönderme
"Trailers", başlıkların bir transferin sonunda iletilebildiği bir HTTP/1 özelliğidir. Bu geri çağırım, bir yükleme yapıldıktan sonra curl ile sondaki başlıkları göndermek istediğinizde kullanılır. Parçalı kodlanmış (chunked encoded) bir POST biçiminde bir yükleme.
CURLOPT_TRAILERFUNCTION ile ayarlanan geri çağırım çağrılır ve işlev daha sonra bir listeye başlıklar ekleyebilir. Bir veya birden çok. Tamamlandığında, libcurl bunları sunucuya sondaki başlıklar olarak gönderir.
HSTS
HSTS (HTTP Strict Transport Security) için libcurl, bir tahsisin kurallar için depolamayı uygulamasına izin vermek üzere iki geri çağırım sağlar. Geri çağırımlar daha sonra kalıcı bir depolamadan HSTS politikalarını okumak ve/veya yazmak üzere ayarlanır.
CURLOPT_HSTSREADFUNCTION ile uygulama, HSTS verilerinin libcurl'e okunduğu bir işlev sağlar. CURLOPT_HSTSWRITEFUNCTION, verileri yazmak için libcurl'ün çağırdığı karşılık gelen işlevdir.
Ön koşul (Prereq)
Burada "Prereq", istek gönderilmeden hemen öncesi anlamına gelir. Bu geri çağırımın çağrıldığı an budur.
İşlevi CURLOPT_PREREQFUNCTION ile ayarlayın; çağrılır ve kullanılan IP adresi ve port numaraları argümanlarda iletilir. Bu, uygulamanın transfer hakkında başlamadan hemen önce bilgi sahibi olmasını sağlar ve ayrıca isterse bu belirli transferi iptal etmesine de izin verir.
Bağlantı kontrolü
libcurl ile bir transfer yaparken genellikle dahil olan bir bağlantı vardır. TCP veya QUIC gibi bir İnternet taşıma protokolü kullanılarak yapılan bir bağlantı. Transferler bağlantılar üzerinden yapılır ve libcurl, bağlantılar için birçok kavram ve onlarla nasıl çalışacağını kontrol etmek için seçenekler sunar.
- libcurl nasıl bağlanır
- Yerel adres ve port numarası
- Bağlantı yeniden kullanımı
- Canlı tutma (Keep alive)
- Ad çözme
- Vekil sunucular (Proxies)
libcurl nasıl bağlanır (How libcurl connects)
libcurl bir İnternet transferi yapmak üzereyken, önce ana bilgisayar için bir dizi IP adresi almak üzere ana bilgisayar adını çözer. Bir ana bilgisayar adının, libcurl'ün ona bağlanabilmesi için en az bir adrese sahip olması gerekir.
Bir ana bilgisayar adı hem IPv4 adreslerine hem de IPv6 adreslerine sahip olabilir ve her ikisinden oluşan bir kümeye sahip olabilirler.
Ana bilgisayar yalnızca tek bir IP ailesine ait adresler döndürürse, libcurl her adres üzerinde yinelenir ve bağlanmayı dener. Bir IP için bağlanma girişimi başarısız olursa, libcurl tüm liste tükenene kadar bir sonraki girişi denemeye devam eder.
Bir uygulama, CURLOPT_IPRESOLVE ayarlayarak libcurl'ün hangi IP sürümlerini kullanacağını sınırlayabilir.
Happy Eyeballs
Bir ana bilgisayar için hem IPv4 hem de IPv6 adreslerini aldığında, libcurl önce bir IPv6 adresine bağlanmayı dener ve kısa bir gecikmeden sonra ilk IPv4 adresine bağlanmayı dener - aynı anda ve paralel olarak. Girişimlerden biri başarılı olduğunda, diğerleri atılır. Her iki aileyi aynı anda kullanarak bağlanmaya çalışma yöntemine Happy Eyeballs denir ve İnternet istemcileri için yaygın olarak kabul edilen en iyi uygulamadır.
Bir uygulama, Happy Eyeball prosedüründe ikinci aile bağlanma girişiminin başlayacağı gecikmeyi CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS kullanarak ayarlayabilir.
Zaman aşımı ve yarıya indirme
Bağlantı aşamasının izin verilen maksimum bir süresi vardır (CURLOPT_CONNECTTIMEOUT_MS ile ayarlanır), varsayılan olarak 300 saniyedir. Bu süre içinde hiçbir bağlantı başarılı olmazsa tüm bağlanma prosedürü başarısız sayılır.
libcurl'ün bağlanmayı deneyecek birden fazla adresi kaldığında ve 600 milisaniyeden fazla süresi kaldığında, bu girişim için kalan sürenin en fazla yarısına izin verir. Bu, tek bir kara delik (sink-hole) adresinin libcurl'ün tüm zaman aşımı süresini o kötü giriş üzerinde harcamasını önlemek içindir.
Örneğin: zaman aşımının bitmesine 1000 milisaniye kaldıysa ve bağlanmayı deneyecek iki IP adresi kaldıysa, libcurl bir sonraki girişimde yalnızca 500 milisaniyeye izin verir.
Bunun yerine zaman aşımının bitmesine yalnızca 600 milisaniye kaldıysa ve bağlanmayı deneyecek iki IP adresi kaldıysa, libcurl başarılı olması için çok kısa olmaması adına bir sonraki girişimde kalan tüm zaman aşımı süresine izin verir. Zaman aşımı yarıya indirme yaklaşımı yalnızca 600 milisaniyeden fazla süre kaldığı sürece yapılır.
HTTP/3
libcurl'den HTTP/3 kullanmasını isteyen uygulamalar için, başka bir Happy Eyeballs katmanı ekler. HTTP/3, QUIC üzerinde çalışır ve QUIC, TCP'den farklı bir taşıma protokolüdür ve bazen engellenen veya aksi takdirde TCP kadar iyi çalışmayan bir mekanizmadır. Bunun getirdiği sorunları düzeltmek amacıyla libcurl, yukarıda açıklanan farklı IP sürümü bağlantılarına ek olarak normal TCP bağlantılarıyla paralel olarak QUIC bağlantıları gerçekleştirir.
libcurl bir ana bilgisayar için hem IPv4 hem de IPv6 adreslerini aldığında ve ana bilgisayarla HTTP/3 yapmak istediğinde, şöyle ilerler:
- Bir IPv6 QUIC bağlanma girişimi başlat, IPv6 adresleri üzerinde yinele
- Kısa bir gecikmeden sonra, bir IPv4 QUIC bağlanma girişimi başlat, IPv4 adresleri üzerinde yinele
- Kısa bir gecikmeden sonra, bir IPv6 TCP bağlanma girişimi başlat, IPv6 adresleri üzerinde yinele
- Kısa bir gecikmeden sonra, bir IPv4 TCP bağlanma girişimi başlat, IPv4 adresleri üzerinde yinele
Bir bağlanma girişimi başarılı olduğunda, diğerlerinin tümü hemen atılır.
HTTP/3 happy eyeballing, libcurl'den CURL_HTTP_VERSION_3 kullanması istendiğinde yapılır ancak CURL_HTTP_VERSION_3ONLY olarak ayarlandığında yapılmaz.
Yerel adres ve port numarası
Neredeyse tüm durumlarda, bir bağlantı kurarken sistemin varsayılan kaynak IP adresini ve yerel port numarasını seçmesine izin vermek istersiniz.
Bunun yeterince iyi olmadığı nadir durumlar için libcurl geçersiz kılma özellikleri sunar.
Yerel adres
libcurl tarafından oluşturulan bir bağlantının, bu ana bilgisayara geri yönlenen bir kaynak IP'ye sahip olması gerekir. Bir uygulama, kullanmak istediği herhangi bir IP adresini rastgele seçip bunun çalışmasını bekleyemez. Makinedeki bir ağ arayüzünün atanmış IP adresine sahip olması gerekir.
CURLOPT_INTERFACE ile libcurl'den varsayılan olmayan bir IP adresi kullanmasını isteyebilirsiniz. Adından da anlaşılacağı gibi, girdi olarak adlandırılmış bir ağ arayüzü almak üzere tasarlanmıştır ve daha sonra giden trafik için o arayüzün IP adresini kullanmaya çalışacaktır.
Ancak ad, bir IP adresi veya bir ana bilgisayar adı da olabilir, ancak bu sürümleri kullanmanızı önermiyoruz.
libcurl'ün sağlanan girdinin ne tür olduğunu tahmin etmesini önlemek için, adın bir ana bilgisayar adıyla karıştırılmadığından emin olmak üzere arayüz adının önüne "if!" ekleyin.
Benzer şekilde, adresin bir ana bilgisayar adı veya IP numarası olduğunda ısrar etmek için sağlanan adın önüne "host!" eklersiniz.
Yerel port numarası
Varsayılan olarak, bağlantılar için sözde geçici port (ephemeral port) aralığından 16 bitlik rastgele kaynak yerel port numaraları kullanılır. Bir uygulama, CURLOPT_LOCALPORT ve CURLOPT_LOCALPORTRANGE seçenekleriyle kullanılacak belirli bir port aralığı isteyebilir. Port numaraları sınırlı kaynaklar olduğundan, seçilecek portların seçimini daraltmak, denenen port numaralarından hiçbiri şu anda kullanılabilir değilse bağlantının kurulamama riskini artıracaktır.
Bağlantı yeniden kullanımı (Connection reuse)
libcurl eski bağlantılardan oluşan bir havuzu canlı tutar. Bir transfer tamamlandığında, mevcut bağlantılardan birini yeniden kullanabilecek bir sonraki transferin yeni bir bağlantı oluşturmak yerine onu kullanabilmesi için bir bağlantı havuzunda (bazen bağlantı önbelleği olarak da adlandırılır) N bağlantıyı canlı tutar. Yeni bir bağlantı oluşturmak yerine bir bağlantıyı yeniden kullanmak, hız ve gerekli kaynaklar açısından önemli avantajlar sunar.
libcurl bir transfer yapmak amacıyla yeni bir bağlantı kurmak üzereyken, önce havuzda yeniden kullanabileceği mevcut bir bağlantı olup olmadığını kontrol eder. Bağlantı yeniden kullanım kontrolü, herhangi bir DNS veya diğer ad çözümleme mekanizması kullanılmadan önce yapılır, bu nedenle tamamen ana bilgisayar adına dayalıdır. Doğru ana bilgisayar adına mevcut canlı bir bağlantı varsa, kullanılıp kullanılamayacağını görmek için diğer birçok özellik (port numarası, protokol vb.) de kontrol edilir.
Easy API havuzu
Easy API'yi veya daha spesifik olarak curl_easy_perform()'u kullandığınızda, libcurl havuzu belirli easy handle ile ilişkili tutar. Ardından aynı easy handle'ı yeniden kullanmak, libcurl'ün bağlantısını yeniden kullanabilmesini sağlar.
Multi API havuzu
Multi API'yi kullandığınızda, bağlantı havuzu bunun yerine multi handle ile ilişkili tutulur. Bu, bağlantı havuzunu kaybetme riski olmadan easy handle'ları serbestçe temizlemenize ve yeniden oluşturmanıza olanak tanır ve bir easy handle tarafından kullanılan bağlantının daha sonraki bir transferde ayrı bir easy handle tarafından yeniden kullanılmasına izin verir. Sadece multi handle'ı yeniden kullanın.
Bağlantı önbelleğini paylaşma
libcurl 7.57.0'dan bu yana uygulamalar, aksi takdirde bağımsız transferlerin aynı bağlantı havuzunu paylaşmasını sağlamak için paylaşım arayüzünü (share interface) kullanabilir.
Bağlantılar istediğiniz gibi yeniden kullanılmadığında
libcurl, açıkça yapmaması söylenmedikçe bağlantıları otomatik olarak ve her zaman yeniden kullanmaya çalışacaktır. Ancak bir bağlantının sonraki bir transfer için kullanılmamasının birkaç nedeni vardır.
-
Sunucu, bu transferden sonra bağlantının kapatılacağını bildirir. Örneğin
Connection: closeHTTP yanıt başlığını veya bir HTTP/2 veya HTTP/3 "go away" çerçevesini kullanarak. -
Bir transferin HTTP/1 yanıtı, gövdenin sonunu algılamanın tek yolunun bağlantı kapatma olduğu bir şekilde gönderilir. Veya curl'ün bağlantıyı artık güvenli bir şekilde yeniden kullanamayacağına karar vermesini sağlayan bir HTTP/1 alma hatası.
-
libcurl yeniden kullanmaya çalıştığında bağlantı "ölü" kabul edilir. Sunucu tarafı önceki transfer tamamlandıktan sonra bağlantıyı kapattığında olabilir. Ayrıca durum bilgisi olan bir güvenlik duvarı/NAT veya ağ yolundaki bir şey bağlantıyı düşürürse veya gözetimsizken bağlantı üzerinde HTTP/2 veya HTTP/3 trafiği (PING çerçeveleri gibi) varsa da olabilir.
-
Önceki transfer yeniden kullanılamayacak kadar eski kabul edilir.
CURLOPT_MAXLIFETIME_CONNayarlanmışsa, libcurl saniye cinsinden ayarlanan değerden daha eski bir bağlantıyı yeniden kullanmaz. -
Önceki transferin çok uzun süre boşta kaldığı kabul edilir. Varsayılan olarak libcurl, 118 saniyeden fazla boşta kalan bir bağlantıyı asla yeniden kullanmaya çalışmaz. Bu süre
CURLOPT_MAXAGE_CONNile değiştirilebilir. -
Bir transfer sona erdiğinde ve oraya yeni bir bağlantı depolanmak üzereyken bağlantı havuzu doluysa, havuzdaki en eski boşta bağlantı kapatılır ve atılır ve bu nedenle artık yeniden kullanılamaz. Kullandığınız API'ye bağlı olarak
CURLMOPT_MAXCONNECTSveyaCURLOPT_MAXCONNECTSile bağlantı havuzu boyutunu artırın. -
Multi arayüz kullanılırken, bir sonraki transfer başlatıldığında önceki transfer sona ermemişse ve önceki bağlantı çoğullama (multiplexing) için kullanılamıyorsa.
Vb. Genellikle CURLOPT_VERBOSE özelliğini etkinleştirerek ve libcurl'ün uygulamaya ne bildirdiğini inceleyerek nedenini öğrenebilirsiniz.
Canlı tutma (Keep alive)
Bir TCP bağlantısı kurulduktan sonra, bu bağlantı bir taraf onu kapatana kadar geçerli olarak tanımlanır. Bağlantı bağlı duruma girdiğinde, süresiz olarak bağlı kalacaktır. Gerçekte, bağlantı süresiz olarak sürmeyecektir. Birçok güvenlik duvarı veya NAT sistemi, bir süre boyunca etkinlik olmadıysa bağlantıları kapatır. Canlı Tutma (Keep Alive) sinyali, ara ana bilgisayarların hareketsizlik nedeniyle boşta kalan bağlantıyı kapatmasını önlemek için kullanılabilir.
libcurl, oluşturduğu bağlantılar için TCP Canlı tutmayı etkinleştirmek ve kontrol etmek üzere birkaç seçenek sunar. Özelliği açmak/kapatmak için bir ana boolean seçenek vardır ve ilgili sayaçlar ve zaman aşımları için üç ayrı seçenek vardır.
Bu yöntemin boşta kalan bağlantıları kapatan orta kutuları (middle boxes) yenmeye çalışmasına rağmen, canlı tutma sondalarını (probes) basitçe görmezden gelen kutuların da olduğu belirtilebilir. Bunun gerçekten işe yarayacağının garantisi yoktur.
Canlı tutmayı etkinleştir
Etkinleştirmek için CURLOPT_TCP_KEEPALIVE long değerini 1'e, devre dışı bırakmak için 0'a ayarlayın. Etkinleştirilirse, libcurl bu handle'ı kullanarak oluşturduğu herhangi bir yeni TCP bağlantısında TCP Canlı Tutma seçeneklerini ayarlayacaktır. UDP veya QUIC gibi diğer protokolleri kullanarak bağlantılar oluşturursa, bu bağlantılar etkilenmeyecektir.
Boşta kalma süresi (Idle time)
İlk canlı tutma sondasını göndermeden önce bağlantının boşta kalmasını istediğiniz saniye sayısına CURLOPT_TCP_KEEPIDLE long değerini ayarlarsınız. Varsayılan değer 60 saniyedir. Bunu en katı orta kutunuzdaki zaman sınırından biraz daha düşük bir zamana ayarlamaya çalışmak mantıklıdır.
Sonda aralığı (Probe interval)
Sonraki canlı tutma sondaları arasında beklenecek saniye sayısı için CURLOPT_TCP_KEEPINTVL long değerini ayarlayın. İlk canlı tutma sondası gönderildikten sonra gelen sondalar. Varsayılan 60 saniyedir.
Sonda sayısı (Probe count)
Bazen canlı tutma yeniden denemesi olarak anılır. Uzak ucun mevcut olmadığını ilan etmeden ve bağlantıyı kapatmadan önce gerçekleştirilecek yeniden iletim sayısını tutan CURLOPT_TCP_KEEPCNT long değerini ayarlayın. Varsayılan 9'dur. Bu libcurl seçeneği, önceki seçeneklerden çok sonra 8.9.0'da eklendi.
Örnek
TCP canlı tutmayı kullanarak transfer yapan küçük bir libcurl uygulaması örneği.
int main(void)
{
CURL *curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* bu transfer için TCP keep-alive etkinleştir */
curl_easy_setopt(curl, CURLOPT_TCP_KEEPALIVE, 1L);
/* keep-alive boşta kalma süresi 120 saniye */
curl_easy_setopt(curl, CURLOPT_TCP_KEEPIDLE, 120L);
/* keep-alive sondaları arasındaki zaman aralığı: 60 saniye */
curl_easy_setopt(curl, CURLOPT_TCP_KEEPINTVL, 60L);
/* maksimum keep-alive sonda sayısı: 3 */
curl_easy_setopt(curl, CURLOPT_TCP_KEEPCNT, 3L);
curl_easy_perform(curl);
}
}
HTTP Keep-Alive
HTTP/1.0 için Connection: başlığında kullanılan Keep-Alive adlı eski bir anahtar kelime vardı. Tamamen ayrı bir işlevselliğe sahiptir ve TCP Canlı Tutma ile ilgili değildir: bağlantının sonraki transferlerde kalıcı kullanım için canlı tutulması gerektiği anlamına geliyordu. Bu, HTTP 1.1'de varsayılan hale geldi.
QUIC ve HTTP/2
Hem QUIC hem de HTTP/2, iletişimde yer alan iki eş arasında gönderilebilen ve daha sonra TCP Canlı Tutma ile benzer etkilere sahip PING çerçevelerine (frames) sahiptir. Ancak bu seçenekler libcurl'ün PING çerçevelerini kullanımını kontrol etmez.
Ad çözme (Name resolving)
libcurl'ün yapabileceği çoğu transfer, önce bir İnternet adresine çevrilmesi gereken bir ad içerir. Bu ad çözmedir. Sayısal bir IP adresini doğrudan URL'de kullanmak genellikle ad çözme aşamasını önler ancak çoğu durumda adı IP adresiyle manuel olarak değiştirmek kolay değildir.
libcurl, yeni bir bağlantı oluşturmak yerine mevcut bir bağlantıyı yeniden kullanmaya çok çalışır. Kullanılacak mevcut bir bağlantıyı kontrol eden işlev tamamen ada dayanır ve herhangi bir ad çözme denenmeden önce gerçekleştirilir. Yeniden kullanımın bu kadar hızlı olmasının nedenlerinden biri de budur. Yeniden kullanılan bir bağlantıyı kullanan bir transfer, ana bilgisayar adını tekrar çözmez.
Hiçbir bağlantı yeniden kullanılamazsa, libcurl ana bilgisayar adını çözüldüğü adresler kümesine çözer. Genellikle bu, hem IPv4 hem de IPv6 adreslerini istemek anlamına gelir ve libcurl'e döndürülen bunlardan oluşan koca bir küme olabilir. Bu adres kümesi daha sonra biri çalışana kadar denenir veya başarısızlık döndürür.
Bir uygulama, CURLOPT_IPRESOLVE seçeneğini tercih edilen değere ayarlayarak libcurl'ü yalnızca bir IPv4 veya IPv6 çözülmüş adresi kullanmaya zorlayabilir. Örneğin, yalnızca IPv6 adreslerini kullanmayı isteyin:
curl_easy_setopt(easy, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V6);
Ad çözümleyici arka uçları
libcurl, ad çözümlerini bu üç farklı yoldan biriyle yapacak şekilde oluşturulabilir ve hangi arka uç yolunun kullanıldığına bağlı olarak biraz farklı bir özellik seti ve bazen değiştirilmiş davranış alır.
-
Varsayılan arka uç, normal libc çözümleyici işlevlerini yeni bir yardımcı iş parçacığında çağırmaktır, böylece istenirse hala hassas zaman aşımları yapabilir ve engelleme çağrıları söz konusu olmaz.
-
Eski sistemlerde, libcurl standart eşzamanlı ad çözümleyici işlevlerini kullanır. Maalesef bunlar, işlemi sırasında bir multi handle içindeki tüm transferleri engeller ve güzel bir şekilde zaman aşımına uğraması çok daha zordur.
-
Ayrıca, iş parçacığı kullanmadan eşzamansız ad çözmeyi destekleyen c-ares üçüncü taraf kütüphanesiyle çözme desteği de vardır. Bu, çok sayıda paralel transfere daha iyi ölçeklenir ancak yerel ad çözümleyici işlevselliğiyle her zaman %100 uyumlu değildir.
HTTPS üzerinden DNS (DNS over HTTPS)
libcurl hangi çözümleyici arka ucunu kullanacak şekilde oluşturulmuş olursa olsun, 7.62.0'dan bu yana kullanıcıya bir adın adresi için belirli bir DoH (HTTPS üzerinden DNS) sunucusuna sorması için bir yol da sağlar. Bu, normal, yerel çözümleyici yöntemini ve sunucusunu kullanmaktan kaçınır ve bunun yerine özel bir ayrı sunucuya sorar.
Bir DoH sunucusu, CURLOPT_DOH_URL seçeneğiyle tam bir URL olarak şöyle belirtilir:
curl_easy_setopt(easy, CURLOPT_DOH_URL, "https://example.com/doh");
Bu seçeneğe iletilen URL https:// kullanmalıdır ve libcurl'ün DoH sunucusuna olan bağlantı üzerinden çoğullanan birden çok DoH isteğini gerçekleştirebilmesi için HTTP/2 desteğinin etkinleştirilmiş olması genellikle önerilir.
Önbelleğe alma
Bir ad çözüldüğünde, sonuç libcurl'ün bellek içi önbelleğinde saklanır, böylece aynı adın sonraki çözümleri ad DNS önbelleğinde tutulduğu sürece anında gerçekleşir. Varsayılan olarak, her giriş önbellekte 60 saniye tutulur ancak bu değer CURLOPT_DNS_CACHE_TIMEOUT ile değiştirilebilir.
DNS önbelleği, curl_easy_perform kullanıldığında easy handle içinde veya multi arayüz kullanıldığında multi handle içinde tutulur. Ayrıca paylaşım arayüzü kullanılarak birden fazla easy handle arasında paylaşılabilir hale getirilebilir.
Ana bilgisayarlar için özel adresler
Bazen gerçek ana bilgisayar adları için sahte, özel adresler sağlamak kullanışlıdır, böylece libcurl gerçek bir ad çözümlemesinin önereceği adres yerine farklı bir adrese bağlanır.
CURLOPT_RESOLVE seçeneğinin yardımıyla, bir uygulama libcurl'ün DNS önbelleğini belirli bir ana bilgisayar adı ve port numarası için özel bir adresle önceden doldurabilir.
example.com port 443'te istendiğinde libcurl'ün 127.0.0.1'e bağlanmasını sağlamak için bir uygulama şunları yapabilir:
struct curl_slist *dns;
dns = curl_slist_append(NULL, "example.com:443:127.0.0.1");
curl_easy_setopt(curl, CURLOPT_RESOLVE, dns);
Bu, sahte adresi DNS önbelleğine koyduğundan, yönlendirmeleri vb. takip ederken bile çalışır.
Ad sunucusu seçenekleri
c-ares kullanmak üzere oluşturulmuş libcurl için, hangi DNS sunucularının kullanılacağı ve nasıl kullanılacağı konusunda hassas kontrol sunan birkaç seçenek vardır. Bu, tamamen c-ares derlemesiyle sınırlıdır çünkü bunlar, ad çözme için standart sistem çağrıları kullanıldığında mevcut olmayan güçlerdir.
-
CURLOPT_DNS_SERVERSile uygulama, bir dizi özel DNS sunucusu kullanmayı seçebilir. -
CURLOPT_DNS_INTERFACEile libcurl'e varsayılan yerine hangi ağ arayüzü üzerinden DNS konuşacağını söyleyebilir. -
CURLOPT_DNS_LOCAL_IP4veCURLOPT_DNS_LOCAL_IP6ile uygulama, DNS çözümlerini hangi belirli ağ adreslerine bağlayacağını belirtebilir.
Küresel DNS önbelleği yok
CURLOPT_DNS_USE_GLOBAL_CACHE adlı seçenek bir zamanlar curl'e küresel bir DNS önbelleği kullanmasını söylüyordu. Bu işlevsellik 7.65.0'dan beri kaldırılmıştır, bu nedenle bu seçenek hala mevcut olsa da hiçbir şey yapmaz.
Vekil sunucular (Proxies)
Ağ bağlamında bir proxy (vekil sunucu), bir aracıdır; bir istemci olarak sizinle iletişim kurmak istediğiniz uzak sunucu arasında duran bir sunucudur. İstemci aracı ile iletişim kurar, o da sizin için uzak sunucuyla iletişim kurmaya devam eder.
Bu tarz proxy kullanımı bazen şirketler ve kuruluşlar tarafından kullanılır, bu durumda genellikle hedef sunucuya ulaşmak için bunları kullanmanız gerekir.
Birkaç farklı türde proxy ve bir proxy ile iletişim kurarken kullanılacak farklı protokoller vardır ve libcurl en yaygın proxy protokollerinden birkaçını destekler. Proxy ile kullanılan protokolün uzak sunucuyla kullanılan protokolle aynı olması gerekmediğini anlamak önemlidir.
libcurl ile bir transfer ayarlarken, proxy'nin sunucu adını ve port numarasını belirtmeniz gerekir. Favori tarayıcılarınızın bunu libcurl'den biraz daha gelişmiş yollarla yapabildiğini görebilirsiniz ve sonraki bölümlerde bu tür ayrıntılara gireceğiz.
Proxy türleri
libcurl iki ana proxy türünü destekler: SOCKS ve HTTP proxy'leri. Daha spesifik olarak, hem SOCKS4 hem de SOCKS5'i (uzak ad araması olan veya olmayan), ayrıca yerel proxy'ye hem HTTP hem de HTTPS'i destekler.
Hangi tür proxy ile konuştuğunuzu belirtmenin en kolay yolu, proxy ana bilgisayar adı dizesinin (CURLOPT_PROXY) şema kısmını onunla eşleşecek şekilde ayarlamaktır:
socks4://proxy.example.com:12345/
socks4a://proxy.example.com:12345/
socks5://proxy.example.com:12345/
socks5h://proxy.example.com:12345/
http://proxy.example.com:12345/
https://proxy.example.com:12345/
socks4 - yerel ad çözme ile SOCKS4 anlamına gelir
socks4a - proxy'nin ad çözmesi ile SOCKS4 anlamına gelir
socks5 - yerel ad çözme ile SOCKS5 anlamına gelir
socks5h - proxy'nin ad çözmesi ile SOCKS5 anlamına gelir
http - HTTP anlamına gelir, bu her zaman proxy'nin adları çözmesine izin verir
https - proxy'ye HTTPS anlamına gelir, bu her zaman proxy'nin adları çözmesine izin verir.
Yalnızca ana bilgisayar adını ayarlamayı tercih ediyorsanız, CURLOPT_PROXYTYPE kullanarak proxy türünü ayrı bir seçenekle ayarlamayı da seçebilirsiniz. Benzer şekilde, CURLOPT_PROXYPORT ile kullanılacak proxy port numarasını ayarlayabilirsiniz.
Yerel veya proxy ad araması
Yukarıdaki bir bölümde, farklı proxy kurulumlarının ad çözümlemesinin transfere dahil olan farklı taraflarca yapılmasına izin verdiğini görebilirsiniz. Birkaç durumda, istemcinin sunucu ana bilgisayar adını çözmesini ve bağlanmak için IP adresini proxy'ye iletmesini sağlayabilirsiniz - bu da elbette ad aramasının istemci sisteminde doğru bir şekilde çalıştığını varsayar - veya adı proxy'ye verip proxy'nin adı çözmesini sağlayabilirsiniz; bağlanmak için bir IP adresine dönüştürerek.
Bir HTTP veya HTTPS proxy kullanırken, adı her zaman çözmesi için proxy'ye verirsiniz.
Hangi proxy?
Ağ bağlantınız hedefe ulaşmak için bir proxy kullanılmasını gerektiriyorsa, bunu anlamalı ve libcurl'e doğru proxy'yi kullanmasını söylemelisiniz. libcurl'de bir proxy'yi otomatik olarak anlamasını veya algılamasını sağlayacak bir destek yoktur.
Bir tarayıcı kullanırken, proxy'yi bir PAC betiği veya başka araçlarla sağlamak popülerdir ancak bunların hiçbiri libcurl tarafından tanınmaz.
Proxy ortam değişkenleri
Hiçbir proxy seçeneği ayarlanmamışsa, libcurl transferini gerçekleştirmeden önce bir proxy'nin kullanılması istenip istenmediğini görmek için özel olarak adlandırılmış ortam değişkenlerinin varlığını kontrol eder.
Proxy ana bilgisayar adını tutmak için [scheme]_proxy adlı bir değişken ayarlayarak proxy'yi belirtebilirsiniz (ana bilgisayarı -x ile belirttiğiniz gibi). Bir HTTP sunucusuna erişirken curl'e bir proxy kullanmasını söylemek istiyorsanız http_proxy ortam değişkenini ayarlarsınız. Şöyle:
http_proxy=http://proxy.example.com:80
Yukarıdaki proxy örneği HTTP içindir, ancak elbette proxy yapmak istediğiniz belirli protokoller için ftp_proxy, https_proxy vb. de ayarlayabilirsiniz. http_proxy dışındaki tüm bu proxy ortam değişkeni adları HTTPS_PROXY gibi büyük harfle de belirtilebilir.
Tüm protokolleri kontrol eden tek bir değişken ayarlamak için ALL_PROXY mevcuttur. Belirli bir protokol değişkeni mevcutsa, o önceliklidir.
Proxy ayarlamak için ortam değişkenlerini kullanırken, bir veya birkaç ana bilgisayar adının proxy'den geçmesinin hariç tutulması gereken bir duruma kolayca düşebilirsiniz. Bu, NO_PROXY değişkeniyle - veya karşılık gelen CURLOPT_NOPROXY libcurl seçeneğiyle - yapılabilir. Bunu, erişilirken bir proxy kullanmaması gereken, virgülle ayrılmış ana bilgisayar adları listesine ayarlayın. NO_PROXY'yi tüm ana bilgisayarlarla eşleşmesi için tek bir yıldıza ('*') ayarlayabilirsiniz.
HTTP proxy
HTTP protokolü, bir HTTP proxy'sinin tam olarak nasıl kullanılması gerektiğini ayrıntılandırır. İsteği asıl uzak sunucuya göndermek yerine, istemci (libcurl) bunun yerine proxy'den belirli kaynağı ister. HTTP proxy'sine bağlantı, düz şifrelenmemiş HTTP kullanılarak yapılır.
Bir HTTPS kaynağı istenirse, libcurl bunun yerine proxy'ye bir CONNECT isteği gönderir. Böyle bir istek, proxy üzerinden verileri anlamadan geçirdiği bir tünel açar. Bu şekilde, bir HTTP proxy'si mevcut olsa bile libcurl uçtan uca güvenli bir TLS bağlantısı kurabilir.
HTTP olmayan protokolleri bir HTTP proxy üzerinden proxy yapabilirsiniz, ancak bu çoğunlukla verileri tünellemek için CONNECT yöntemiyle yapıldığından, proxy'nin istemcinin o diğer belirli uzak port numaralarına bağlanmasına izin verecek şekilde yapılandırılmasını gerektirir. Birçok HTTP proxy'si, 80 ve 443 dışındaki port numaralarına bağlantıları engelleyecek şekilde ayarlanmıştır.
HTTPS proxy
Bir HTTPS proxy'si, bir HTTP proxy'sine benzer ancak istemcinin ona güvenli bir HTTPS bağlantısı kullanarak bağlanmasına izin verir. Proxy bağlantısı uzak siteye olan bağlantıdan ayrı olduğundan (bu durumda bile uzak siteye HTTPS, proxy'ye HTTPS bağlantısı üzerinden tünellenir), libcurl proxy bağlantısı için uzak ana bilgisayara olan bağlantıdan ayrı bir dizi TLS seçeneği sunar.
Örneğin, CURLOPT_PROXY_CAINFO uzak ana bilgisayar için CURLOPT_CAINFO neyse HTTPS proxy için aynı işlevdir. CURLOPT_PROXY_SSL_VERIFYPEER, CURLOPT_SSL_VERIFYPEER'ın proxy sürümüdür vb.
libcurl varsayılan olarak HTTPS proxy'lerine HTTP/1 konuşur. Proxy de bir https:// şeması kullanacak şekilde ayarlandığında CURLOPT_PROXYTYPE'ı CURLPROXY_HTTPS2 olarak ayarlayarak HTTP/2 kullanmayı denemesini sağlayabilirsiniz. Proxy'ye HTTP/2 kullanırken, libcurl uzak protokol TLS tabanlı olmadığı sürece farklı uzak sunucuyla konuşurken proxy bağlantısını yeniden kullanabilir ve bunun üzerinden çoğullanmış transferler yapabilir.
Proxy kimlik doğrulaması
Bir proxy ile kimlik doğrulama, proxy'nin kendisiyle yapılan el sıkışma pazarlığında geçerli kimlik bilgileri sağlamanız gerektiği anlamına gelir. Proxy kimlik doğrulaması, uzak ana bilgisayarla olası kimlik doğrulamasına veya kimlik doğrulama eksikliğine ek olarak ve ondan ayrıdır.
libcurl HTTP, HTTPS ve SOCKS5 proxy'leri ile kimlik doğrulamayı destekler. Anahtar seçenek o zaman kullanılacak kullanıcı adını ve şifreyi ayarlayan CURLOPT_PROXYUSERPWD'dir - CURLOPT_PROXY dizesi içinde ayarlamadıysanız.
HTTP Proxy başlıkları
Bir HTTP veya HTTPS proxy ile, libcurl proxy'ye bir dizi başlık içeren bir istek gönderir. Bir uygulama, tıpkı sunuculara gönderilen isteklerde olduğu gibi başlıkları değiştirebilir.
libcurl, sunucuya gönderilen ayrı bir istek olduğunda bir proxy'ye gönderilen başlıkları kontrol etmek için CURLOPT_PROXYHEADER sunar. Bu genellikle proxy üzerinden bir tünel kurmak için bir proxy'ye gönderilen ilk CONNECT isteği anlamına gelir.
Transfer kontrolü
Devam eden bir transfer birkaç yolla kontrol edilebilir. Aşağıdaki sayfalar daha fazla ayrıntıyı açıklamaktadır:
- Durdurma (Stop)
- Yavaş transferleri durdurma
- Hız sınırı (Rate limit)
- İlerleme ölçer (Progress meter)
- İlerleme geri çağırımı
Durdurma (Stop)
Bir İnternet transferi kısa olabilir ancak uzun zaman da alabilir. Belki de sonsuz miktarda zaman.
libcurl normalde transferleri tamamlanana veya bir hata oluşana kadar gerçekleştirir. Bu olaylardan hiçbiri gerçekleşmezse, transfer devam eder.
Bazen, bir libcurl transferini aksi takdirde duracağı zamandan önce durdurmak isteyebilirsiniz.
easy API
Başka bir yerde açıklandığı gibi, curl_easy_perform() işlevi eşzamanlı bir işlev çağrısıdır. Dönmeden önce tüm transferi yapar.
Bir transferi aksi takdirde sona ereceği zamandan önce durdurmanın birkaç farklı yolu vardır:
- bir geri çağırımdan hata döndürmek
- transferin belirli bir süre sonra durmasını sağlayan bir seçenek ayarlamak
Her geri çağırım (callback) bir hata döndürebilir ve o işlevlerden birinden bir hata döndürüldüğünde tüm transfer durdurulur. Örneğin okuma, yazma veya ilerleme geri çağırımları.
İkinci yol, bir süre sonra veya belirli bir durumda transferi durduran bir zaman aşımı veya başka bir seçenek ayarlamaktır. Örneğin aşağıdakilerden biri veya birkaçı:
CURLOPT_TIMEOUT- tüm transferin alabileceği maksimum süreyi ayarlaCURLOPT_CONNECTTIMEOUT- "bağlantı aşamasının" alabileceği maksimum süreyi ayarlaCURLOPT_LOW_SPEED_LIMIT- kabul edilebilir en düşük transfer hızını ayarla.CURLOPT_LOW_SPEED_TIMEsaniye sayısı boyunca bu hızdan daha yavaşsa transfer durur.
Uygulamanızın devam eden bir curl_easy_perform() çağrısını başka bir iş parçacığından durdurmasına izin veren sağlanan bir işlev yoktur. Yaygın öneri, bu niyeti bir geri çağırımda algılayabileceğiniz özel bir yolla bildirmeniz ve bu gerçekleştiğinde o geri çağırımın hata döndürmesini sağlamanızdır.
multi API
Multi arayüz genellikle engellemeyen (non-blocking) bir API'dir, bu nedenle çoğu durumda ilgili easy handle'ı curl_multi_remove_handle() kullanarak multi handle'dan kaldırarak bir transferi durdurabilirsiniz.
Multi API'yi kullandığınızda, libcurl'ü libcurl'ün çalıştığı soketlerdeki etkinlikleri veya trafiği beklemesi için çağırabilirsiniz. curl_multi_poll() gibi bir şeyin olmasını (veya bir zaman aşımının dolmasını) beklerken engelleyebilecek bir çağrı.
Bir uygulama, başka bir iş parçacığından curl_multi_wakeup() çağırarak engellenen bir curl_multi_poll() çağrısının uyanmasını ve zorla ve hemen dönmesini sağlayabilir.
Yavaş transferleri durdurma
Varsayılan olarak, bir transfer duraklayabilir veya verileri herhangi bir süre boyunca son derece yavaş aktarabilir ve bu bir hata olmaz.
M saniye boyunca N bayt/sn'nin altındaysa bir transferi durdurun. N'yi CURLOPT_LOW_SPEED_LIMIT ile ve M'yi CURLOPT_LOW_SPEED_TIME ile ayarlayın.
Bu seçenekleri gerçek kodda kullanmak şöyle görünebilir:
#include <stdio.h>
#include <curl/curl.h>
int main(void)
{
CURL *curl;
CURLcode res = CURLE_OK;
curl = curl_easy_init();
if(curl) {
/* 60 saniye boyunca 30 bayt/sn'den yavaşsa iptal et */
curl_easy_setopt(curl, CURLOPT_LOW_SPEED_TIME, 60L);
curl_easy_setopt(curl, CURLOPT_LOW_SPEED_LIMIT, 30L);
curl_easy_setopt(curl, CURLOPT_URL, "https://curl.se/");
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
}
return (int)res;
}
Hız sınırı (Rate limit)
Bir uygulamanın bir hız sınırı belirlemesine izin verir. Saniyede ayarlanan bayt sayısından daha hızlı veri transfer etmeyin. libcurl daha sonra ortalama hızı birden çok saniyelik bir süre boyunca verilen eşiğin altında tutmaya çalışır.
Alma (CURLOPT_MAX_RECV_SPEED_LARGE) ve gönderme (CURLOPT_MAX_SEND_SPEED_LARGE) için ayrı seçenekler vardır.
İşte kullanımını gösteren örnek bir kaynak kodu:
#include <stdio.h>
#include <curl/curl.h>
int main(void)
{
CURL *curl;
CURLcode res = CURLE_OK;
curl = curl_easy_init();
if(curl) {
curl_off_t maxrecv = 31415;
curl_off_t maxsend = 67954;
curl_easy_setopt(curl, CURLOPT_MAX_RECV_SPEED_LARGE, maxrecv);
curl_easy_setopt(curl, CURLOPT_MAX_SEND_SPEED_LARGE, maxsend);
curl_easy_setopt(curl, CURLOPT_URL, "https://curl.se/");
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
}
return (int)res;
}
İlerleme ölçer (Progress meter)
libcurl'ün stderr'de bir ilerleme ölçer çıktısı vermesi sağlanabilir. Bu özellik varsayılan olarak devre dışıdır ve adında garip bir olumsuzlama bulunan seçeneklerden biridir: CURLOPT_NOPROGRESS - ilerleme ölçeri devre dışı bırakmak için 1L olarak ayarlayın. Etkinleştirmek için 0L olarak ayarlayın.
Transferi durdurmak için hata döndür
Kodda şuna benzer görünebilir:
#include <stdio.h>
#include <curl/curl.h>
int main(void)
{
CURL *curl;
CURLcode res = CURLE_OK;
curl = curl_easy_init();
if(curl) {
/* ilerleme ölçeri etkinleştir */
curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0L);
curl_easy_setopt(curl, CURLOPT_URL, "https://curl.se/");
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
}
return (int)res;
}
İlerleme geri çağırımı
Bu geri çağırım, uygulamanın transfer ilerlemesini takip etmesini sağlar. Ayrıca easy arayüzü ile boşta (idle) iken çağrılır ve libcurl'ün hata döndürerek bir transferi durdurmasını sağlamanın yaygın bir yoludur.
Tüm ayrıntılar için ilerleme geri çağırımı (progress callback) bölümüne bakın.
Kimlik Doğrulama
libcurl ile transfer yapmak genellikle uygulamanın herhangi bir kimlik bilgisi sağlamadan bunu yapmasına olanak tanır. Buna belki de anonim olarak diyebilirsiniz.
FTP transferleri için libcurl, kuralın bize söylediği gibi varsayılan bir kullanıcı ve şifre kullanırken, SFTP ve SCP gibi diğer bazı protokollerde transfer büyük olasılıkla başarısız olur. Kimlik doğrulama, bazı transferler için sadece zorunludur.
libcurl için kimlik doğrulama, kimlik bilgileri (kullanıcı + şifre) ve bazı durumlarda ek bir yöntem anlamına gelir: uygulamanın hangi kimlik doğrulama yöntemini kullanacağını seçmesine izin vermek. Her protokolün genellikle kendi setleri vardır.
Kimlik doğrulama yöntemine ve iletimin belki de kimlik doğrulamalı bir güvenlik katmanı (TLS, QUIC veya SSH gibi) kullanmıyor olmasına bağlı olarak, hassas bilgilerin ağ üzerinden sızma riski vardır. Bu riskten kaçınmanın en kolay yolu, kimlik doğrulaması olmayan protokollerle asla kimlik doğrulama kullanmamaktır.
Bazı protokoller veya yöntemler için kimlik doğrulama bağlantı başına yapılırken, diğerleri için transfer başına yapılır. libcurl bunu takip eder ve bağlantıların doğru şekilde yeniden kullanıldığından emin olur. Yani bazen farklı kimlik bilgileri kullanılarak yapılan transferler için bağlantıları yeniden kullanamaz ancak bazen kullanabilir.
Kullanıcı adı
Kullanıcı adını CURLOPT_USERNAME ile düz, null ile sonlandırılmış bir C dizesi olarak ayarlayın.
CURLOPT_USERPWD adlı eski seçeneğin kullanılmasından kaçınılması daha iyidir, bunun basit nedeni kullanıcı adı ve şifreyi aynı dizede, iki nokta üst üste ile ayrılmış olarak istemesidir; bu da ad veya şifre iki nokta üst üste içeriyorsa kolayca sorunlara neden olur. Bunun asla olmayacağını garanti etmek zor olabilir.
Şifre
Kullanılacak şifreyi CURLOPT_PASSWORD ile düz, null ile sonlandırılmış bir C dizesi olarak ayarlayın.
Yöntem
Yöntem seçimi protokole bağlıdır. HTTP özellikleri için HTTP Kimlik Doğrulaması (HTTP Authentication) bölümüne bakın.
.netrc
Unix sistemleri, kullanıcıların uzak FTP sunucuları için kullanıcı adı ve şifrelerini saklamaları için uzun zamandır bir yol sunmaktadır. ftp istemcileri bunu on yıllardır desteklemiş ve bu sayede kullanıcıların her seferinde kimlik bilgilerini manuel olarak girmek zorunda kalmadan bilinen sunuculara hızlı bir şekilde giriş yapmalarına izin verilmiştir. .netrc dosyası genellikle bir kullanıcının ev dizininde saklanır.
libcurl, CURLOPT_NETRC seçeneğiyle isterseniz .netrc dosyasından kimlik bilgilerini almayı destekler.
Bu seçeneğin üç farklı ayarı vardır ve CURL_NETRC_IGNORED varsayılandır:
CURL_NETRC_OPTIONAL olarak ayarlamak, .netrc dosyasının kullanımının isteğe bağlı olduğu ve URL'de sağlanan kullanıcı bilgilerinin tercih edileceği anlamına gelir. Dosya, şifreyi bulmak için ana bilgisayar ve kullanıcı adı için taranır.
CURL_NETRC_REQUIRED ise .netrc dosyasının kullanımının gerekli olduğu ve URL'de bulunan herhangi bir kimlik bilgisinin yok sayılacağı anlamına gelir.
Temizleme (Cleanup)
Önceki bölümlerde handle'ların nasıl kurulacağını ve transferlerin nasıl yürütüleceğini tartıştık. Tüm transferler bir noktada, ya başarıyla ya da bir başarısızlıkla sona erer.
Multi API
Multi API ile tek bir transferi bitirdiğinizde, tam olarak hangi easy handle'ın tamamlandığını belirlemek için curl_multi_info_read() kullanırsınız ve curl_multi_remove_handle() ile o easy handle'ı multi handle'dan kaldırırsınız.
Son easy handle'ı multi handle'dan kaldırırsanız ve artık devam eden bir transfer yoksa, multi handle'ı şöyle kapatabilirsiniz:
curl_multi_cleanup( multi_handle );
easy handle
Easy handle amacına hizmet etmeyi bitirdiğinde onu kapatabilirsiniz. Başka bir transfer yapmayı düşünüyorsanız, handle'ı kapatıp yenisini oluşturmak yerine yeniden kullanmanız önerilir.
Easy handle ile başka bir transfer yapmayı düşünmüyorsanız, libcurl'den temizlemesini istersiniz:
curl_easy_cleanup( easy_handle );
Transfer sonrası bilgi
libcurl transferlerinin easy handle'lar ile nasıl ilişkili olduğunu hatırlayın. Her transferin böyle bir handle'ı vardır ve bir transfer tamamlandığında, handle temizlenmeden veya başka bir transfer için yeniden kullanılmadan önce, önceki işlemden bilgi çıkarmak için kullanılabilir.
Bunu yapmak için arkadaşınızın adı curl_easy_getinfo() ve ona hangi belirli bilgileri ilgilendiğinizi söylersiniz, o da yapabilirse o bilgiyi döndürür.
Bu işlevi kullandığınızda, easy handle'ı, hangi bilgiyi istediğinizi ve cevabı tutacak bir değişkene işaretçiyi iletirsiniz. Doğru türde bir değişkene işaretçi iletmelisiniz, yoksa işlerin ters gitme riskiyle karşı karşıya kalırsınız. Bu bilgi değerleri, transfer tamamlandıktan sonra sağlanmak üzere tasarlanmıştır.
Aldığınız veri bir long, bir 'char *', bir 'struct curl_slist *', bir double veya bir soket olabilir.
Önceki HTTP transferinden Content-Type: değerini şu şekilde çıkarırsınız:
CURLcode res;
char *content_type;
res = curl_easy_getinfo(curl, CURLINFO_CONTENT_TYPE, &content_type);
O bağlantıda kullanılan yerel port numarasını çıkarmak isterseniz:
CURLcode res;
long port_number;
res = curl_easy_getinfo(curl, CURLINFO_LOCAL_PORT, &port_number);
Mevcut bilgiler
| Getinfo seçeneği | Tür | Açıklama |
|---|---|---|
CURLINFO_ACTIVESOCKET | curl_socket_t | Oturumun aktif soketi |
CURLINFO_APPCONNECT_TIME | double | Başlangıçtan SSL/SSH el sıkışması tamamlanana kadar geçen süre |
CURLINFO_APPCONNECT_TIME_T | curl_off_t | Başlangıçtan SSL/SSH el sıkışması tamamlanana kadar geçen süre (mikrosaniye) |
CURLINFO_CAINFO | char * | libcurl'ün kullanmak üzere oluşturulduğu varsayılan CA dosyasının yolu |
CURLINFO_CAPATH | char * | libcurl'ün kullanmak üzere oluşturulduğu CA dizininin yolu |
CURLINFO_CERTINFO | struct curl_slist * | Sertifika zinciri |
CURLINFO_CONDITION_UNMET | long | Bir zaman koşulunun karşılanıp karşılanmadığı |
CURLINFO_CONNECT_TIME | double | Başlangıçtan uzak ana bilgisayar veya proxy tamamlanana kadar geçen süre |
CURLINFO_CONNECT_TIME_T | curl_off_t | Başlangıçtan uzak ana bilgisayar veya proxy tamamlanana kadar geçen süre (mikrosaniye) |
CURLINFO_CONN_ID | curl_off_t | Mevcut bağlantının sayısal kimliği (geri çağırımlar için) |
CURLINFO_CONTENT_LENGTH_DOWNLOAD | double | Content-Length başlığından içerik uzunluğu |
CURLINFO_CONTENT_LENGTH_DOWNLOAD_T | curl_off_t | Content-Length başlığından içerik uzunluğu |
CURLINFO_CONTENT_LENGTH_UPLOAD | double | Yükleme boyutu |
CURLINFO_CONTENT_LENGTH_UPLOAD_T | curl_off_t | Yükleme boyutu |
CURLINFO_CONTENT_TYPE | char * | Content-Type başlığından içerik türü |
CURLINFO_COOKIELIST | struct curl_slist * | Bilinen tüm çerezlerin listesi |
CURLINFO_EFFECTIVE_METHOD | char * | Son kullanılan HTTP istek yöntemi |
CURLINFO_EFFECTIVE_URL | char * | Son kullanılan URL |
CURLINFO_FILETIME | long | Alınan belgenin uzak zamanı |
CURLINFO_FILETIME_T | curl_off_t | Alınan belgenin uzak zamanı |
CURLINFO_FTP_ENTRY_PATH | char * | Bir FTP sunucusuna giriş yaptıktan sonraki giriş yolu |
CURLINFO_HEADER_SIZE | long | Alınan tüm başlıkların bayt sayısı |
CURLINFO_HTTP_CONNECTCODE | long | Son proxy CONNECT yanıt kodu |
CURLINFO_HTTP_VERSION | long | Bağlantıda kullanılan HTTP sürümü |
CURLINFO_HTTPAUTH_AVAIL | long | Mevcut HTTP kimlik doğrulama yöntemleri (bitmask) |
CURLINFO_LASTSOCKET | long | Kullanılan son soket |
CURLINFO_LOCAL_IP | char * | Son bağlantının yerel uç IP adresi |
CURLINFO_LOCAL_PORT | long | Son bağlantının yerel uç portu |
CURLINFO_NAMELOOKUP_TIME | double | Başlangıçtan ad çözme tamamlanana kadar geçen süre |
CURLINFO_NAMELOOKUP_TIME_T | curl_off_t | Başlangıçtan ad çözme tamamlanana kadar geçen süre (mikrosaniye) |
CURLINFO_NUM_CONNECTS | long | Önceki transfer için kullanılan yeni başarılı bağlantı sayısı |
CURLINFO_OS_ERRNO | long | Son bağlanma hatasından kaynaklanan errno |
CURLINFO_PRETRANSFER_TIME | double | Başlangıçtan transferin başlamasından hemen öncesine kadar geçen süre |
CURLINFO_PRETRANSFER_TIME_T | curl_off_t | Başlangıçtan transferin başlamasından hemen öncesine kadar geçen süre (mikrosaniye) |
CURLINFO_PRIMARY_IP | char * | Son bağlantının IP adresi |
CURLINFO_PRIMARY_PORT | long | Son bağlantının portu |
CURLINFO_PRIVATE | char * | Kullanıcının özel veri işaretçisi |
CURLINFO_PROTOCOL | long | Bağlantı için kullanılan protokol |
CURLINFO_PROXY_ERROR | long | Transferden CURLE_PROXY döndürüldüyse ayrıntılı (SOCKS) proxy hatası |
CURLINFO_PROXY_SSL_VERIFYRESULT | long | Proxy sertifika doğrulama sonucu |
CURLINFO_PROXYAUTH_AVAIL | long | Mevcut HTTP proxy kimlik doğrulama yöntemleri |
CURLINFO_QUEUE_TIME_T | curl_off_t | Bu transferin başlamayı beklerken kuyrukta tutulduğu süre (mikrosaniye) |
CURLINFO_REDIRECT_COUNT | long | Takip edilen toplam yönlendirme sayısı |
CURLINFO_REDIRECT_TIME | double | Son transferden önceki tüm yönlendirme adımları için harcanan süre |
CURLINFO_REDIRECT_TIME_T | curl_off_t | Son transferden önceki tüm yönlendirme adımları için harcanan süre (mikrosaniye) |
CURLINFO_REDIRECT_URL | char * | Yönlendirmeleri etkinleştirmiş olsaydınız bir yönlendirmenin sizi götüreceği URL |
CURLINFO_REFERER | char * | Kullanılan istek Referer: başlığı |
CURLINFO_REQUEST_SIZE | long | Gönderilen HTTP isteklerinde gönderilen bayt sayısı |
CURLINFO_RESPONSE_CODE | long | Son alınan yanıt kodu |
CURLINFO_RETRY_AFTER | curl_off_t | Yanıt Retry-After: başlığından gelen değer |
CURLINFO_RTSP_CLIENT_CSEQ | long | RTSP sonraki beklenen istemci CSeq |
CURLINFO_RTSP_CSEQ_RECV | long | RTSP son alınan |
CURLINFO_RTSP_SERVER_CSEQ | long | RTSP sonraki beklenen sunucu CSeq |
CURLINFO_RTSP_SESSION_ID | char * | RTSP oturum kimliği |
CURLINFO_SCHEME | char * | Bağlantı için kullanılan şema |
CURLINFO_SIZE_DOWNLOAD | double | İndirilen bayt sayısı |
CURLINFO_SIZE_DOWNLOAD_T | curl_off_t | İndirilen bayt sayısı |
CURLINFO_SIZE_UPLOAD | double | Yüklenen bayt sayısı |
CURLINFO_SIZE_UPLOAD_T | curl_off_t | Yüklenen bayt sayısı |
CURLINFO_SPEED_DOWNLOAD | double | Ortalama indirme hızı |
CURLINFO_SPEED_DOWNLOAD_T | curl_off_t | Ortalama indirme hızı |
CURLINFO_SPEED_UPLOAD | double | Ortalama yükleme hızı |
CURLINFO_SPEED_UPLOAD_T | curl_off_t | Ortalama yükleme hızı |
CURLINFO_SSL_ENGINES | struct curl_slist * | OpenSSL kripto motorlarının bir listesi |
CURLINFO_SSL_VERIFYRESULT | long | Sertifika doğrulama sonucu |
CURLINFO_STARTTRANSFER_TIME | double | Başlangıçtan ilk baytın alındığı ana kadar geçen süre |
CURLINFO_STARTTRANSFER_TIME_T | curl_off_t | Başlangıçtan ilk baytın alındığı ana kadar geçen süre (mikrosaniye) |
CURLINFO_TLS_SSL_PTR | struct curl_slist * | Daha fazla işlem için kullanılabilecek TLS oturum bilgisi |
CURLINFO_TOTAL_TIME | double | Önceki transferin toplam süresi |
CURLINFO_TOTAL_TIME_T | curl_off_t | Önceki transferin toplam süresi (mikrosaniye) |
CURLINFO_XFER_ID | curl_off_t | Mevcut transferin sayısal kimliği (geri çağırımlar için) |
libcurl HTTP
HTTP, libcurl kullanıcıları tarafından açık ara en yaygın kullanılan protokoldür ve libcurl, bu tür transferleri değiştirmek için sayısız yol sunar. HTTP protokolünün nasıl çalıştığına dair bazı temel bilgiler için HTTP protokolü temelleri bölümüne bakın.
HTTPS
HTTPS yapmak genellikle HTTP ile aynı şekilde yapılır çünkü ekstra güvenlik katmanı ve sunucu doğrulaması vb. varsayılan olarak otomatik ve şeffaf bir şekilde yapılır. URL'de sadece https:// şemasını kullanın.
HTTPS, üstünde TLS olan HTTP'dir. Ayrıca TLS transfer seçenekleri bölümüne bakın.
HTTP vekil sunucusu (proxy)
libcurl ile Vekil Sunucular kullanma bölümüne bakın
Bölümler
- HTTP yanıtları
- HTTP istekleri
- HTTP sürümleri
- HTTP aralıkları
- HTTP kimlik doğrulaması
- libcurl ile çerezler
- İndirme
- Yükleme
- Çoğullama (Multiplexing)
- HSTS
- alt-svc
Yanıtlar (Responses)
Her HTTP isteği bir HTTP yanıtı içerir. Bir HTTP yanıtı, bir dizi meta veri ve bazen sıfır bayt olabilen ve dolayısıyla mevcut olmayan bir yanıt gövdesidir. Ancak bir HTTP yanıtı her zaman yanıt başlıklarına sahiptir.
Yanıt gövdesi
Yanıt gövdesi yazma geri çağırımına ve yanıt başlıkları başlık geri çağırımına iletilir.
Hemen hemen tüm libcurl kullanan uygulamaların, alınan başlıklar ve verilerle ne yapacağını libcurl'e bildiren bu geri çağırımlardan en az birini ayarlaması gerekir.
Yanıt meta verileri
libcurl, bir uygulamanın önceden gerçekleştirilen transferden bilgi almak için libcurl'ü sorgulamasına izin veren curl_easy_getinfo() işlevini sunar.
Bazen bir uygulama sadece verinin boyutunu bilmek ister. Bir yanıtın sunucu başlıkları tarafından belirtilen boyutu curl_easy_getinfo() ile şöyle çıkarılabilir:
curl_off_t size;
curl_easy_getinfo(curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD_T, &size);
Transfer zaten tamamlanana kadar bekleyebilirseniz (tüm URL'ler boyutu önceden sağlamadığından bu da daha güvenilir bir yoldur, örneğin talep üzerine içerik üreten sunucular için), bunun yerine en son transferde indirilen veri miktarını isteyebilirsiniz.
curl_off_t size;
curl_easy_getinfo(curl, CURLINFO_SIZE_DOWNLOAD_T, &size);
HTTP yanıt kodu
Her HTTP yanıtı, HTTP yanıt kodunu içeren tek bir satırla başlar. Bu, sunucunun istek için durum fikrini içeren üç basamaklı bir sayıdır. Sayılar HTTP standart özelliklerinde ayrıntılandırılmıştır ancak şöyle çalışan aralıklara ayrılmıştır:
| Kod | Anlamı |
|---|---|
| 1xx | Geçici kod, yeni bir tane takip ediyor |
| 2xx | İşler YOLUNDA (OK) |
| 3xx | İçerik başka bir yerde |
| 4xx | İstemci sorunu nedeniyle başarısız |
| 5xx | Sunucu sorunu nedeniyle başarısız |
Bir transferden sonra yanıt kodunu şöyle çıkarabilirsiniz:
long code;
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &code);
HTTP yanıt kodu "hataları" hakkında
Yanıt kodu numaraları (4xx ve 5xx aralıklarında), sunucunun isteği işlerken bir hata olduğunu belirtmek için kullandığı numaralar içerebilse de, bunun libcurl'ün bir hata döndürmesine neden olmadığını anlamak önemlidir.
libcurl'den bir HTTP transferi gerçekleştirmesi istendiğinde, o HTTP transferi başarısız olursa bir hata döndürür. Ancak, bir HTTP 404 veya benzeri bir şey geri almak libcurl için bir sorun değildir. Bu bir HTTP transfer hatası değildir. Bir kullanıcı, bir sunucunun HTTP yanıtlarını test etmek için bir istemci yazıyor olabilir.
curl'ün 400 ve üzeri HTTP yanıt kodlarını hata olarak ele almasında ısrar ederseniz, libcurl CURLOPT_FAILONERROR seçeneğini sunar; bu ayarlanırsa curl'e bu durumda CURLE_HTTP_RETURNED_ERROR döndürmesini söyler. O zaman mümkün olan en kısa sürede hata döndürür ve yanıt gövdesini teslim etmez.
İstekler (Requests)
Bir HTTP isteği, curl'ün sunucuya ne yapacağını söylediğinde gönderdiği şeydir. Veri almak veya veri göndermek istediğinde. HTTP içeren tüm transferler bir HTTP isteğiyle başlar.
Bir HTTP isteği bir yöntem, bir yol, HTTP sürümü ve bir dizi istek başlığı içerir. libcurl kullanan bir uygulama tüm bu alanları değiştirebilir.
İstek yöntemi
Her HTTP isteği, bazen "fiil" olarak da adlandırılan bir "yöntem" içerir. Genellikle GET, HEAD, POST veya PUT gibi bir şeydir ancak DELETE, PATCH ve OPTIONS gibi daha ezoterik olanlar da vardır.
Genellikle bir transferi kurmak ve gerçekleştirmek için libcurl kullandığınızda, belirli istek yöntemi kullandığınız seçenekler tarafından ima edilir. Sadece bir URL isterseniz, yöntem GET anlamına gelirken, örneğin CURLOPT_POSTFIELDS ayarlarsanız bu libcurl'ün POST yöntemini kullanmasını sağlar. CURLOPT_UPLOAD seçeneğini true olarak ayarlarsanız, libcurl HTTP isteğinde bir PUT yöntemi gönderir vb. CURLOPT_NOBODY istemek libcurl'ün HEAD kullanmasını sağlar.
Ancak bazen bu varsayılan HTTP yöntemleri yeterince iyi değildir veya transferinizin kullanmasını istediğiniz yöntemler değildir. O zaman CURLOPT_CUSTOMREQUEST ile libcurl'e istediğiniz belirli yöntemi kullanmasını söyleyebilirsiniz. Örneğin, seçtiğiniz URL'ye bir DELETE yöntemi göndermek istiyorsunuz:
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "DELETE");
curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/file.txt");
CURLOPT_CUSTOMREQUEST ayarı, HTTP istek satırında yöntem olarak kullanılacak tek anahtar kelime olmalıdır. HTTP istek başlıklarını değiştirmek veya eklemek istiyorsanız aşağıdaki bölüme bakın.
HTTP istek başlıklarını özelleştirme
libcurl, istediğiniz veri transferlerini gerçekleştirmenin bir parçası olarak HTTP istekleri yayınladığında, bunları kendisine verilen görevi yerine getirmek için uygun olan bir dizi HTTP başlığıyla gönderir.
Sadece http://localhost/file1.txt URL'si verildiğinde, libcurl sunucuya şu isteği gönderir:
GET /file1.txt HTTP/1.1
Host: localhost
Accept: */*
Uygulamanıza CURLOPT_POSTFIELDS seçeneğini "foobar" dizesine (6 harf, tırnak işaretleri sadece burada görsel sınırlayıcı olarak kullanılmıştır) ayarlamasını da söylerseniz, şu başlıkları gönderir:
POST /file1.txt HTTP/1.1
Host: localhost
Accept: */*
Content-Length: 6
Content-Type: application/x-www-form-urlencoded
libcurl'ün gönderdiği varsayılan başlık setinden memnun değilseniz, uygulama HTTP isteğindeki başlıkları ekleme, değiştirme veya kaldırma gücüne sahiptir.
Bir başlık ekle
Aksi takdirde istekte bulunmayacak bir başlık eklemek için CURLOPT_HTTPHEADER ile ekleyin. Mr. Smith içeren Name: adında bir başlık istediğinizi varsayalım:
struct curl_slist *list = NULL;
list = curl_slist_append(list, "Name: Mr Smith");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, list);
curl_easy_perform(curl);
curl_slist_free_all(list); /* listeyi tekrar serbest bırak */
Bir başlığı değiştir
Bu varsayılan başlıklardan biri memnuniyetinizi karşılamıyorsa bunları değiştirebilirsiniz. Örneğin varsayılan Host: başlığının yanlış olduğunu düşünüyorsanız (libcurl'e verdiğiniz URL'den türetilmiş olsa bile), libcurl'e kendinizinkini söyleyebilirsiniz:
struct curl_slist *list = NULL;
list = curl_slist_append(list, "Host: Alternative");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, list);
curl_easy_perform(curl);
curl_slist_free_all(list); /* listeyi tekrar serbest bırak */
Bir başlığı kaldır
libcurl'ün bir istekte gerçekten kullanmaması gerektiğini düşündüğünüz bir başlık kullandığını düşündüğünüzde, ona o başlığı istekten kaldırmasını kolayca söyleyebilirsiniz. Örneğin Accept: başlığını kaldırmak istiyorsanız. Sadece iki nokta üst üstenin sağında hiçbir şey olmayan başlık adını sağlayın:
struct curl_slist *list = NULL;
list = curl_slist_append(list, "Accept:");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, list);
curl_easy_perform(curl);
curl_slist_free_all(list); /* listeyi tekrar serbest bırak */
İçeriği olmayan bir başlık sağla
Yukarıdaki bölümlerde fark etmiş olabileceğiniz gibi, iki nokta üst üstenin sağ tarafında içeriği olmayan bir başlık eklemeye çalışırsanız, bu bir kaldırma talimatı olarak ele alınır ve bunun yerine o başlığın gönderilmesini tamamen engeller. Bunun yerine gerçekten sağ tarafında sıfır içerik olan bir başlık göndermek istiyorsanız, özel bir işaretleyici kullanmanız gerekir. Başlığı düzgün bir iki nokta üst üste yerine noktalı virgül ile sağlamalısınız. Header; gibi. Giden HTTP isteğine iki nokta üst üstenin ardından hiçbir şey gelmeyen sadece Moo: olan bir başlık eklemek isterseniz, şöyle yazabilirsiniz:
struct curl_slist *list = NULL;
list = curl_slist_append(list, "Moo;");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, list);
curl_easy_perform(curl);
curl_slist_free_all(list); /* listeyi tekrar serbest bırak */
Yönlendiren (Referrer)
Referer: başlığı (evet, yanlış yazılmıştır), sunucuya kullanıcı aracısının şu anda talep ettiği URL'ye ulaştığında hangi URL'den yönlendirildiğini söyleyen standart bir HTTP başlığıdır. Normal bir başlıktır, bu nedenle yukarıda gösterildiği gibi CURLOPT_HEADER yaklaşımıyla kendiniz ayarlayabilir veya CURLOPT_REFERER olarak bilinen kısayolu kullanabilirsiniz. Şöyle:
curl_easy_setopt(curl, CURLOPT_REFERER, "https://example.com/fromhere/");
curl_easy_perform(curl);
Otomatik yönlendiren
libcurl'den CURLOPT_FOLLOWLOCATION seçeneğiyle yönlendirmeleri kendisinin takip etmesi istendiğinde ve yine de Referer: başlığının yönlendirmeyi yaptığı doğru önceki URL'ye ayarlanmasını istiyorsanız, libcurl'den bunu kendisinin ayarlamasını isteyebilirsiniz:
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
curl_easy_setopt(curl, CURLOPT_AUTOREFERER, 1L);
curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/redirected.cgi");
curl_easy_perform(curl);
Sürümler (Versions)
Tüm İnternet protokolleri gibi, HTTP protokolü de yıllar içinde gelişmeye devam etti ve artık dünya genelinde ve zaman içinde dağıtılmış, farklı başarı seviyelerinde farklı sürümler konuşan istemciler ve sunucular var. libcurl'ün ilettiğiniz URL'lerle çalışmasını sağlamak için libcurl, hangi HTTP sürümünü kullanacağınızı belirtmeniz için yollar sunar. libcurl, isterseniz en mantıklı varsayılan değerleri, en yaygın olanları kullanmaya çalışacak şekilde tasarlanmıştır ancak bazen bu yeterli değildir ve o zaman libcurl'e ne yapacağını söylemeniz gerekebilir.
Yerleşik HTTP/2 yeteneklerine sahip bir libcurl derlemesi kullanıyorsanız, libcurl HTTPS sunucuları için varsayılan olarak HTTP/2 kullanır. libcurl daha sonra otomatik olarak HTTP/2 kullanmayı dener veya pazarlık başarısız olursa 1.1'e geri döner. HTTP/2 yetenekli olmayan libcurl'ler varsayılan olarak HTTPS üzerinden HTTP/1.1 kullanır. Düz HTTP istekleri varsayılan olarak HTTP/1.1'dir.
Varsayılan davranış transferiniz için yeterince iyi değilse, CURLOPT_HTTP_VERSION seçeneği sizin içindir.
| Seçenek | Açıklama |
|---|---|
| CURL_HTTP_VERSION_NONE | Varsayılan davranışa geri dön |
| CURL_HTTP_VERSION_1_0 | Eski HTTP/1.0 protokol sürümünün kullanımını zorla |
| CURL_HTTP_VERSION_1_1 | İsteği HTTP/1.1 protokol sürümünü kullanarak yap |
| CURL_HTTP_VERSION_2_0 | HTTP/2 kullanmayı dene |
| CURL_HTTP_VERSION_2TLS | Yalnızca HTTPS bağlantılarında HTTP/2 kullanmayı dene, aksi takdirde HTTP/1.1 yap |
| CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE | 1.1'den "yükseltme" yapmadan doğrudan HTTP/2 kullan. Bu sunucunun bununla uyumlu olduğunu bilmenizi gerektirir. |
| CURL_HTTP_VERSION_3 | HTTP/3 dene, eski sürüme geri dönüşe izin ver. |
| CURL_HTTP_VERSION_3ONLY | HTTP/3 kullan veya mümkün değilse başarısız ol |
Sürüm 2 zorunlu değildir
libcurl'den HTTP/2 kullanmasını istediğinizde, bu bir istektir, bir gereklilik değildir. libcurl daha sonra sunucunun HTTP/1.1 veya HTTP/2 kullanmayı seçmesine izin verir ve sonuçta hangi protokolün kullanılacağına karar veren budur.
Sürüm 3 zorunlu olabilir
libcurl'den CURL_HTTP_VERSION_3 seçeneğiyle HTTP/3 kullanmasını istediğinizde, libcurl'ün paralel olarak ancak biraz gecikmeli ikinci bir bağlantı girişimi yapmasını sağlar, böylece HTTP/3 bağlantısı başarısız olursa, yine de eski bir HTTP sürümünü kullanmayı deneyebilir.
CURL_HTTP_VERSION_3ONLY kullanmak, geri dönüş mekanizmasının kullanılmadığı ve başarısız bir QUIC bağlantısının transferi tamamen başarısız kıldığı anlamına gelir.
Aralıklar (Ranges)
İstemci uzak bir kaynağın yalnızca ilk 200 baytını veya ortasında bir yerde 300 baytını isterse ne olur? HTTP protokolü, bir istemcinin yalnızca belirli bir veri aralığını istemesine izin verir. İstemci sunucudan bir başlangıç ofseti ve bir bitiş ofseti ile belirli aralığı ister. Hatta şeyleri birleştirebilir ve aynı istekte yan yana bir dizi parça listeleyerek birkaç aralık isteyebilir. Bir sunucu böyle bir isteği yanıtlamak için birden fazla bağımsız parça geri gönderdiğinde, bunları mime sınır dizeleriyle ayrılmış olarak alırsınız ve bunu buna göre ele almak kullanıcı uygulamasına kalmıştır. curl böyle bir yanıtı daha fazla ayırmaz.
Ancak, bir bayt aralığı yalnızca sunucuya yapılan bir istektir. İsteğe saygı duymak zorunda değildir ve sunucunun içeriği istendiğinde anında otomatik olarak oluşturduğu durumlar gibi birçok durumda, bunu yapmayı reddeder ve bunun yerine yine de tam içeriği yanıtlar.
CURLOPT_RANGE ile libcurl'ün bir aralık istemesini sağlayabilirsiniz. Bir şeyin ilk 200 baytını istiyorsanız:
curl_easy_setopt(curl, CURLOPT_RANGE, "0-199");
Veya 200. indisten başlayan dosyadaki her şeyi:
curl_easy_setopt(curl, CURLOPT_RANGE, "200-");
-
indisten 200 bayt ve 1000. indisten 200 bayt alın:
curl_easy_setopt(curl, CURLOPT_RANGE, "0-199,1000-199");
Kimlik Doğrulama
libcurl çok çeşitli HTTP kimlik doğrulama şemalarını destekler.
Bu kimlik doğrulama yönteminin, günümüzde web'de yaygın olarak kullanılan ve kimlik doğrulamanın bir HTTP POST ile gerçekleştirildiği ve ardından durumun çerezlerde tutulduğu şemadan farklı olduğunu unutmayın. Bunun nasıl yapılacağına dair ayrıntılar için libcurl ile Çerezler bölümüne bakın.
Kullanıcı adı ve şifre
libcurl, verilen bir kullanıcı adı olmadan herhangi bir HTTP kimlik doğrulamasını denemez. Şöyle bir tane ayarlayın:
curl_easy_setopt(curl, CURLOPT_USERNAME, "joe");
ve elbette çoğu kimlik doğrulaması ayrıca ayrı olarak ayarladığınız bir şifre gerektirir:
curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret");
İhtiyacınız olan tek şey budur. Bu, libcurl'ün bu transfer için varsayılan kimlik doğrulama yöntemini açmasını sağlar: HTTP Basic.
Kimlik doğrulama gerekli
Bir istemci, kimliği doğrulanmış bir istek göndermek istediğine kendisi karar vermez. Bu sunucunun gerektirdiği bir şeydir. Sunucunun korunan ve kimlik doğrulama gerektiren bir kaynağı olduğunda, bir 401 HTTP yanıtı ve bir WWW-Authenticate: başlığı ile yanıt verir. Başlık, o kaynak için hangi belirli kimlik doğrulama yöntemlerini kabul ettiğine dair ayrıntıları içerir.
Basic
Basic varsayılan HTTP kimlik doğrulama yöntemidir ve adından da anlaşılacağı gibi gerçekten basittir. Adı ve şifreyi alır, bunları iki nokta üst üste ile ayırır ve tüm şeyi isteğe bir Authorization: HTTP başlığına koymadan önce o dizeyi base64 ile kodlar.
Ad ve şifre yukarıda gösterilen örneklerdeki gibi ayarlanırsa, tam giden başlık şöyle görünür:
Authorization: Basic am9lOnNlY3JldA==
Bu kimlik doğrulama yöntemi, kimlik bilgileri ağ üzerinden düz metin olarak gönderildiğinden HTTP üzerinden tamamen güvensizdir.
libcurl'e belirli bir transfer için Basic yöntemini kullanmasını açıkça şöyle söyleyebilirsiniz:
curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
Digest
Başka bir HTTP kimlik doğrulama yöntemi Digest olarak adlandırılır. Bu yöntemin Basic'e kıyasla sahip olduğu bir avantaj, şifreyi kablo üzerinden düz metin olarak göndermemesidir. Ancak bu, tarayıcılar tarafından nadiren konuşulan ve dolayısıyla sık kullanılmayan bir kimlik doğrulama yöntemidir.
libcurl'e belirli bir transfer için Digest yöntemini kullanmasını açıkça şöyle söyleyebilirsiniz (yine de kullanıcı adı ve şifrenin ayarlanması gerekir):
curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST);
NTLM
Başka bir HTTP kimlik doğrulama yöntemi NTLM olarak adlandırılır.
libcurl'e belirli bir transfer için NTLM yöntemini kullanmasını açıkça şöyle söyleyebilirsiniz (yine de kullanıcı adı ve şifrenin ayarlanması gerekir):
curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_NTLM);
Negotiate
Başka bir HTTP kimlik doğrulama yöntemi Negotiate olarak adlandırılır.
libcurl'e belirli bir transfer için Negotiate yöntemini kullanmasını açıkça şöyle söyleyebilirsiniz (yine de kullanıcı adı ve şifrenin ayarlanması gerekir):
curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_NEGOTIATE);
Bearer
Bir istekte OAuth 2.0 Bearer Erişim Belirteci iletmek için, örneğin CURLOPT_XOAUTH2_BEARER kullanın:
CURL *curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "pop3://example.com/");
curl_easy_setopt(curl, CURLOPT_XOAUTH2_BEARER, "1ab9cb22ba269a7");
ret = curl_easy_perform(curl);
curl_easy_cleanup(curl);
}
Önce dene (Try-first)
Bazı HTTP sunucuları birkaç kimlik doğrulama yönteminden birine izin verir, bazı durumlarda kendinizi bir istemci olarak önceden tek bir belirli yöntemi seçmek istemediğiniz veya seçemediğiniz bir durumda bulursunuz ve yine başka bir alt küme durumda, uygulamanız istenen URL'nin kimlik doğrulama gerektirip gerektirmediğini bile bilmez.
libcurl tüm bu durumları da kapsar.
libcurl'den birden fazla yöntem kullanmasını isteyebilirsiniz ve bunu yaptığınızda, curl'ün önce isteği hiç kimlik doğrulama olmadan denediğini ve ardından geri gelen HTTP yanıtına dayanarak, hem sunucunun hem de uygulamanızın izin verdiği yöntemlerden birini seçtiğini ima edersiniz. Birden fazla yöntem işe yararsa, curl bunları yöntemlerin ne kadar güvenli kabul edildiğine göre bir sırayla seçer ve mevcut yöntemlerin en güvenlisini seçer.
libcurl'e birden fazla yöntemi kabul etmesini söylemek için bunları şöyle bitsel VEYA (OR) ile birleştirin:
curl_easy_setopt(curl, CURLOPT_HTTPAUTH,
CURLAUTH_BASIC | CURLAUTH_DIGEST);
libcurl'ün yalnızca tek bir belirli yönteme izin vermesini istiyorsanız ancak yine de kimlik doğrulama kullanmadan isteği yapıp yapamayacağını kontrol etmek için önce sondalamasını istiyorsanız, bit maskesine CURLAUTH_ONLY ekleyerek bu davranışı zorlayabilirsiniz.
Digest kullanmayı isteyin, ancak digest dışında hiçbir şey kullanmayın ve yalnızca gerçekten gerekli olduğu kanıtlanırsa:
curl_easy_setopt(curl, CURLOPT_HTTPAUTH,
CURLAUTH_DIGEST | CURLAUTH_ONLY);
Çerezler (Cookies)
Varsayılan olarak ve tasarım gereği, libcurl transferleri mümkün olduğunca temel yapar ve özelliklerin kullanılması için etkinleştirilmesi gerekir. Böyle bir özellik HTTP çerezleridir, daha çok sadece düz ve basit çerezler olarak bilinir.
Çerezler, sunucu tarafından (Set-Cookie: başlığı kullanılarak) istemcide saklanmak üzere gönderilen ad/değer çiftleridir ve daha sonra sunucudan geldiğinde çerezle birlikte belirtilen ana bilgisayar ve yol gereksinimleriyle eşleşen isteklerde (Cookie: başlığı kullanılarak) tekrar geri gönderilmesi gerekir. Günümüzün modern web'inde, sitelerin bazen çok sayıda çerez kullandığı bilinmektedir.
Çerez motoru
Belirli bir easy handle için çerez motorunu etkinleştirdiğinizde, bu, gelen çerezleri kaydettiği, bunları easy handle ile ilişkili bellek içi çerez deposunda sakladığı ve daha sonra eşleşen bir HTTP isteği yapılırsa uygun olanları geri gönderdiği anlamına gelir.
Çerez motorunu açmanın iki yolu vardır:
Okuma ile çerez motorunu etkinleştir
libcurl'den CURLOPT_COOKIEFILE seçeneğiyle belirli bir dosya adından easy handle'a çerezleri içe aktarmasını isteyin:
curl_easy_setopt(easy, CURLOPT_COOKIEFILE, "cookies.txt");
Yaygın bir numara, çerez motorunu başlangıçta boş bir çerez deposuyla etkinleştirmek için var olmayan bir dosya adı veya düz "" belirtmektir.
Bu seçenek birden çok kez ayarlanabilir ve ardından verilen dosyaların her biri okunur.
Yazma ile çerez motorunu etkinleştir
Alınan çerezlerin CURLOPT_COOKIEJAR seçeneğiyle bir dosyada saklanmasını isteyin:
curl_easy_setopt(easy, CURLOPT_COOKIEJAR, "cookies.txt");
daha sonra curl_easy_cleanup() ile easy handle kapatıldığında, bilinen tüm çerezler verilen dosyada saklanır. Dosya formatı, tarayıcıların da bir zamanlar kullandığı iyi bilinen Netscape çerez dosyası formatıdır.
Özel çerezleri ayarlama
Çerez deposuna herhangi bir çerez eklemeyen ve hatta çerez motorunu etkinleştirmeyen bir istekte sadece bir dizi belirli çerezi iletmenin daha basit ve daha doğrudan bir yolu, seti CURLOPT_COOKIE ile ayarlamaktır:
curl_easy_setopt(easy, CURLOPT_COOKIE, "name=daniel; present=yes;");
Oraya ayarladığınız dize, HTTP isteğinde gönderilecek ham dizedir ve noktalı virgül ayırıcı dahil olmak üzere tekrarlanan NAME=VALUE; dizileri formatında olmalıdır.
İçe aktar dışa aktar
Çerez bellek içi deposu bir sürü çerez tutabilir ve libcurl, bir uygulamanın bunlarla oynaması için güçlü yollar sunar. Yeni çerezler ayarlayabilir, mevcut bir çerezi değiştirebilir ve mevcut çerezleri çıkarabilirsiniz.
Çerez deposuna bir çerez ekle
Basitçe CURLOPT_COOKIELIST ile yeni bir çerez ileterek çerez deposuna yeni bir çerez ekleyin. Girdi formatı, çerez dosyası formatında tek bir satırdır veya bir Set-Cookie: yanıt başlığı olarak biçimlendirilmiştir ancak çerez dosyası stilini öneririz:
#define SEP "\t" /* Alanları Tab ayırır */
char *my_cookie =
"example.com" /* Ana Bilgisayar Adı */
SEP "FALSE" /* Alt alanları dahil et */
SEP "/" /* Yol */
SEP "FALSE" /* Güvenli */
SEP "0" /* Epoch zaman formatında bitiş süresi. 0 == Oturum */
SEP "foo" /* Ad */
SEP "bar"; /* Değer */
curl_easy_setopt(curl, CURLOPT_COOKIELIST, my_cookie);
Verilen o çerez zaten mevcut bir çerezle eşleşirse (aynı alan adı ve yol vb. ile), eskisinin üzerine yeni içerikle yazar.
Çerez deposundan tüm çerezleri al
Bazen handle'ı kapattığınızda çerez dosyasını yazmak yeterli değildir ve o zaman uygulamanız depodan şu anda bilinen tüm çerezleri şöyle çıkarmayı seçebilir:
struct curl_slist *cookies
curl_easy_getinfo(easy, CURLINFO_COOKIELIST, &cookies);
Bu, çerezlerden oluşan bir bağlantılı listeye bir işaretçi döndürür ve her çerez (yeniden) çerez dosyası formatının tek bir satırı olarak belirtilir. Liste sizin için ayrılmıştır, bu nedenle uygulama bilgiyle işini bitirdiğinde curl_slist_free_all çağırmayı unutmayın.
Çerez deposu komutları
Çerezleri ayarlamak ve çıkarmak yeterli değilse, çerez deposuna daha fazla yolla müdahale edebilirsiniz:
Tüm bellek içi depolamayı şununla silin:
curl_easy_setopt(curl, CURLOPT_COOKIELIST, "ALL");
Bellekten tüm oturum çerezlerini (son kullanma tarihi olmayan çerezler) silin:
curl_easy_setopt(curl, CURLOPT_COOKIELIST, "SESS");
Daha önce CURLOPT_COOKIEJAR ile belirtilen dosya adına tüm çerezlerin yazılmasını zorlayın:
curl_easy_setopt(curl, CURLOPT_COOKIELIST, "FLUSH");
Daha önce CURLOPT_COOKIEFILE ile belirtilen dosya adından çerezlerin yeniden yüklenmesini zorlayın:
curl_easy_setopt(curl, CURLOPT_COOKIELIST, "RELOAD");
Çerez dosyası formatı
Çerez dosyası formatı metin tabanlıdır ve satır başına bir çerez saklar. # ile başlayan satırlar yorum olarak kabul edilir.
Her biri tek bir çerezi belirten her satır, TAB karakterleriyle ayrılmış yedi metin alanından oluşur.
| Alan | Örnek | Anlamı |
|---|---|---|
| 0 | example.com | Alan adı |
| 1 | FALSE | Alt alanları dahil et boolean |
| 2 | /foobar/ | Yol |
| 3 | FALSE | Güvenli bir taşıma üzerinden ayarla |
| 4 | 1462299217 | Bitiş tarihi – 1 Ocak 1970'ten beri saniye, veya 0 |
| 5 | person | Çerezin adı |
| 6 | daniel | Çerezin değeri |
İndirme (Download)
GET yöntemi, bir HTTP URL'si istendiğinde ve belirli başka bir yöntem istenmediğinde libcurl'ün kullandığı varsayılan yöntemdir. Sunucudan belirli bir kaynağı ister—standart HTTP indirme isteği:
easy = curl_easy_init();
curl_easy_setopt(easy, CURLOPT_URL, "http://example.com/");
curl_easy_perform(easy);
Easy handle'da ayarlanan seçenekler yapışkan olduğundan ve değiştirilinceye kadar kaldığından, GET dışında başka bir istek yöntemi istediğiniz ve ardından sonraki bir istek için tekrar GET'e geri dönmek istediğiniz zamanlar olabilir. Bu amaçla CURLOPT_HTTPGET seçeneği vardır:
curl_easy_setopt(easy, CURLOPT_HTTPGET, 1L);
Başlıkları da indir
Bir HTTP transferi ayrıca bir set yanıt başlığı içerir. Yanıt başlıkları, yanıt gövdesi adı verilen asıl yük ile ilişkili meta verilerdir. Tüm indirmeler de bir set başlık alır, ancak libcurl kullanırken bunların indirilmesini (görülmesini) isteyip istemediğinizi seçebilirsiniz.
libcurl'den başlıkları normal gövdenin olduğu aynı akışa iletmesini CURLOPT_HEADER kullanarak isteyebilirsiniz:
easy = curl_easy_init();
curl_easy_setopt(easy, CURLOPT_HEADER, 1L);
curl_easy_setopt(easy, CURLOPT_URL, "http://example.com/");
curl_easy_perform(easy);
Veya yazma ve başlık geri çağırımlarının varsayılan davranışlarına güvenerek başlıkları ayrı bir indirme dosyasında saklamayı seçebilirsiniz:
easy = curl_easy_init();
FILE *file = fopen("headers", "wb");
curl_easy_setopt(easy, CURLOPT_HEADERDATA, file);
curl_easy_setopt(easy, CURLOPT_URL, "http://example.com/");
curl_easy_perform(easy);
fclose(file);
Başlıklara sadece şöyle bir göz atmak istiyorsanız, geliştirme sırasında sadece ayrıntılı (verbose) modu ayarlayarak stderr'e gönderilen hem giden hem de gelen başlıkları gösterdiği için yeterince memnun olabilirsiniz:
curl_easy_setopt(easy, CURLOPT_VERBOSE, 1L);
Yükleme (Upload)
HTTP üzerinden yüklemeler birçok farklı şekilde yapılabilir ve farkları fark etmek önemlidir. POST veya PUT gibi farklı yöntemler kullanabilirler ve POST kullanırken gövde biçimlendirmesi farklılık gösterebilir.
Bu HTTP farklılıklarına ek olarak, libcurl yüklenecek verileri sağlamak için farklı yollar sunar.
HTTP POST
POST genellikle verileri uzak bir web uygulamasına iletmek için kullanılan HTTP yöntemidir. Tarayıcılarda bunu yapmanın yaygın bir yolu, bir HTML formu doldurup gönder'e basmaktır. Bir HTTP isteğinin verileri sunucuya iletmesinin standart yoludur. libcurl ile normalde bu verileri bir işaretçi ve bir uzunluk olarak sağlarsınız:
curl_easy_setopt(easy, CURLOPT_POSTFIELDS, dataptr);
curl_easy_setopt(easy, CURLOPT_POSTFIELDSIZE, (long)datalength);
Veya libcurl'e bunun bir post olduğunu ancak libcurl'ün verileri bunun yerine normal okuma geri çağırımını (read callback) kullanarak almasını tercih ettiğinizi söylersiniz:
curl_easy_setopt(easy, CURLOPT_POST, 1L);
curl_easy_setopt(easy, CURLOPT_READFUNCTION, read_callback);
Bu "normal" POST ayrıca istek başlığını Content-Type: application/x-www-form-urlencoded olarak ayarlar.
HTTP çok parçalı form gönderileri (multipart formposts)
Çok parçalı bir form gönderisi hala aynı HTTP yöntemi POST'u kullanır; fark yalnızca istek gövdesinin biçimlendirmesindedir. Çok parçalı bir form gönderisi, MIME tarzı sınır dizeleriyle ayrılmış bir dizi ayrı "parçadan" oluşur. Ne kadar parça gönderebileceğiniz konusunda bir sınır yoktur.
Böyle her parçanın bir adı, bir başlık seti ve birkaç başka özelliği vardır.
libcurl, böyle bir parça serisi oluşturmak ve bunu sunucuya göndermek için hepsi curl_mime ile ön eklenmiş bir dizi kolaylık işlevi sunar. Çok parçalı bir post oluşturun ve verideki her parça için adı, veriyi ve belki ek meta verileri ayarlayın. Temel bir kurulum şöyle görünebilir:
/* Formu oluştur */
form = curl_mime_init(curl);
/* Dosya yükleme alanını doldur */
field = curl_mime_addpart(form);
curl_mime_name(field, "sendfile");
curl_mime_filedata(field, "photo.jpg");
Sonra o postu libcurl'e şöyle iletirsiniz:
curl_easy_setopt(easy, CURLOPT_MIMEPOST, form);
(curl_formadd, çok parçalı form gönderileri oluşturmak için eski API'dir ancak artık onu kullanmanızı önermiyoruz)
HTTP PUT
libcurl ile bir PUT, verileri okuma geri çağırımını kullanarak ilettiğinizi varsayar, çünkü libcurl'ün kullandığı ve sağladığı tipik "dosya yükleme" deseni budur. Geri çağırımı ayarlarsınız, PUT istersiniz (CURLOPT_UPLOAD isteyerek), yüklemenin boyutunu ayarlarsınız ve URL'yi hedefe ayarlarsınız:
curl_easy_setopt(easy, CURLOPT_UPLOAD, 1L);
curl_easy_setopt(easy, CURLOPT_INFILESIZE_LARGE, (curl_off_t) size);
curl_easy_setopt(easy, CURLOPT_READFUNCTION, read_callback);
curl_easy_setopt(easy, CURLOPT_URL, "https://example.com/handle/put");
Transfer başlamadan önce yüklemenin boyutunu bir nedenden dolayı bilmiyorsanız ve HTTP 1.1 kullanıyorsanız, CURLOPT_HTTPHEADER ile bir Transfer-Encoding: chunked başlığı ekleyebilirsiniz. HTTP 1.0 için boyutu önceden sağlamanız gerekir ve HTTP 2 ve sonrası için ne boyuta ne de ekstra başlığa gerek yoktur.
Expect: başlıkları
HTTP 1.1 kullanarak HTTP yüklemeleri yaparken, libcurl bazı durumlarda bir Expect: 100-continue başlığı ekler. Bu başlık, sunucuya transferi erken reddetme ve istemcinin sunucu reddetme şansı bulmadan önce boşuna çok fazla veri göndermek zorunda kalmasını önleme yolu sunar.
Başlık, HTTP yüklemesi CURLOPT_UPLOAD ile yapılırsa veya gövde boyutu bilinmeyen veya 1024 bayttan büyük olduğu bilinen bir HTTP POST yapması istenirse libcurl tarafından eklenir.
libcurl kullanan bir istemci, CURLOPT_HTTPHEADER seçeneğiyle Expect: başlığının kullanımını açıkça devre dışı bırakabilir.
Bu başlık HTTP/2 veya HTTP/3 ile kullanılmaz.
Yüklemeler aynı zamanda indirmelerdir
HTTP, verileri ona yüklediğinizde bile içeriğin geri yanıtlanabildiği bir protokoldür - karar vermek sunucuya kalmıştır. Yanıt verileri, yükleme tamamlanmadan önce bile istemciye geri gönderilmeye başlayabilir.
Çoğullama (Multiplexing)
HTTP sürüm 2 ve 3, "çoğullama" (multiplexing) sunar. Bu protokol özelliğini kullanarak, bir HTTP istemcisi aynı tek bir bağlantı üzerinden bir sunucuya birkaç eşzamanlı transfer yapabilir. Bu özellik, HTTP protokolünün önceki sürümlerinde mevcut değildir. Daha önceki HTTP sürümlerinde, istemcinin ya birden çok bağlantı oluşturması ya da transferleri seri bir şekilde, biri diğerinden sonra yapması gerekirdi.
libcurl, hem HTTP/2 hem de HTTP/3 için HTTP çoğullamayı destekler.
HTTP çoğullamayı destekleyen bir sunucuya multi arayüzünü kullanarak birden çok transfer yaptığınızdan emin olun. libcurl, yalnızca sonraki transferler için aynı ana bilgisayar adı kullanıldığında transferleri çoğullayabilir.
Tüm pratik amaçlar ve API davranışları için, bir uygulamanın çoğullamanın yapılıp yapılmadığını umursaması gerekmez.
libcurl varsayılan olarak çoğullamayı etkinleştirir, ancak aynı anda birden çok transfer başlatırsanız kısa vadeli hıza öncelik verirler, bu nedenle çoğullamak için başka bir transfer tarafından bir bağlantının oluşturulmasını beklemek yerine yeni bağlantılar açabilirler. libcurl'e çoğullamaya öncelik vermesini söylemek için, curl_easy_setopt() ile transfer için CURLOPT_PIPEWAIT seçeneğini ayarlayın.
curl_multi_setopt()'un CURLMOPT_PIPELINING seçeneğiyle, belirli bir multi handle için çoğullamayı devre dışı bırakabilirsiniz.
HSTS
HSTS, HTTP Strict-Transport-Security'nin kısaltmasıdır. Bir sunucunun bir istemciye, istemcinin gelecekte belirli bir süre boyunca o siteyle HTTPS kullanmayı tercih etmesi gerektiğini söylemesi için tanımlanmış bir yoldur.
HSTS'yi libcurl ile şöyle kullanırsınız.
Bellek içi önbellek
libcurl, HSTS ana bilgisayarları için birincil olarak bir bellek içi önbelleğe (cache) sahiptir, böylece önbellekte bulunan bir ana bilgisayar adına yapılan sonraki salt HTTP istekleri dahili olarak HTTPS sürümüne "yönlendirilir". Bu özelliğin etkinleştirildiğini varsayarsak.
Bir handle için HSTS'yi etkinleştir
HSTS, curl_easy_setopt() ile CURLOPT_HSTS_CTRL seçeneği kullanılarak doğru bit maskesi ayarlanarak etkinleştirilir. Bit maskesinde kullanılabilecek iki ayrı bayrak vardır ancak CURLHSTS_ENABLE birincil olanıdır. Bu ayarlanırsa, bu easy handle artık HSTS desteğine sahip olur.
Bu seçenek için mevcut olan ikinci bayrak CURLHSTS_READONLYFILE'dır; bu ayarlanırsa, libcurl'e HSTS önbelleği olarak kullanması için belirttiğiniz dosya adının yalnızca okunacağını ve hiçbir şeyin geri yazılmayacağını söyler.
Bir HSTS önbellek dosyası ayarla
HSTS önbelleğini diskte kalıcı hale getirmek istiyorsanız, CURLOPT_HSTS seçeneğiyle bir dosya adı ayarlayın. libcurl bir transferin başlangıcında bu dosyadan okur ve easy handle kapatıldığında (salt okunur ayarlanmadıkça) ona yazar.
alt-svc
Alternatif Hizmetler (Alternative Services), diğer adıyla alt-svc, bir sunucunun istemciye Alt-Svc: yanıt başlığını kullanarak başka bir yerde o sunucu için bir veya daha fazla alternatif olduğunu söylemesini sağlayan bir HTTP başlığıdır.
Sunucunun önerdiği alternatifler, aynı ana bilgisayarda başka bir portta çalışan bir sunucuyu, tamamen farklı başka bir ana bilgisayar adını içerebilir ve ayrıca hizmeti başka bir protokol üzerinden sunabilir.
Etkinleştir
libcurl'ün sunucular tarafından sunulan alternatifleri dikkate almasını sağlamak için önce bunu handle'da etkinleştirmeniz gerekir. Bunu CURLOPT_ALTSVC_CTRL seçeneğine doğru bit maskesini ayarlayarak yaparsınız. Bit maskesi, uygulamanın hangi HTTP sürümlerine izin verileceğini ve diskteki önbellek dosyasının yalnızca okumak için kullanılıp kullanılmayacağını (yazmak için değil) sınırlamasına izin verir.
alt-svc'yi etkinleştirin ve HTTP/1 veya HTTP/2'ye geçmesine izin verin:
curl_easy_setopt(curl, CURLOPT_ALTSVC_CTRL, CURLALTSVC_H1|CURLALTSVC_H2);
libcurl'e şöyle belirli bir alt-svc önbellek dosyası kullanmasını söyleyin:
curl_easy_setopt(curl, CURLOPT_ALTSVC, "altsvc-cache.txt");
libcurl, alternatiflerin listesini bellek tabanlı bir önbellekte tutar ancak başlangıçta mevcut tüm alternatif hizmet girişlerini alt-svc dosyasından yükler ve sonraki HTTP isteklerini yaparken bunları dikkate alır. Sunucular yeni veya güncellenmiş Alt-Svc: başlıklarıyla yanıt verirse, libcurl çıkışta bunları önbellek dosyasına saklar (CURLALTSVC_READONLYFILE biti ayarlanmadıkça).
alt-svc önbelleği
alt-svc önbelleği bir çerez kavanozuna (cookie jar) benzer. Satır başına bir alternatif saklayan metin tabanlı bir dosyadır ve her girişte o belirli alternatifin ne kadar süre geçerli olduğuna dair bir bitiş süresi de vardır.
Yalnızca HTTPS
Alt-Svc:, yalnızca HTTPS üzerinden bağlanıldığında sunuculardan güvenilir kabul edilir ve ayrıştırılır.
HTTP/3
Alt-Svc: başlıklarının kullanımı, Mart 2022 itibarıyla bir istemci ve sunucuyu HTTP/3 kullanmaya başlatmanın hala tek tanımlanmış yoludur. Sunucu daha sonra istemciye HTTP/1 veya HTTP/2 üzerinden kendisinin HTTP/3 üzerinden de kullanılabilir olduğunu ima eder ve ardından alt-svc önbelleği öyle diyorsa curl sonraki istekte HTTP/3 kullanarak ona bağlanabilir.
libcurl yardımcıları (helpers)
Transfer yapmak iyidir ancak etkili transferler yapmak için uygulamaların genellikle bazı ekstra API'lere ve süper güçlere ihtiyacı vardır.
Handle'lar arasında veri paylaşımı
Bazen uygulamaların transferler arasında veri paylaşması gerekir. Aynı multi handle'a eklenen tüm easy handle'lar, o aynı multi handle'daki handle'lar arasında otomatik olarak birçok paylaşım yapar, ancak bazen istediğiniz tam olarak bu olmayabilir.
Multi handle
Aynı multi handle'a eklenen tüm easy handle'lar bağlantı önbelleğini (connection cache) ve dns önbelleğini (dns cache) otomatik olarak paylaşır.
Easy handle'lar arasında paylaşım
libcurl, uygulamanın herhangi bir sayıda easy handle tarafından paylaşılabilecek verileri tutan bir "paylaşım nesnesi" (share object) oluşturduğu genel bir "paylaşım arayüzüne" (sharing interface) sahiptir. Veriler daha sonra onu paylaşan handle'ların içinde tutulmak yerine paylaşılan nesneden saklanır ve okunur.
CURLSH *share = curl_share_init();
Paylaşılan nesne, çerezlerin, bağlantı önbelleğinin, dns önbelleğinin ve SSL oturum kimliği önbelleğinin tümünü veya herhangi birini paylaşacak şekilde ayarlanabilir.
Örneğin, paylaşımı çerezleri ve dns önbelleğini tutacak şekilde ayarlamak:
curl_share_setopt(share, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE);
curl_share_setopt(share, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);
Daha sonra ilgili transferi bu paylaşım nesnesini kullanacak şekilde ayarlarsınız:
curl_easy_setopt(curl, CURLOPT_SHARE, share);
Bu curl handle'ı ile yapılan transferler, çerez ve dns bilgilerini share handle'ında kullanır ve saklar. Birkaç easy handle'ı aynı paylaşım nesnesini paylaşacak şekilde ayarlayabilirsiniz.
Ne paylaşılmalı
CURL_LOCK_DATA_COOKIE - çerez kavanozunu paylaşmak için bu biti ayarlayın. Çerezleri kullanmaya başlamak için her easy handle'ın yine de çerez "motorunu" düzgün bir şekilde başlatması gerektiğini unutmayın. Bu seçeneğin birden çok eşzamanlı iş parçacığıyla kullanılması desteklenmez.
CURL_LOCK_DATA_DNS - DNS önbelleği, libcurl'ün sonraki aramaları daha hızlı hale getirmek için çözümlenmiş ana bilgisayar adları için adresleri bir süreliğine sakladığı yerdir.
CURL_LOCK_DATA_SSL_SESSION - SSL oturum kimliği önbelleği, libcurl'ün bir önceki bağlantıyı daha hızlı sürdürebilmek için SSL bağlantıları için sürdürme bilgilerini sakladığı yerdir.
CURL_LOCK_DATA_CONNECT - ayarlandığında, bu handle paylaşılan bir bağlantı önbelleği kullanır ve bu nedenle yeniden kullanılacak mevcut bağlantıları bulma olasılığı daha yüksektir vb., bu da aynı ana bilgisayara seri bir şekilde birden çok transfer yaparken daha hızlı performansla sonuçlanabilir. Bu seçeneğin birden çok eşzamanlı iş parçacığıyla kullanılması desteklenmez.
CURL_LOCK_DATA_PSL - bu bit, handle'lar arasında Genel Sonek Listesini (Public Suffix List) paylaşır. Üst düzey İnternet alan adları olarak da bilinen genel soneklerin listesi, çerezlerin güvenliğini yönetmeye yardımcı olmak için kullanılır. Listeyi paylaşmak, listenin birden çok kopyasını işlemek zorunda kalmanın getirdiği ek yükü önler.
CURL_LOCK_DATA_HSTS - bu bit, bellek içi HSTS (HTTP Strict Transport Security) önbelleğini paylaşır. HSTS, web siteleri tarafından HTTP isteklerine bunun yerine HTTPS kullanılarak güvenli bir şekilde erişilmesi gerektiğini belirtmek için kullanılır. Bu seçeneğin birden çok eşzamanlı iş parçacığıyla kullanılması desteklenmez.
Kilitleme (Locking)
Paylaşım nesnesinin çok iş parçacıklı bir ortamda transferler tarafından paylaşılmasını istiyorsanız. Belki de birçok çekirdeğe sahip bir CPU'nuz var ve her çekirdeğin kendi iş parçacığını çalıştırmasını ve veri aktarmasını istiyorsunuz, ancak yine de farklı transferlerin veri paylaşmasını istiyorsunuz. O zaman mutex (karşılıklı dışlama) geri çağırımlarını ayarlamanız gerekir.
İş parçacığı kullanmıyorsanız ve paylaşılan nesneye seri bir şekilde birer birer eriştiğinizi biliyorsanız, herhangi bir kilit ayarlamanıza gerek yoktur. Paylaşım nesnesine aynı anda erişen birden fazla transfer varsa, veri bozulmasını ve hatta muhtemelen çökmeleri önlemek için mutex geri çağırımlarının kurulması gerekir.
libcurl'ün kendisi şeyleri nasıl kilitleyeceğini veya hatta hangi iş parçacığı modelini kullandığınızı bilmediğinden, aynı anda yalnızca bir erişime izin veren mutex kilitleri yaptığınızdan emin olmalısınız. pthreads kullanan bir uygulama için bir kilit geri çağırımı şuna benzer olabilir:
static void lock_cb(CURL *handle, curl_lock_data data,
curl_lock_access access, void *userptr)
{
pthread_mutex_lock(&lock[data]); /* küresel bir kilit dizisi kullanır */
}
curl_share_setopt(share, CURLSHOPT_LOCKFUNC, lock_cb);
Karşılık gelen kilit açma geri çağırımı ile şuna benzer olabilir:
static void unlock_cb(CURL *handle, curl_lock_data data,
void *userptr)
{
pthread_mutex_unlock(&lock[data]); /* küresel bir kilit dizisi
kullanır */
}
curl_share_setopt(share, CURLSHOPT_UNLOCKFUNC, unlock_cb);
Paylaşımı kaldırma (Unshare)
Bir transfer, transferi sırasında paylaşım nesnesini kullanır ve o nesnenin paylaşmak üzere belirtildiği şeyi aynı nesneyi paylaşan diğer handle'larla paylaşır.
Sonraki bir transferde, bir transferin paylaşmaya devam etmesini önlemek için CURLOPT_SHARE, NULL olarak ayarlanabilir. Bu durumda, handle bir sonraki transferi daha önce paylaşılan veriler için boş önbelleklerle başlatabilir.
İki transfer arasında, bir paylaşım nesresi, o nesneyi paylaşan handle'ların bir sonraki sefer farklı bir veri setini paylaşması için farklı bir özellik setini paylaşacak şekilde güncellenebilir. DNS verilerini paylaşmayı kaldırırken curl_share_setopt()'un CURLSHOPT_UNSHARE seçeneğiyle paylaşılan bir nesneden paylaşılacak bir öğeyi şöyle kaldırırsınız:
curl_share_setopt(share, CURLSHOPT_UNSHARE, CURL_LOCK_DATA_DNS);
URL API
libcurl, URL'leri ayrıştırmak, güncellemek ve oluşturmak için bir API sunar. Bunu kullanarak uygulamalar, libcurl'ün URL ayrıştırıcısını kendi amaçları için kullanmanın avantajından yararlanabilir. Aynı ayrıştırıcıyı kullanarak, farklı yorumlamalardan kaynaklanan güvenlik sorunları önlenebilir.
- Dosyaları dahil et
- Oluştur, temizle, çoğalt
- Bir URL'yi ayrıştır
- URL'ye yönlendir
- Bir URL al
- URL parçalarını al
- URL parçalarını ayarla
- Sorguya ekle
CURLOPT_CURLU
Dosyaları dahil et (Include files)
URL API'sini kullanmak istediğinizde kodunuza <curl/curl.h> dahil edersiniz.
#include <curl/curl.h>
CURLU *h = curl_url();
rc = curl_url_set(h, CURLUPART_URL, "ftp://example.com/no/where", 0);
Oluştur, temizle, çoğalt (Create, cleanup, duplicate)
Bu API'yi kullanırken ilk adım, URL bilgilerini ve kaynaklarını tutan bir CURLU * handle (tutaç) oluşturmaktır. Handle, tek bir URL ve tüm farklı bileşenleri hakkında bilgi tutan ilişkili bir veri nesnesine referanstır.
API, her URL bileşenini ayrı ayrı veya tam bir URL olarak ayarlamanıza veya almanıza olanak tanır.
Şöyle bir URL handle oluşturun:
CURLU *h = curl_url();
İşiniz bittiğinde temizleyin:
curl_url_cleanup(h);
Bir handle'ın kopyasına ihtiyacınız olduğunda, sadece çoğaltın:
CURLU *nh = curl_url_dup(h);
Bir URL'yi ayrıştır (Parse a URL)
Handle'da CURLUPART_URL parçasını ayarlayarak tam bir URL'yi ayrıştırırsınız:
CURLU *h = curl_url();
rc = curl_url_set(h, CURLUPART_URL,
"https://example.com:449/foo/bar?name=moo", 0);
Başarılıysa, rc, CURLUE_OK içerir ve farklı URL bileşenleri handle'da tutulur. Bu, URL'nin libcurl açısından geçerli olduğu anlamına gelir.
İşlev çağrısının dördüncü argümanı bir bit maskesidir. Ayrıştırıcının davranışını değiştirmek için bunda hiç, bir veya daha fazla bit ayarlayın:
CURLU_NON_SUPPORT_SCHEME
curl_url_set() işlevinin desteklenmeyen bir şemayı kabul etmesini sağlar. Ayarlanmazsa, kabul edilebilir tek şemalar libcurl'ün bildiği ve yerleşik desteğe sahip olduğu protokoller içindir.
CURLU_URLENCODE
İşlevin, içindeki herhangi bir bayt bundan faydalanacaksa yol parçasını URL olarak kodlamasını sağlar: boşluklar veya "kontrol karakterleri" gibi.
CURLU_DEFAULT_SCHEME
İletilen dize bir şema kullanmıyorsa, varsayılanın amaçlandığını varsayın. Varsayılan şema HTTPS'tir. Bu ayarlanmazsa, şema parçası olmayan bir URL geçerli olarak kabul edilmez. Her ikisi de ayarlanmışsa CURLU_GUESS_SCHEME seçeneğini geçersiz kılar.
CURLU_GUESS_SCHEME
libcurl'ün URL'nin bir şema olmadan ayarlanmasına izin vermesini sağlar ve bunun yerine ana bilgisayar adına dayanarak hangi şemanın amaçlandığını "tahmin eder". En dıştaki alt alan adı DICT, FTP, IMAP, LDAP, POP3 veya SMTP ile eşleşirse o şema kullanılır, aksi takdirde HTTP'yi seçer. Her ikisi de ayarlanmışsa öncelikli olan CURLU_DEFAULT_SCHEME seçeneğiyle çakışır.
CURLU_NO_AUTHORITY
Yetki (authority) kontrollerini atlar. RFC, bireysel şemaların ana bilgisayar parçasını (normalde yetkinin tek zorunlu parçası) atlamasına izin verir, ancak libcurl bunun özel şemalar için izin verilip verilmediğini bilemez. Bayrağı belirtmek, dosya şemasının nasıl işlendiğine benzer şekilde boş yetki bölümlerine izin verir. Gerçekten yalnızca CURLU_NON_SUPPORT_SCHEME ile birlikte kullanılabilir.
CURLU_PATH_AS_IS
libcurl'ün yolun normalleştirilmesini atlamasını sağlar. Bu, curl'ün aksi takdirde nokta-eğik çizgi ve nokta-nokta vb. dizilerini kaldırdığı prosedürdür. Transferler için kullanılan aynı seçenek CURLOPT_PATH_AS_IS olarak adlandırılır.
CURLU_ALLOW_SPACE
URL ayrıştırıcısının mümkün olduğunda boşluğa (ASCII 32) izin vermesini sağlar. URL sözdizimi normalde hiçbir yerde boşluklara izin vermez, ancak bunlar %20 veya + olarak kodlanmalıdır. Boşluklara izin verildiğinde, şemada yine de izin verilmez. Bir URL'de boşluk kullanıldığında ve izin verildiğinde, CURLU_URLENCODE da ayarlanmadıkça olduğu gibi saklanır; bu da libcurl'ün saklamadan önce boşluğu URL olarak kodlamasını sağlar. Bu, curl_url_get() daha sonra tam URL'yi veya bireysel parçaları çıkarmak için kullanıldığında URL'nin nasıl oluşturulduğunu etkiler.
URL'ye yönlendir (Redirect to URL)
Handle zaten ayrıştırılmış bir URL'ye sahip olduğunda, ikinci bir göreli URL ayarlamak onun buna uyum sağlamak için "yönlenmesini" sağlar.
Örnek, önce orijinal URL'yi ayarlayın sonra "yönlendiğimiz" URL'yi ayarlayın:
CURLU *h = curl_url();
rc = curl_url_set(h, CURLUPART_URL,
"https://example.com/foo/bar?name=moo", 0);
rc = curl_url_set(h, CURLUPART_URL, "../test?another", 0);
Bir URL al (Get a URL)
CURLU * handle tek bir URL'yi temsil eder ve curl_url_get ile o tam URL'yi veya bireysel parçalarını kolayca çıkarabilirsiniz:
char *url;
rc = curl_url_get(h, CURLUPART_URL, &url, CURLU_NO_DEFAULT_PORT);
curl_free(url);
Handle, istenen parçayı döndürmek için yeterli bilgiye sahip değilse hata döndürür.
Döndürülen bir dize, işiniz bittiğinde curl_free() ile serbest bırakılmalıdır.
Bayraklar (Flags)
curl_url_get() kullanarak bir URL parçasını alırken, API içeriğin tam olarak nasıl döndürülmesi gerektiğini daha iyi belirtmek için birkaç farklı geçiş sunar. Bunlar, işlevin dördüncü argümanı olan flags bit maskesi parametresinde ayarlanır. Sıfır, bir veya daha fazla bit ayarlayabilirsiniz.
CURLU_DEFAULT_PORT
URL handle'ında saklanan bir port numarası yoksa, bu seçenek curl_url_get() işlevinin kullanılan şema için varsayılan portu döndürmesini sağlar.
CURLU_DEFAULT_SCHEME
Handle'da saklanan bir şema yoksa, bu seçenek curl_url_get() işlevinin hata yerine varsayılan şemayı döndürmesini sağlar.
CURLU_NO_DEFAULT_PORT
curl_url_get() işlevine, port numarası şema için kullanılan varsayılan portla eşleşirse oluşturulan URL'de bir port numarası kullanmamasını talimat verir. Örneğin, 443 numaralı port ayarlanmışsa ve şema https ise, çıkarılan URL port numarasını içermez.
CURLU_URLENCODE
Bu bayrak, tam bir URL alındığında curl_url_get() işlevinin ana bilgisayar adı parçasını URL olarak kodlamasını sağlar. Ayarlanmazsa (varsayılan), libcurl IDN adlarının olduğu gibi görünmesini desteklemek için URL'yi ana bilgisayar adı "ham" olarak döndürür. IDN ana bilgisayar adları tipik olarak aksi takdirde yüzde kodlu olan ASCII dışı baytlar kullanır.
URL kodlaması istenmediğinde bile, % (bayt 37) karakterinin, ana bilgisayar adının geçerli kaldığından emin olmak için ana bilgisayar adlarında URL olarak kodlandığını unutmayın.
CURLU_URLDECODE
curl_url_get() işlevine içeriği döndürmeden önce URL kodunu çözmesini söyler. Şemayı, port numarasını veya tam URL'yi çözmeye çalışır. Sorgu bileşeni de bu bit ayarlandığında bonus olarak artı-boşluk dönüşümü alır. Bu URL kod çözme işleminin karakter seti duyarsız olduğunu ve belirli bir kodlama için amaçlanabilecek verilerle sıfır ile sonlandırılmış bir dize geri aldığınızı unutmayın. Çözülen dizede 32'den düşük herhangi bir bayt değeri varsa, alma işlemi bunun yerine hata döndürür.
CURLU_PUNYCODE
Ayarlanırsa ve CURLU_URLENCODE ayarlanmazsa ve CURLUPART_HOST veya CURLUPART_URL parçalarının alınması istenirse, libcurl herhangi bir ASCII dışı sekizli içeriyorsa (ve bir IDN adıysa) ana bilgisayar adını punycode sürümünde döndürür. libcurl IDN yetenekleri olmadan oluşturulmuşsa, bu bitin kullanılması, ana bilgisayar adı ASCII aralığı dışında herhangi bir şey içeriyorsa curl_url_get() işlevinin CURLUE_LACKS_IDN döndürmesine neden olur.
URL parçalarını al (Get URL parts)
CURLU handle, bir URL'nin bireysel parçalarını saklar ve uygulama bu parçaları istediği zaman handle'dan ayrı ayrı çıkarabilir. Eğer ayarlanmışlarsa.
curl_url_get() işlevinin ikinci argümanı hangi parçanın çıkarılmasını istediğinizi belirtir. Hepsi null ile sonlandırılmış char * verisi olarak çıkarılır, bu nedenle böyle bir değişkene bir işaretçi iletirsiniz.
char *host;
rc = curl_url_get(h, CURLUPART_HOST, &host, 0);
char *scheme;
rc = curl_url_get(h, CURLUPART_SCHEME, &scheme, 0);
char *user;
rc = curl_url_get(h, CURLUPART_USER, &user, 0);
char *password;
rc = curl_url_get(h, CURLUPART_PASSWORD, &password, 0);
char *port;
rc = curl_url_get(h, CURLUPART_PORT, &port, 0);
char *path;
rc = curl_url_get(h, CURLUPART_PATH, &path, 0);
char *query;
rc = curl_url_get(h, CURLUPART_QUERY, &query, 0);
char *fragment;
rc = curl_url_get(h, CURLUPART_FRAGMENT, &fragment, 0);
char *zoneid;
rc = curl_url_get(h, CURLUPART_ZONEID, &zoneid, 0);
Bununla işiniz bittiğinde döndürülen dizeyi curl_free ile serbest bırakmayı unutmayın!
Kullanıcı CURLU_URLDECODE bayrağıyla istemedikçe, çıkarılan parçalar URL kod çözme işlemine tabi tutulmaz.
URL parçaları
Farklı parçalar URL'deki rollerine göre adlandırılır. Şöyle görünen bir URL hayal edin:
http://joe:7Hbz@example.com:8080/images?id=5445#footer
Bu URL curl tarafından ayrıştırıldığında, farklı bileşenleri şöyle saklar:
| metin | parça |
|---|---|
http | CURLUPART_SCHEME |
joe | CURLUPART_USER |
7Hbz | CURLUPART_PASSWORD |
example.com | CURLUPART_HOST |
8080 | CURLUPART_PORT |
/images | CURLUPART_PATH |
id=5445 | CURLUPART_QUERY |
footer | CURLUPART_FRAGMENT |
Zone ID (Bölge Kimliği)
Biraz dışarı çıkabilecek tek şey Zone id'dir. IPv6 sayısal adresleri için kullanılabilen ve yalnızca bu tür adresler için kullanılabilen ek bir niteleyicidir. Şöyle kullanılır, burada eth0 olarak ayarlanmıştır:
http://[2a04:4e42:e00::347%25eth0]/
Bu URL için curl şunları çıkarır:
| metin | parça |
|---|---|
http | CURLUPART_SCHEME |
2a04:4e42:e00::347 | CURLUPART_HOST |
eth0 | CURLUPART_ZONEID |
/ | CURLUPART_PATH |
Başka herhangi bir bileşeni istemek, eksik oldukları için sıfır olmayan bir değer döndürür.
URL parçalarını ayarla (Set URL parts)
API, uygulamanın CURLU handle içinde tutulan bir URL'nin bireysel parçalarını, tam bir URL'yi ayrıştırdıktan sonra veya böyle bir ayrıştırma yerine ayarlamasına olanak tanır.
rc = curl_url_set(urlp, CURLUPART_HOST, "www.example.com", 0);
rc = curl_url_set(urlp, CURLUPART_SCHEME, "https", 0);
rc = curl_url_set(urlp, CURLUPART_USER, "john", 0);
rc = curl_url_set(urlp, CURLUPART_PASSWORD, "doe", 0);
rc = curl_url_set(urlp, CURLUPART_PORT, "443", 0);
rc = curl_url_set(urlp, CURLUPART_PATH, "/index.html", 0);
rc = curl_url_set(urlp, CURLUPART_QUERY, "name=john", 0);
rc = curl_url_set(urlp, CURLUPART_FRAGMENT, "anchor", 0);
rc = curl_url_set(urlp, CURLUPART_ZONEID, "25", 0);
API her zaman üçüncü argümanda null ile sonlandırılmış bir char * dizesi veya alanı temizlemek için NULL bekler. Port numarasının da bu şekilde bir dize olarak sağlandığını unutmayın.
Kullanıcı dördüncü argümanda CURLU_URLENCODE bayrağıyla istemedikçe, ayarlanan parçalar URL kodlamasına tabi tutulmaz.
Parçaları güncelle
Bireysel bir parçayı ayarlayarak, örneğin önce tam bir URL ayarlayabilir, ardından o URL'nin tek bir bileşenini güncelleyebilir ve ardından o URL'nin güncellenmiş sürümünü çıkarabilirsiniz.
Örneğin, şöyle bir URL'miz olduğunu varsayalım
const char *url="http://joe:7Hbz@example.com:8080/images?id=5445#footer";
ve o URL'deki ana bilgisayarı bunun yerine example.net olacak şekilde değiştirmek istiyoruz, bu şöyle yapılabilir:
CURLU *h = curl_url();
rc = curl_url_set(h, CURLUPART_URL, url, 0);
Sonra ana bilgisayar adı parçasını değiştirin:
rc = curl_url_set(h, CURLUPART_HOST, "example.net", 0);
ve bu artık şu URL'yi tutar:
http://joe:7Hbz@example.net:8080/images?id=5445#footer
Daha sonra devam edip yol parçasını /foo olarak şöyle değiştirirseniz:
rc = curl_url_set(h, CURLUPART_PATH, "/foo", 0);
ve URL handle artık şu URL'yi tutar:
http://joe:7Hbz@example.net:8080/foo?id=5445#footer
vb...
Sorguya ekle (Append to the query)
Bir uygulama, CURLU_APPENDQUERY bayrağıyla mevcut sorgu parçasının sağ ucuna bir dize ekleyebilir.
https://example.com/?shoes=2 URL'sini tutan bir handle düşünün. Bir uygulama daha sonra hat=1 dizesini sorgu parçasına şöyle ekleyebilir:
rc = curl_url_set(urlp, CURLUPART_QUERY, "hat=1", CURLU_APPENDQUERY);
Hatta bir ampersand (&) ayırıcısının eksikliğini fark eder ve bir tane de o enjekte eder ve handle'ın tam URL'si o zaman https://example.com/?shoes=2&hat=1 olur.
Eklenen dize elbette eklenirken URL olarak kodlanabilir ve istenirse kodlama = karakterini atlar. Örneğin, candy=M&M dizesini zaten sahip olduğumuz şeye ekleyin ve verideki ampersand ile başa çıkmak için URL olarak kodlayın:
rc = curl_url_set(urlp, CURLUPART_QUERY, "candy=M&M",
CURLU_APPENDQUERY | CURLU_URLENCODE);
Şimdi URL https://example.com/?shoes=2&hat=1&candy=M%26M gibi görünür.
CURLOPT_CURLU
Uygulamalara kolaylık olması açısından, CURLOPT_URL'ye alternatif olarak, çalışması için libcurl'e önceden ayrıştırılmış bir URL iletebilirler.
CURLOPT_CURLU seçeneğiyle bir URL dizesi yerine bir CURLU handle iletirsiniz.
Örnek:
CURLU *h = curl_url();
rc = curl_url_set(h, CURLUPART_URL, "https://example.com/", 0);
CURL *easy = curl_easy_init();
curl_easy_setopt(easy, CURLOPT_CURLU, h);
WebSocket
WebSocket, genel amaçlı çift yönlü bir bayt akışı sunan, HTTP üzerinde yapılan bir transfer protokolüdür. Protokol, salt yükleme ve indirmelerden daha fazlası için oluşturulmuştur ve daha çok HTTP üzerinden TCP gibi bir şeye benzer.
Bir WebSocket istemci uygulaması, WebSocket'e yükseltilen (upgrade) bir HTTP isteğiyle bir bağlantı kurar - ve yükseltildikten sonra, ilgili taraflar tamamlanana ve bağlantı kapanana kadar o bağlantı üzerinden WebSocket konuşurlar.
Destek (Support)
libcurl kurulumunuzun WebSocket'i destekleyip desteklemediğini anlamak için curl_version_info() çağırabilir ve döndürülen yapıdaki ->protocols alanlarını kontrol edebilirsiniz. Mevcut olması için ws ve muhtemelen wss içermelidir.
WebSocket, 8.11.0 sürümünden beri varsayılan olarak desteklenmektedir.
URL'ler (URLs)
Bir istemci, ws veya wss şemasına sahip bir URL kullanarak libcurl ile bir WebSocket iletişimi başlatır. wss://websocket.example.com/traffic-lights örneğindeki gibi.
wss varyantı bir TLS güvenlik bağlantısı kullanmak içindir, ws olan ise güvensiz düz metin üzerinden yapılır.
Kavram (Concept)
Bir libcurl uygulaması, aşağıdaki iki farklı yaklaşımdan birini kullanarak WebSocket yapabilir.
1. Geri çağırım yaklaşımı (The callback approach)
Gelen verileri almak için normal yazma geri çağırımını kullanmaya ve bu verilere geri çağırımın içinde veya dışında curl_ws_send ile yanıt vermeye karar verebilir. Böylece tüm oturumu sunucudan gelen bir indirme biçimi olarak ele alır.
Yazma geri çağırımı içinde, bir uygulama gelen WebSocket verileri hakkında bilgi almak için curl_ws_meta() çağırabilir.
2. Yalnızca bağlantı yaklaşımı (The connect-only approach)
Bunu yapmanın diğer yolu, yazma geri çağırımını kullanmak uygun değilse, CURLOPT_CONNECT_ONLY seçeneğini 2L değerine ayarlamak ve libcurl'ün yalnızca sunucuya bağlantıyı kuran, WebSocket yükseltmesini yapan ve ardından tamamlanmış sayılan bir transfer yapmasına izin vermektir. O yalnızca bağlantı transferinden sonra, uygulama bağlantı üzerinden WebSocket verilerini almak ve göndermek için curl_ws_recv() ve curl_ws_send() kullanabilir.
Yükselt ya da öl (Upgrade or die)
Bir ws:// veya wss:// URL'si ile transfer yapmak, libcurl'ün WebSocket protokolüne başarılı bir yükseltme yaptığı veya bir hata döndürüldüğü anlamına gelir. Örneğin normal bir HTTP transferinde iyi kabul edilen bir HTTP 200 yanıt kodu, bu nedenle bir WebSocket transferi istendiğinde bir hata olarak kabul edilir.
Otomatik PONG
Ham mod kullanılmıyorsa, libcurl gelen PING çerçeveleri için uygun PONG yanıtıyla otomatik olarak yanıt verir ve bunları API'de göstermez.
Seçenekler (Options)
Uygulamanın bir WebSocket iletişimini kontrol etmesi için özel bir setopt seçeneği vardır: CURLOPT_WS_OPTIONS.
Bu seçenek libcurl'e bir bayrak bit maskesi ayarlar, ancak şu anda kullanılan sadece tek bir bit vardır.
Ham mod (Raw mode)
Bit maskesinde CURLWS_RAW_MODE bitini ayarlayarak, libcurl tüm WebSocket trafiğini WebSocket trafiğini kendisi ayrıştırmak yerine ham olarak yazma geri çağırımına iletir. Bu ham mod, WebSocket işlemeyi zaten uygulamış olabilecek ve transfer için sadece libcurl kullanmaya geçip kendi WebSocket mantığını sürdürmek isteyen uygulamalar için tasarlanmıştır.
Ham modda, libcurl ayrıca herhangi bir PING trafiğini otomatik olarak işleme almaz.
Oku (Read)
Bir uygulama, gelen WebSocket trafiğini şu iki yöntemden birini kullanarak alır ve okur:
Yazma geri çağırımı (Write callback)
CURLOPT_CONNECT_ONLY seçeneği ayarlanmadığında, WebSocket verileri yazma geri çağırımına iletilir.
Varsayılan çerçeve modunda (ham modun aksine), libcurl veriler geldikçe WebSocket parçalarının bölümlerini geri çağırıma iletir. Uygulama daha sonra geri çağırıma iletilen belirli çerçeve hakkında bilgi almak için curl_ws_meta() çağırabilir.
libcurl, kablo üzerinden ne zaman ne geldiğine bağlı olarak tam parçaları veya kısmi olanları iletebilir. Her WebSocket parçası 63 bit boyutunda olabilir.
curl_ws_recv
Yalnızca bağlantı seçeneği ayarlandıysa, transfer uzak ana bilgisayara WebSocket kurulduktan sonra sona erer ve o noktadan sonra uygulamanın WebSocket verilerini okumak için curl_ws_recv() ve göndermek için curl_ws_send() çağırması gerekir.
curl_ws_recv işlevi şu prototipe sahiptir:
CURLcode curl_ws_recv(CURL *curl, void *buffer, size_t buflen,
size_t *recv, struct curl_ws_frame **meta);
curl - transferin handle'ı
buffer - WebSocket verilerini almak için bir tampona işaretçi
buflen - buffer'ın bayt cinsinden boyutu
recv - dönüşte buffer'da saklanan verilerin bayt cinsinden boyutu
meta - alınan çerçeve hakkında bilgi içeren bir yapıya bir işaretçi alır.
Meta
curl_ws_recv() ve curl_ws_meta() işlevlerinin ikisi de, gelen WebSocket verileri hakkında bilgi sağlayan bir curl_ws_frame yapısına bir işaretçi döndürür. Bu durumda bir WebSocket "çerçevesi", bir WebSocket parçasının bir bölümüdür. Bütün bir parça olabilir, ancak yalnızca bir parçası da olabilir. curl_ws_frame, size ayrıntıları anlatmak için çerçeve hakkında bilgi içerir.
struct curl_ws_frame {
int age; /* sıfır */
int flags; /* CURLWS_* tanımlarına bakın */
curl_off_t offset; /* bu verinin çerçeve içindeki ofseti */
curl_off_t bytesleft; /* yükün kalan bekleyen bayt sayısı */
};
age
Bu sadece bu yapının yaşını tanımlayan bir sayıdır. Şimdi her zaman 0'dır, ancak gelecekte artabilir ve o zaman yapı büyüyebilir.
flags
flags alanı, veri ayrıntılarını tanımlayan bir bit maskesidir.
CURLWS_TEXT
Tampon metin verisi içerir. Bunun WebSocket için bir fark yarattığını ancak libcurl'ün içeriğin herhangi bir doğrulamasını yapmadığını veya gerçekte geçerli UTF-8 içeriği aldığınıza dair önlemler almadığını unutmayın.
CURLWS_BINARY
Bu ikili veridir.
CURLWS_FINAL
Bu mesajın son parçasıdır, bu ayarlanmamışsa, aynı mesajın bir parçası olarak başka bir parçanın geldiği anlamına gelir.
CURLWS_CLOSE
Bu transfer artık kapatıldı.
CURLWS_PING
Bu, bir pong yanıtı bekleyen gelen bir ping mesajıdır.
offset
İletilen veriler yalnızca daha büyük bir parçanın bir bölümü olduğunda, bu, bu parçanın ait olduğu daha büyük parça içindeki bayt sayısı cinsinden ofseti tanımlar.
bytesleft
Bu çerçeveden sonra, bu parçayı tamamlamak için kalan bekleyen yük baytlarının sayısı.
Bir WebSocket parçasının maksimum boyutu 63 bittir.
Yaz (Write)
Bir uygulama WebSocket verilerini iki farklı şekilde alabilir, ancak verileri bağlantı üzerinden göndermesi için tek bir yol vardır: curl_ws_send() işlevi.
curl_ws_send()
CURLcode curl_ws_send(CURL *curl, const void *buffer, size_t buflen,
size_t *sent, curl_off_t fragsize,
unsigned int sendflags);
curl - transfer handle'ı
buffer - gönderilecek çerçeve verilerine işaretçi
buflen - buffer içindeki verilerin (bayt cinsinden) uzunluğu
fragsize - daha büyük bir parçanın yalnızca bir kısmı gönderilirken kullanılan tüm parçanın toplam boyutu.
sent - gönderilen bayt sayısı
flags - verileri tanımlayan bit maskesi. Aşağıdaki bit açıklamalarına bakın.
Tam parça vs kısmi (Full fragment vs partial)
Tam bir WebSocket parçası göndermek için fragsize'ı sıfıra ayarlayın ve diğer tüm argümanlar için veri sağlayın.
Bir parçayı daha küçük parçalar halinde göndermek için: ilk kısmı fragsize toplam parça boyutuna ayarlanmış olarak gönderin. Göndermeden önce tüm parçanın boyutunu bilmeniz ve sağlamanız gerekir. Sonraki curl_ws_send() çağrılarında, parçanın sonraki parçalarını fragsize sıfır olarak ayarlanmış ancak flags argümanında CURLWS_OFFSET biti ayarlanmış olarak gönderirsiniz. Bütün parçayı oluşturan tüm parçalar gönderilene kadar tekrarlayın.
Bayraklar (Flags)
CURLWS_TEXT
Tampon metin verisi içerir. Bunun WebSocket için bir fark yarattığını ancak libcurl'ün içeriğin herhangi bir doğrulamasını yapmadığını veya gerçekte geçerli UTF-8 içeriği gönderdiğinize dair herhangi bir önlem almadığını unutmayın.
CURLWS_BINARY
Bu ikili veridir.
CURLWS_CONT
Bu mesajın son parçası değildir, bu da aynı mesajın bir parçası olarak bu bitin ayarlanmadığı başka bir parçanın geldiği anlamına gelir.
CURLWS_CLOSE
Bu transferi kapatın.
CURLWS_PING
Bu bir ping olarak.
CURLWS_PONG
Bu bir pong olarak.
CURLWS_OFFSET
Sağlanan veriler yalnızca kısmi bir parçadır ve sonraki bir curl_ws_send() çağrısında daha fazla veri gelmektedir. Bir parçanın yalnızca bir kısmını bu şekilde gönderirken, fragsize ilk çağrıda toplam beklenen çerçeve boyutuyla sağlanmalı ve sonraki çağrılarda sıfır olmalıdır.
CURLWS_OFFSET ayarlandığında, bu önceki bir gönderimin devamı olduğundan ve parçaları tanımlayan bitler o zaman ayarlandığından başka hiçbir bayrak biti ayarlanmamalıdır.
Başlıklar (Headers) API
libcurl, alınan tüm HTTP başlıkları üzerinde yineleme yapmak ve belirli olanlardan içerik çıkarmak için bir API sunar.
Başlık içeriğini döndürürken libcurl, baştaki ve sondaki boşlukları kırpar ancak içeriği başka hiçbir şekilde değiştirmez veya modifiye etmez.
Bu API resmi hale getirildi ve libcurl 7.84.0'dan itibaren gerçek anlamda sağlandı.
Başlık kökenleri (Header origins)
HTTP başlıkları, bir transfer sırasında sunucudan birkaç farklı kökenden gönderilen anahtar değer çiftleridir. libcurl tüm başlıkları toplar ve uygulamalar için bunlara kolay erişim sağlar.
HTTP başlıkları şu şekillerde gelebilir:
- CURLH_HEADER - normal yanıt içeriğinden önce.
- CURLH_TRAILER - yanıt içeriğinden sonra gelen alanlar
- CURLH_CONNECT - asıl sunucu isteğinden önce yapılmış olabilecek proxy
CONNECTisteğindeki yanıt başlıkları - CURLH_1XX - aşağıdaki >= 2xx yanıt kodundan önce gelmiş olabilecek olası 1xx HTTP yanıtlarındaki başlıklar.
- CURLH_PSEUDO - iki nokta üst üste (
:) ile başlayan HTTP/2 ve HTTP/3 seviyesi başlıklar
İstek numarası
libcurl ile yapılan tek bir HTTP transferi bir dizi HTTP isteğinden oluşabilir ve başlık API işlevlerine verilen request argümanı, hangi belirli bireysel istekten başlıkları istediğinizi belirtmenize olanak tanır. 0 ilk istektir ve daha sonra sayı daha sonraki yönlendirmeler için veya çok durumlu kimlik doğrulama kullanıldığında artar. -1 iletmek, kullanılan gerçek istek miktarından bağımsız olarak serideki son isteğe bir kısayoldur.
Başlık katlama (Header folding)
HTTP/1 başlıkları, bir başlıktan sonra bir devam satırı olduğu ve satırı katlanmış hale getirdiği katlama (folding) adı verilen kullanımdan kaldırılmış bir formatı destekler.
Başlıklar API'si katlanmış başlıkları destekler ve bu tür içerikleri katlanmamış olarak döndürür - burada farklı parçalar tek bir boşluk karakteriyle ayrılır.
Ne zaman
İki başlık API işlevi çağrısını, bir transfer sırasında herhangi bir zamanda, hem geri çağırımların içinden hem de dışından çağırmak tamamen mümkündür. Ancak, API'nin yalnızca çağrıldığı andaki başlıkların durumu hakkında bilgi döndürdüğünü, transfer hala devam ederken çağırırsanız bunun nihai durum olmayabileceğini unutmamak önemlidir.
Başlık yapısı (Header struct)
Başlık API işlevlerinin döndürdüğü başlık yapısı işaretçisi, easy handle ile ilişkili belleğe işaret eder ve işlevlere yapılan sonraki çağrılar bu yapıyı bozar. Uygulamaların verileri saklamak istiyorlarsa kopyalamaları gerekir. Yapı için kullanılan bellek curl_easy_cleanup() çağrıldığında serbest bırakılır.
Yapı
struct curl_header {
char *name;
char *value;
size_t amount;
size_t index;
unsigned int origin;
void *anchor;
};
name, başlığın adıdır. Bu ada sahip başlığın ilk örneği için kullanılan büyük/küçük harf kullanımını kullanır.
value, içeriktir. Ağ üzerinden tam olarak iletildiği gibi gelir ancak baştaki ve sondaki boşluklar ve yeni satırlar çıkarılır. Veriler her zaman null ile sonlandırılır.
amount, istenen köken ve istek bağlamında mevcut olan bu adı kullanan başlıkların sayısıdır.
index, bu belirli başlık adının sıfır tabanlı giriş numarasıdır; bu başlık istenen kapsamda birden fazla kez kullanıldıysa 0'dan büyük olabilir ancak her zaman amount değerinden küçüktür.
origin, (tam olarak) bir köken bitine sahiptir ve başlığın nereden kaynaklandığını belirtir.
anchor, libcurl dahili parametreleri tarafından kullanılan özel bir handle'dır. Değiştirmeyin. Hakkında hiçbir şey varsaymayın.
Bir başlık al (Get a header)
CURLHcode curl_easy_header(CURL *easy,
const char *name,
size_t index,
unsigned int origin,
int request,
struct curl_header **hout);
Bu işlev, belirli bir ada (name) sahip bir alan hakkında bilgi döndürür ve işlevden bunu bir veya daha fazla kökende (origins) aramasını istersiniz.
index argümanı, birden fazla mevcut olduğunda bir başlığın n'inci oluşumunu sormak istediğiniz zamandır. index'i 0 olarak ayarlamak ilk örneği döndürür - çoğu durumda tek olan budur.
request argümanı libcurl'e hangi istekten başlıkları istediğinizi söyler.
Bir uygulamanın son argümanda bir struct curl_header * işaretçisine bir işaretçi iletmesi gerekir, çünkü bir hata döndürülmediğinde oraya bir işaretçi döndürülür. Başarılı bir çağrının out sonucuyla ilgili ayrıntılar için Başlık yapısı bölümüne bakın.
Verilen ad, verilen kökende alınan herhangi bir başlıkla eşleşmezse, işlev CURLHE_MISSING döndürür veya henüz hiçbir başlık alınmadıysa CURLHE_NOHEADERS döndürür.
Başlıklar üzerinde yineleme (Iterate over headers)
struct curl_header *curl_easy_nextheader(CURL *easy,
unsigned int origin,
int request,
struct curl_header *previous);
Bu işlev uygulamanın, request içinde gelen verilen origins içindeki mevcut tüm başlıklar üzerinde yineleme yapmasını sağlar.
request argümanı libcurl'e hangi istekten başlıkları istediğinizi söyler.
previous NULL olarak ayarlanırsa, bu işlev ilk başlığa bir işaretçi döndürür. Uygulama daha sonra bu işaretçiyi, aynı origin ve request bağlamındaki mevcut tüm başlıklar üzerinde yineleme yapmak için bir sonraki çağrıya bir argüman olarak kullanabilir.
Bu işlev NULL döndürdüğünde, bağlam içinde daha fazla başlık yoktur.
Bu işlevin işaretçi döndürdüğü curl_header yapısıyla ilgili ayrıntılar için Başlık yapısı bölümüne bakın.
libcurl örnekleri (examples)
libcurl için yerel API C dilindedir, bu nedenle bu bölüm C ile yazılmış örneklere odaklanmaktadır. Ancak libcurl için birçok dil bağlaması (bindings) ince olduğundan, genellikle az çok aynı işlevleri sunarlar ve bu nedenle diğer dillerin kullanıcıları için de ilginç ve eğitici olabilirler.
- Basit bir HTTP sayfası al
- Belleğe bir sayfa al
- HTTP üzerinden bir giriş formu gönder
- Bir FTP dizin listesi al
- Bloklamayan HTTP form-post
Basit bir HTTP sayfası al (Get a simple HTTP page)
Bu örnek sadece verilen bir URL'den HTML'i getirir ve stdout'a gönderir. Muhtemelen yazabileceğiniz en basit libcurl programıdır.
URL'yi değiştirerek bu, diğer desteklenen protokoller üzerinden de içerik alabilir.
Çıktının stdout'a gönderilmesi varsayılan bir davranıştır ve genellikle aslında istediğiniz şey değildir. Çoğu uygulama bunun yerine gelen verileri almak için bir yazma geri çağırımı kurar.
#include <stdio.h>
#include <curl/curl.h>
int main(void)
{
CURL *curl;
CURLcode res;
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/");
/* İsteği gerçekleştir, 'res' dönüş kodunu tutar */
res = curl_easy_perform(curl);
/* Hataları kontrol et */
if(res != CURLE_OK)
fprintf(stderr, "curl_easy_perform() failed: %s\n",
curl_easy_strerror(res));
/* her zaman temizle */
curl_easy_cleanup(curl);
}
return 0;
}
Belleğe bir yanıt al (Get a response into memory)
Bu örnek, alınan verileri stdout'a (ki bu genellikle istediğiniz şey değildir) göndermek yerine, gelen veriler büyüdükçe genişletilen bir bellek tamponunda saklayan önceki örneğin bir varyasyonudur.
Bunu, verileri almak için bir yazma geri çağırımı kullanarak başarır.
Bu örnek, ayarlanmış bir URL şemasıyla sabit bir URL dizesi kullanır, ancak elbette bunu başka herhangi bir desteklenen protokolü kullanacak ve bunun yerine ondan bir kaynak alacak şekilde değiştirebilirsiniz.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <curl/curl.h>
struct MemoryStruct {
char *memory;
size_t size;
};
static size_t
mem_cb(void *contents, size_t size, size_t nmemb, void *userp)
{
size_t realsize = size * nmemb;
struct MemoryStruct *mem = (struct MemoryStruct *)userp;
mem->memory = realloc(mem->memory, mem->size + realsize + 1);
if(mem->memory == NULL) {
/* bellek yetersiz */
printf("not enough memory (realloc returned NULL)\n");
return 0;
}
memcpy(&(mem->memory[mem->size]), contents, realsize);
mem->size += realsize;
mem->memory[mem->size] = 0;
return realsize;
}
int main(void)
{
CURL *curl_handle;
CURLcode res;
struct MemoryStruct chunk;
chunk.memory = malloc(1); /* yukarıdaki realloc tarafından
gerektiği gibi büyütülür */
chunk.size = 0; /* bu noktada veri yok */
curl_global_init(CURL_GLOBAL_ALL);
/* curl oturumunu başlat */
curl_handle = curl_easy_init();
/* alınacak URL'yi belirt */
curl_easy_setopt(curl_handle, CURLOPT_URL, "https://www.example.com/");
/* tüm verileri bu işleve gönder */
curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, mem_cb);
/* 'chunk' yapımızı geri çağırım işlevine iletiyoruz */
curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)&chunk);
/* bazı sunucular user-agent alanı olmadan yapılan istekleri sevmez,
bu yüzden bir tane sağlıyoruz */
curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, "libcurl-agent/1.0");
/* al onu! */
res = curl_easy_perform(curl_handle);
/* hataları kontrol et */
if(res != CURLE_OK) {
fprintf(stderr, "curl_easy_perform() failed: %s\n",
curl_easy_strerror(res));
}
else {
/*
* Şimdi, chunk.memory'miz chunk.size bayt büyüklüğünde olan ve
* uzak dosyayı içeren bir bellek bloğuna işaret ediyor.
*
* Onunla güzel bir şey yap
*/
printf("%lu bytes retrieved\n", (long)chunk.size);
}
/* curl şeylerini temizle */
curl_easy_cleanup(curl_handle);
free(chunk.memory);
/* libcurl ile işimiz bitti, temizleyin */
curl_global_cleanup();
return 0;
}
HTTP üzerinden bir giriş formu gönder (Submit a login form over HTTP)
HTTP üzerinden bir giriş gönderimi, genellikle bir POST içinde tam olarak hangi verilerin gönderileceğini ve hangi hedef URL'ye gönderileceğini bulma meselesidir.
Giriş yapıldıktan sonra, uygun çerezler kullanılırsa hedef URL getirilebilir. Birçok giriş sistemi HTTP yönlendirmeleriyle çalıştığından, libcurl'den gelirse bunları takip etmesini isteriz.
Bazı giriş formları bunu daha karmaşık hale getirir ve giriş formunu gösteren sayfadan vb. çerezler almanızı gerektirir, bu nedenle buna ihtiyacınız varsa bu kodu biraz genişletmek isteyebilirsiniz.
Var olmayan bir çerez dosyası ileterek, bu örnek çerez ayrıştırıcısını etkinleştirir, böylece giriş yanıtından gelen yanıt geldiğinde gelen çerezler saklanır ve ardından kaynak için sonraki istek bunları kullanır ve sunucuya aslında doğru bir şekilde giriş yaptığımızı kanıtlar.
#include <stdio.h>
#include <string.h>
#include <curl/curl.h>
int main(void)
{
CURL *curl;
CURLcode res;
static const char *postthis = "user=daniel&password=monkey123";
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/login.cgi");
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postthis);
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); /* yönlendirme */
curl_easy_setopt(curl, CURLOPT_COOKIEFILE, ""); /* dosya yok */
res = curl_easy_perform(curl);
/* Hataları kontrol et */
if(res != CURLE_OK)
fprintf(stderr, "curl_easy_perform() failed: %s\n",
curl_easy_strerror(res));
else {
/*
* Giriş POST'undan sonra yeni çerezleri aldık. Bir GET'e geçin
* ve giriş korumalı URL'yi isteyin.
*/
curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/file");
curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); /* daha fazla
POST yok */
res = curl_easy_perform(curl);
/* Hataları kontrol et */
if(res != CURLE_OK)
fprintf(stderr, "second curl_easy_perform() failed: %s\n",
curl_easy_strerror(res));
}
/* her zaman temizle */
curl_easy_cleanup(curl);
}
return 0;
}
Bir FTP dizin listesi al (Get an FTP directory listing)
Bu örnek sadece verilen URL'den FTP dizin çıktısını getirir ve stdout'a gönderir. URL'deki son eğik çizgi, libcurl'ün onu bir dizin olarak görmesini sağlayan şeydir.
#include <curl/curl.h>
int main(void)
{
CURL *curl;
CURLcode res;
curl_global_init(CURL_GLOBAL_DEFAULT);
curl = curl_easy_init();
if(curl) {
/*
* URL'nin son eğik çizgi ile bitmesini sağlayın
*/
curl_easy_setopt(curl, CURLOPT_URL, "ftp://ftp.example.com/");
res = curl_easy_perform(curl);
/* her zaman temizle */
curl_easy_cleanup(curl);
if(CURLE_OK != res) {
/* başarısız olduk */
fprintf(stderr, "curl told us %d\n", res);
}
}
curl_global_cleanup();
return 0;
}
Bloklamayan HTTP form-post (Non-blocking HTTP form-post)
Bu örnek, multi arayüzünü kullanarak çok parçalı bir form gönderisi (multipart form-post) yapar.
#include <stdio.h>
#include <string.h>
#include <sys/time.h>
#include <curl/curl.h>
int main(void)
{
CURL *curl;
CURLM *multi_handle;
int still_running = 0;
curl_mime *form = NULL;
curl_mimepart *field = NULL;
struct curl_slist *headerlist = NULL;
static const char buf[] = "Expect:";
curl = curl_easy_init();
multi_handle = curl_multi_init();
if(curl && multi_handle) {
/* Formu oluştur */
form = curl_mime_init(curl);
/* Dosya yükleme alanını doldur */
field = curl_mime_addpart(form);
curl_mime_name(field, "sendfile");
curl_mime_filedata(field, "multi-post.c");
/* Dosya adı alanını doldur */
field = curl_mime_addpart(form);
curl_mime_name(field, "filename");
curl_mime_data(field, "multi-post.c", CURL_ZERO_TERMINATED);
/* Nadiren gerekse bile gönder alanını da doldur */
field = curl_mime_addpart(form);
curl_mime_name(field, "submit");
curl_mime_data(field, "send", CURL_ZERO_TERMINATED);
/* özel başlık listesini başlat (Expect: 100-continue
istenmediğini belirterek */
headerlist = curl_slist_append(headerlist, buf);
/* bu POST'u hangi URL alır */
curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/upload.cgi");
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);
curl_easy_setopt(curl, CURLOPT_MIMEPOST, form);
curl_multi_add_handle(multi_handle, curl);
do {
CURLMcode mc = curl_multi_perform(multi_handle, &still_running);
if(still_running)
/* aktivite, zaman aşımı veya "hiçbir şey" bekle */
mc = curl_multi_poll(multi_handle, NULL, 0, 1000, NULL);
if(mc)
break;
} while(still_running);
curl_multi_cleanup(multi_handle);
/* her zaman temizle */
curl_easy_cleanup(curl);
/* sonra formu temizle */
curl_mime_free(form);
/* slist'i serbest bırak */
curl_slist_free_all(headerlist);
}
return 0;
}
libcurl bağlamaları (bindings)
Yaratıcı insanlar çeşitli ortamlar ve programlama dilleri için bağlamalar (bindings) veya arayüzler yazmışlardır. Bunlardan birini kullanmak, favori dilinizden veya sisteminizden curl'ün gücünden yararlanmanıza olanak tanır. Bu, bu yazının yazıldığı an itibarıyla bilinen tüm arayüzlerin bir listesidir.
Aşağıda listelenen bağlamalar curl/libcurl dağıtım arşivlerinin bir parçası değildir. Ayrı olarak indirilmeli ve kurulmalıdırlar.
libcurl iç yapısı (internals)
libcurl asla bitmez ve sadece raftan alınabilecek bir ürün değildir. Neredeyse her gün geliştirilen ve değiştirilen yaşayan bir projedir. Hataları düzeltmek ve özellikler eklemek için yetenekli ve ilgili bilgisayar korsanlarına güveniyoruz.
Bu bölüm, hevesli libcurl bilgisayar korsanlarının libcurl'ün dahili olarak nasıl çalıştığına dair bazı temel kavramları öğrenmelerine ve böylece sorunları nerede arayacaklarını veya kütüphanenin yeni bir şey yapmasını istediğinizde nereye bir şeyler ekleyeceğinizi anlamalarına yardımcı olmak için iç ayrıntıları açıklamayı amaçlamaktadır.
- Easy handle'lar ve bağlantılar
- Her şey multi'dir
- Durum makineleri
- Protokol işleyici
- Arka uçlar
- Önbellekler ve durum
- Zaman aşımları
- Windows vs Unix
- Bellek hata ayıklama
- İçerik Kodlaması
- Yapılar
- Ana bilgisayar adlarını çözümleme
- Testler
Easy handle'lar ve bağlantılar (Easy handles and connections)
Kaynak kodunu okurken bilmek ve akılda tutmakta fayda olan bazı temel bilgiler vardır:
-
'data', üzerinde çalışılan transfer için easy handle'a (
struct Curl_easy) atıfta bulunmak için her yerde kullandığımız değişken adıdır. Bunun için başka bir ad kullanılmamalı ve başka hiçbir şey bu adı kullanmamalıdır. Easy handle, bir transferi tanımlayan ana nesnedir. Bir transfer genellikle bir noktada bir bağlantı kullanır ve genellikle aynı anda yalnızca bir tane kullanır. Bu transfer tarafından şu anda kullanılan bağlantıyı tanımlayan birdata->connişaretçisi vardır. Çoğullanmış (multiplexed) bağlantılar kullanıldığında, tek bir bağlantı zaman içinde ve hatta aynı anda birkaç transfer (ve dolayısıyla easy handle'lar) tarafından kullanılabilir. -
conn, kodun üzerinde çalıştığı mevcut bağlantıya (struct connectdata) atıfta bulunmak için iç yapıların her yerinde kullandığımız değişken adıdır. -
result, işlevlerden dönüş değerlerini tutmak içinCURLcodedeğişkeni için kullandığımız olağan addır ve bu dönüş değeri sıfırdan farklıysa, bu bir hatadır ve işlev temizlenmeli ve dönmelidir (genellikle aynı hata kodunu üst işlevine ileterek).
Her şey multi'dir (Everything is multi)
libcurl, transfer yapmak için birkaç farklı API sunar; burada birincil farklar, senkron easy arayüzüne karşı bloklamayan multi arayüzüdür. Multi arayüzünün kendisi daha sonra olay güdümlü soket arayüzü veya normal perform arayüzü kullanılarak daha fazla kullanılabilir.
Ancak dahili olarak, her şey olay güdümlü arayüz için yazılmıştır. Her şeyin bloklamayan bir tarzda yazılması gerekir, böylece işlevler asla döngüde veya benzeri bir şekilde veri beklemez. O ifade edilen işlevselliğe sahip yüzey işlevleri olmadıkları sürece.
Tek bir transferi senkron olarak gerçekleştiren curl_easy_perform() işlevi, kendi içinde sadece multi arayüzünü dahili olarak kuran ve kullanan bir sarmalayıcı işlevdir.
Durum makineleri (State machines)
Baştan sona bloklamayan davranışı kolaylaştırmak için, curl kaynağı durum makineleriyle doludur. Olabildiğince çok veri üzerinde çalışın ve durum makinesini mevcut olana göre gidebileceği yere sürün ve işlevlerin daha sonra durum makinesini daha da ileri götürebilecek daha fazla veri geldiğinde o noktadan devam etmesine izin verin.
Belirli bir transfer için birçok farklı seviyede bu tür durumlar vardır ve her bir protokol için kodun kendi durum makineleri seti olabilir.
mstate
Birincil durumlardan biri, easy handle'ın tuttuğu ana transfer "modu"dur; bu, mevcut transferin çözümlenip çözümlenmediğini, bir çözümleme bekleyip beklemediğini, bağlanıp bağlanmadığını, bir bağlantı bekleyip beklemediğini, bir istek yayınlayıp yayınlamadığını, bir transfer yapıp yapmadığını vb. söyler (lib/multihandle.h içindeki CURLMstate numaralandırmasına bakın). libcurl ile yapılan her transferin ilişkili bir easy handle'ı vardır ve her easy handle o durum makinesini çalıştırır.
Aşağıdaki resim tüm durumları ve olası durum geçişlerini göstermektedir. Aşağıdaki diğer açıklamalara bakın.

Tüm transferler INIT ile başlar ve MSGSENT ile biter
sarı: ilk kurulum durumları
mavi: isimleri çözümleme ve bağlantıyı kurma
yeşil: transferi başlatma ve kurma
beyaz: transfer
kırmızı: transfer sonrası
Protokol işleyici (Protocol handler)
libcurl çok protokollü bir transfer kütüphanesidir. Kodun çekirdeği, genel olarak transferler için kullanılan ve çoğu protokol için çoğunlukla aynı şekilde çalışan bir dizi genel işlevdir. Örneğin yukarıda açıklanan ana durum makinesi ordadır ve tüm protokoller için çalışır - bazı protokoller tüm transferler için tüm durumları kullanmasa bile.
Ancak, libcurl'ün konuştuğu her farklı protokolün kendine özgü özellikleri ve uzmanlıkları da vardır. Kodun, protokol XYZ ise, o zaman yap... tarzı koşullarla dolu olmaması için, bunun yerine Curl_handler kavramına sahibiz. Desteklenen her protokol bunlardan birini tanımlar ve lib/url.c içinde protocols[] adında bu tür işleyicilere işaretçilerden oluşan bir dizi vardır.
Bir transfer yapılmak üzereyken, libcurl üzerinde işlem yapacağı URL'yi ayrıştırır ve diğer şeylerin yanı sıra hangi protokolü kullanacağını bulur. Normalde bu, URL'nin şema kısmına bakarak yapılabilir. https://example.com için bu https'tir ve imaps://example.com için imaps'tir. Sağlanan şemayı kullanarak libcurl, conn->handler işaretçisini bu URL'yi işleyen protokol için işleyici yapısına ayarlar.

İşleyici yapısı, NULL olabilen veya o protokolün bir transfer için çalışması için gerekli şeyleri yapmak üzere protokole özgü bir işleve işaret edecek şekilde ayarlanabilen bir dizi işlev işaretçisi içerir. Diğer tüm protokollerin ihtiyaç duymadığı şeyler. İşleyici yapısı ayrıca protokolün adını ayarlar ve özellik setini bir bit maskesiyle açıklar.
Bir libcurl transferi, bir dizi farklı eylem etrafında oluşturulur ve işleyici bunların her birini genişletebilir. İşte bu yapıda bazı örnek işlev işaretçileri ve bunların nasıl kullanıldığı:
Bağlantı kurulumu (Setup connection)
Bir bağlantı bir transfer için yeniden kullanılamazsa, URL'de verilen ana bilgisayara bir bağlantı kurması gerekir ve bunu yaptığında, bunun için protokol işleyicisinin işlevini de çağırabilir. Şöyle:
if(conn->handler->setup_connection)
result = conn->handler->setup_connection(data, conn);
Bağlan (Connect)
Bir bağlantı kurulduktan sonra, bu işlev çağrılır
if(conn->handler->connect_it)
result = conn->handler->connect_it(data, &done);
Yap (Do)
Do simply (Yap), URL'nin tanımladığı belirli kaynak için bir istek yayınlayan eylemdir. Tüm protokollerin bir do eylemi vardır, bu nedenle bu işlev sağlanmalıdır:
result = conn->handler->do_it(data, &done);
Bitti (Done)
Bir transfer tamamlandığında, done eylemi gerçekleştirilir:
result = conn->handler->done(data, status, premature);
Bağlantıyı kes (Disconnect)
Bağlantı kesilmek üzeredir.
result = conn->handler->disconnect(data, conn, dead_connection);
Arka uçlar (Backends)
curl'deki bir arka uç, derleme zamanında seçilebilir alternatif bir uygulamadır.
curl'ü derlediğinizde, birkaç farklı şey için alternatif uygulamalar seçebilirsiniz. Aynı özellik setinin farklı sağlayıcıları. curl'ü derlediğinizde hangi arka ucu veya arka uçları (çoğul) kullanacağınızı seçersiniz.
- Arka uçlar seçilebilir ve seçimi kaldırılabilir
- Genellikle platforma bağımlıdır
- Özelliklerde farklılık gösterebilir
-
- taraf lisanslarında farklılık gösterebilir
- Olgunlukta farklılık gösterebilir
- Dahili API'ler asla harici olarak ifşa edilmez
Farklı arka uçlar
libcurl kaynak kodunda, işlevsellik sağlamak için dahili API'ler vardır. Bu farklı alanlarda birden fazla farklı sağlayıcı vardır:
- IDN
- İsim çözümleme
- TLS
- SSH
- HTTP/3
- HTTP içerik kodlaması
Görselleştirilmiş arka uçlar

Uygulamalar (üstteki yeşil bulutta) libcurl'e genel API aracılığıyla erişir. API sabit ve kararlıdır.
Dahili olarak, libcurl'ün çekirdeği, yapması gereken farklı görevleri gerçekleştirmek için dahili API'leri kullanır. Bu dahili API'lerin her biri, çoğu zaman farklı üçüncü taraf kütüphaneler tarafından desteklenen alternatif uygulamalar tarafından desteklenir.
Yukarıdaki resim, farklı dahili API'leri destekleyen farklı üçüncü taraf kütüphaneleri göstermektedir. Mor kutular bir veya daha fazladır ve koyu gri olanlar "bunlardan biri"dir.
HTTP/3 arka uçları

libcurl, bu resimde farklı sütunlar olarak görselleştirilen dört farklı arka uç sunar.
Her satırın belirli bir arka uç derlemesi olduğu bir tablodaki aynı veriler:
| durum | HTTP/3 kütüphanesi | QUIC kütüphanesi | TLS kütüphaneleri (bir tanesi) |
|---|---|---|---|
| önerilen | nghttp3 | ngtcp2 | fork ailesi, GnuTLS veya wolfSSL |
| deneysel | quiche | quiche | BoringSSL veya quictls |
| deneysel | msh3 | msquic | fork ailesi veya Schannel |
| deneysel | nghttp3 | OpenSSL 3.3.0+ | OpenSSL 3.3.0+ |
fork ailesi, BoringSSL, LibreSSL, quictls ve AWS-LC anlamına gelir
Önbellekler ve durum (Caches and state)
libcurl İnternet transferleri için kullanıldığında, sonraki transferleri daha hızlı ve daha iyi yapmak için verileri önbelleklerde ve durum depolamasında saklar.
Önbellekler, hangi libcurl API'sinin kullanıldığına (easy veya multi) bağlı olarak CURL veya CURLM handle'larıyla ilişkili tutulur.
DNS önbelleği (DNS cache)
libcurl bir ana bilgisayar adının IP adreslerini çözümlediğinde sonucu (varsayılan 60 saniyelik bir ömürle) DNS önbelleğinde saklar, böylece sonraki aramalar (potansiyel olarak yavaş) çözümleme işlemini tekrar yapmak yerine önbelleğe alınmış verileri hemen kullanabilir. Bu önbellek yalnızca bellekte bulunur.
bağlantı önbelleği (connection cache)
Bağlantı havuzu olarak da bilinir. Burası, bir transfer tamamlandıktan sonra curl'ün canlı bağlantıları koyduğu yerdir, böylece sonraki bir transfer yeni bir tane kurmak zorunda kalmak yerine zaten mevcut bir bağlantıyı kullanabilir. Bir bağlantı yeniden kullanıldığında, curl ad aramalarından, TLS el sıkışmalarından ve daha fazlasından kaçınır. Bu önbellek yalnızca bellekte bulunur.
TLS oturum-ID önbelleği (TLS session-ID cache)
curl TLS kullandığında, oturum-ID'yi bir önbellekte kaydeder. Sonraki bir transfer, önbelleğe alınmış bir oturum-ID'sine sahip olduğu bir ana bilgisayarla TLS el sıkışmasını tekrar yapması gerektiğinde, el sıkışması daha hızlı tamamlanabilir. Bu önbellek yalnızca bellekte bulunur.
CA deposu önbelleği (CA store cache)
curl yeni bir bağlantı oluşturduğunda ve bir TLS el sıkışması gerçekleştirdiğinde, uzak sunucu tarafından sunulan sertifikayı doğrulamak için kullanmak üzere bir CA deposu yüklemesi ve ayrıştırması gerekir. CA deposu önbelleği, ayrıştırılmış CA deposunu bir süre (varsayılan 24 saattir) bellekte tutar, böylece sonraki el sıkışmalar bu potansiyel olarak büyük veri miktarını yeniden ayrıştırmak zorunda kalmayarak çok daha hızlı yapılır. Bu önbellek yalnızca bellekte bulunur. 7.87.0'da eklendi.
HSTS
HSTS, HTTP Strict Transport Security'dir (HTTP Katı Taşıma Güvenliği). HTTPS sunucuları, istemcileri HTTP:// URL'leri kullanılsa bile, ileriye dönük olarak kendi ana bilgisayar adlarına yalnızca HTTPS kullanarak ve HTTP kullanmadan bağlanmalarını istediklerini bildirebilirler. curl bu bağlantı yükseltme bilgilerini bellekte tutar ve diske kaydetmesi ve diskten yüklemesi de söylenebilir.
Alt-Svc
Alt-Svc:, istemciyi aynı hizmetin de mevcut olduğu alternatif ana bilgisayar adları, port numaraları ve protokol sürümleri hakkında bilgilendiren bir HTTP yanıt başlığıdır. curl bu alternatif hizmet bilgilerini bellekte tutar ve diske kaydetmesi ve diskten yüklemesi de söylenebilir.
Çerezler (Cookies)
Çerezler, bir HTTP sunucusundan istemciye gönderilen ve koşullarla eşleşen sonraki isteklerde geri gönderilmesi amaçlanan ad değer çiftleridir. curl tüm çerezleri bellekte tutar ve bunları diskten yüklemesi ve diske kaydetmesi de söylenebilir.
Zaman aşımları (Timeouts)
Tüm iç yapının bloklamayan bir şekilde yazılması gerekir ve sadece takılıp olayların gerçekleşmesini bekleyemez. Aynı zamanda, multi arayüzü kullanıcıların libcurl'ü neredeyse herhangi bir zamanda, hiçbir eylem gerçekleşmemiş veya bir zaman aşımı tetiklenmemiş olsa bile gerçekleştirmeye (perform) çağırmasına izin verir.
Uygulamalara yalnızca tek bir zaman aşımı sunar
Harici API'de libcurl, kaç tane eşzamanlı transferin ve hangi seçeneklerin ayarlandığına bakılmaksızın aynı anda tek bir zaman aşımı sağlar. Bir uygulama, hangi API'yi kullanmak istediğine bağlı olarak curl_multi_timeout() ile veya bir CURLMOPT_TIMERFUNCTION geri çağırımında zaman aşımı değerini alabilir.
Dahili olarak bu şu şekilde yapılır:
- Her easy handle, zaman aşımlarını sıralı bir düzende tutan bir diziye sahiptir. Zamana en yakın olan (bir sonraki zaman aşımı) listede ilk sıradadır.
- Tüm easy handle'lar, zaman aşımlarına bağlı olarak düğümleri eklemeyi ve kaldırmayı hızlandıran ikili kendi kendini dengeleyen bir arama ağacı olan bir splay ağacına konur.
- Herhangi bir handle'ın bir sonraki zaman aşımı değişir değişmez, splay ağacı yeniden dengelenir.
Zaman aşımları dolan easy handle'ların çıkarılması hızlı bir işlemdir.
Bir zaman aşımı ayarla
Bir zaman aşımını ayarlamak için dahili işlev Curl_expire() olarak adlandırılır. libcurl'ün bu handle için gelecekte belirli bir milisaniye içinde tekrar çağrılmasını ister. Bir zaman aşımı, aynı zaman aşımı vb. için ayarlanan önceki değerleri geçersiz kıldığından emin olmak için belirli bir kimlikle (ID) ayarlanır. Mevcut zaman aşımı kimlikleri sınırlıdır ve set sabit kodlanmıştır.
Bir zaman aşımı, verilen easy handle için zaman aşımları listesinden o zaman aşımını kaldıran Curl_expire_clear() ile tekrar kaldırılabilir.
Süresi dolmuş zaman aşımları
Bir zaman aşımının süresinin dolması, uygulamanın libcurl'ü tekrar çağırması gerektiğini bildiği anlamına gelir. socket_action API'si kullanıldığında, zaman aşımı dolan belirli bir easy handle için libcurl'ü tekrar çağırmayı bile bilir.
Bir zaman aşımı süresi dolduğunda, perform işlevinin çağrılmasından başka özel bir eylem veya etkinlik gerçekleşmez. Her durum veya dahili işlev, (tekrar) çağrıldığında hangi zamanları veya durumları kontrol edeceğini ve buna göre hareket edeceğini bilmelidir.
Windows vs Unix
Unix yoluna kıyasla Windows yolunda curl programlamada birkaç fark vardır. Belki de en dikkat çekici dört ayrıntı şunlardır:
Soket işlemleri için farklı işlev adları
curl'de bu, tanımlar ve makrolarla çözülür, böylece kaynak kodu bunları tanımlayan başlık dosyası dışında her yerde aynı görünür. Kullanımdaki makrolar sclose(), sread() ve swrite()'tır.
Init çağrıları
Windows soket işleri için birkaç init çağrısı gerektirir.
Bu curl_global_init() çağrısı tarafından halledilir, ancak diğer kütüphaneler de bunu yapıyorsa vb. uygulamaların bu davranışı değiştirmesi için nedenler olabilir.
WinSock sürüm 2.2'ye ihtiyacımız var ve bu sürümü genel başlatma sırasında yüklüyoruz.
Dosya tanımlayıcıları (File descriptors)
Ağ iletişimi ve dosya işlemleri için dosya tanımlayıcıları Unix'teki kadar kolay değiştirilebilir değildir.
Dosya tanımlayıcılarında herhangi bir komik numara denemeyerek bundan kaçınıyoruz.
Stdout
stdout'a veri yazarken, Windows satır sonlarını DOS tarzında yapar, böylece ikili verileri yok eder, ancak gelen metinse o dönüşümü istersiniz... (iç çeker)
Windows altında stdout'u ikiliye ayarlıyoruz
Ifdefs
Kaynak kodunun içinde, #ifdef [İşletim Sisteminiz]'den kaçınmak için çaba gösteriyoruz. Özelliklerle ilgilenen tüm koşullular bunun yerine #ifdef O_TUHAF_ISLEV_VAR formatında olmalıdır. Windows configure betiklerini çalıştıramadığından, lib dizininde, bir Windows makinesinde bir curl_config.h dosyasının görüneceği gibi görünmesi gereken bir curl_config-win32.h dosyasını koruyoruz.
Genel olarak konuşursak: curl sıklıkla birkaç düzine işletim sisteminde derlenir. Kenarda yürümeyin.
Bellek hata ayıklama (Memory debugging)
lib/memdebug.c dosyası, birkaç işlevin hata ayıklama sürümlerini içerir. malloc(), free(), fopen(), fclose() vb. gibi, sızdırırsak bize sorun çıkarabilecek kaynaklarla bir şekilde ilgilenen işlevler. Bellek hata ayıklama sistemindeki işlevler süslü bir şey yapmaz, normal işlevlerini yaparlar ve ardından az önce ne yaptıkları hakkında bilgi kaydederler. Kaydedilen veriler daha sonra tam bir oturumdan sonra analiz edilebilir,
memanalyze.pl, bellek izleme sistemi tarafından oluşturulan bir günlük dosyasını analiz eden ve tests/ içinde bulunan Perl betiğidir. Kaynakların tahsis edilip edilmediğini ancak asla serbest bırakılmadığını ve kaynak yönetimiyle ilgili diğer tür hataları algılar.
Dahili olarak, önişlemci sembolü DEBUGBUILD'in tanımı, yalnızca hata ayıklama etkin derlemeler için derlenen kodu kısıtlar. CURLDEBUG sembolü, yalnızca bellek izleme/hata ayıklama için kullanılan kodu ayırt etmek için kullanılır.
Bellek hata ayıklamasını etkinleştirmek için derlerken -DCURLDEBUG kullanın, bu ayrıca configure'u --enable-curldebug ile çalıştırarak da açılır. Hata ayıklama derlemesini etkinleştirmek için derlerken -DDEBUGBUILD kullanın veya configure'u --enable-debug ile çalıştırın.
curl --version, hata ayıklama etkin derlemeler için Debug özelliğini listeler ve curl hata ayıklama bellek izleme yetenekli derlemeler için TrackMemory özelliğini listeler. Bu özellikler bağımsızdır ve configure betiği çalıştırılırken kontrol edilebilir. --enable-debug verildiğinde, bellek izlemenin kullanılmasını engelleyen bir kısıtlama olmadığı sürece her iki özellik de etkinleştirilir.
Bellek Sızıntılarını Takip Et
... bellek hata ayıklama sistemini kullanarak. Genel olarak, ilk tercih olarak valgrind kullanmanızı öneririz.
Tek iş parçacıklı (Single-threaded)
Lütfen bu bellek sızıntısı sisteminin birden fazla iş parçacığında çalışacak şekilde ayarlanmadığını unutmayın. Çok iş parçacıklı bir uygulamada kullanmak istiyorsanız/ihtiyacınız varsa, lütfen buna göre ayarlayın.
Derleme (Build)
libcurl'ü -DCURLDEBUG ile yeniden derleyin (genellikle configure'u --enable-debug ile yeniden çalıştırmak bunu düzeltir). Önce make clean, ardından make yapın, böylece tüm dosyalar aslında düzgün bir şekilde yeniden oluşturulur. Ayrıca libcurl'ü hata ayıklama seçeneğiyle (genellikle derleyiciye -g) derlemek mantıklıdır, böylece kütüphanede aslında bir sızıntı bulursanız hata ayıklama daha kolay olur.
Bu, bellek hata ayıklamanın etkin olduğu bir kütüphane oluşturur.
Uygulamanızı Değiştirin
Uygulama kodunuza bir satır ekleyin:
curl_dbg_memdebug("dump");
Bu, malloc hata ayıklama sisteminin, verilen dosya adına kaynakları kullanan işlevlerin tam bir izini çıkarmasını sağlar. Programınızı yeniden oluşturduğunuzdan ve yukarıda açıklandığı gibi bu amaçla oluşturduğunuz aynı libcurl ile bağladığınızdan emin olun.
Uygulamanızı Çalıştırın
Programınızı her zamanki gibi çalıştırın. Belirtilen bellek izleme dosyasının büyümesini izleyin.
Programınızın çıkmasını sağlayın ve uygun libcurl temizleme işlevlerini vb. kullanın. Böylece tüm sızıntı olmayanlar düzgün bir şekilde döndürülür/serbest bırakılır.
Akışı Analiz Edin
Döküm dosyasını analiz etmek için tests/memanalyze.pl Perl betiğini kullanın:
$ tests/memanalyze.pl dump
Bu şimdi tahsis edilen ancak asla serbest bırakılmayan vb. kaynaklar hakkında bir rapor verir. Bu rapor listeye göndermek için uygundur.
Bu herhangi bir çıktı üretmezse, libcurl'de hiçbir sızıntı algılanmamıştır. O zaman sızıntı büyük olasılıkla sizin kodunuzdadır.
İçerik Kodlaması (Content Encoding)
İçerik kodlamaları hakkında
HTTP/1.1, bir istemcinin sunucunun yanıtını kodlamasını talep edebileceğini belirtir. Bu genellikle, yaygın olarak bulunan sıkıştırma tekniklerinden oluşan bir setten bir (veya daha fazla) kodlama kullanarak bir yanıtı sıkıştırmak için kullanılır. Bu şemalar deflate (zlib algoritması), gzip, br (brotli) ve compress'i içerir. Bir istemci, istek belgesine bir Accept-Encoding başlığı ekleyerek sunucunun bir kodlama gerçekleştirmesini talep eder. Başlığın değeri tanınan belirteçlerden deflate, ... biri olmalıdır (yeni şemaları/belirteçleri kaydetmenin bir yolu vardır, spesifikasyonun bkz. 3.5. bölümü). Bir sunucu, istemcinin kodlama isteğini yerine getirebilir (MAY). Bir yanıt kodlandığında, sunucu yanıta bir Content-Encoding başlığı ekler. Content-Encoding başlığının değeri, verileri kodlamak için hangi kodlamaların kullanıldığını, uygulandıkları sıraya göre belirtir.
Bir istemcinin farklı şemalara öncelikler eklemesi de mümkündür, böylece sunucu hangisini tercih ettiğini bilir. Accept-Encoding başlığı hakkında daha fazla bilgi için RFC 2616'nın 14.3. bölümüne bakın. Content-Encoding başlığı hakkında daha fazla bilgi için RFC 7231'in 3.1.2.2. bölümüne bakın.
Desteklenen içerik kodlamaları
deflate, gzip, zstd ve br içerik kodlamaları libcurl tarafından desteklenir. Hem normal hem de parçalı (chunked) transferler iyi çalışır. deflate ve gzip kodlamaları için zlib kütüphanesi gereklidir, br kodlaması için brotli kod çözme kütüphanesi ve çok şaşırtıcı olmayan bir şekilde libzstd zstd yapar.
libcurl arayüzü
libcurl'den içerik kodlaması kullanarak bir istek yapmasını istemek için şunu kullanın:
curl_easy_setopt(curl, CURLOPT_ACCEPT_ENCODING, string);
burada string, Accept-Encoding başlığının amaçlanan değeridir.
libcurl birden fazla kodlamayı destekler ancak yalnızca deflate, gzip, zstd ve/veya br içerik kodlamalarını kullanan yanıtları nasıl işleyeceğini anlar, bu nedenle CURLOPT_ACCEPT_ENCODING için çalışan tek değerler (hiçbir şey yapmayan identity dışında) deflate, gzip, zstd ve br'dir. Bir yanıt compress veya yöntemleri kullanılarak kodlanmışsa, libcurl yanıtın çözülemediğini belirten bir hata döndürür. <string> NULL ise hiçbir Accept-Encoding başlığı oluşturulmaz. <string> sıfır uzunluklu bir dizeyse, desteklenen tüm kodlamaları içeren bir Accept-Encoding başlığı oluşturulur.
İçeriğin otomatik olarak kodunun çözülmesi için CURLOPT_ACCEPT_ENCODING herhangi bir NULL olmayan değere ayarlanmalıdır. Ayarlanmamışsa ve sunucu yine de kodlanmış içerik gönderirse (istenmemiş olmasına rağmen), veriler ham biçiminde döndürülür ve Content-Encoding türü kontrol edilmez.
curl arayüzü
Sunuculardan yanıtları curl tarafından desteklenen herhangi bir formatı kullanarak sıkıştırmalarını istemesi için curl ile --compressed seçeneğini kullanın.
Yapılar (Structs)
Bu bölüm dahili yapıları belgeler. Bunlar gerçekten dahili olduklarından, zaman zaman onları değiştiririz ve bu da bu bölümü bazen biraz güncel olmayan hale getirebilir.
Curl_easy
Curl_easy yapısı, harici API'de opak bir CURL * olarak dışarıya döndürülen yapıdır. Bu işaretçi genellikle API belgelerinde ve örneklerinde easy handle (kolay tutaç) olarak bilinir.
Gerçek bağlantıyla ilgili bilgi ve durum connectdata yapısındadır. Bir transfer yapılmak üzereyken, libcurl ya yeni bir bağlantı oluşturur ya da mevcut birini yeniden kullanır. Bu handle tarafından kullanılan mevcut connectdata Curl_easy->conn tarafından işaret edilir.
Bu belirli tek transfere ilişkin veriler ve bilgiler SingleRequest alt yapısına konur.
Curl_easy yapısı bir multi handle'a eklendiğinde (herhangi bir transfer yapmak için eklenmelidir), ->multi üyesi ait olduğu Curl_multi yapısına işaret eder. ->prev ve ->next üyeleri daha sonra multi kodu tarafından aynı multi handle'a eklenen Curl_easy yapılarının bağlantılı bir listesini tutmak için kullanılır. libcurl her zaman multi kullanır, bu nedenle bir transfer devam ederken ->multi bir Curl_multi'ye işaret eder.
->mstate, bu belirli Curl_easy'nin multi durumudur. multi_runsingle() çağrıldığında, hangi durumda olduğuna göre bu handle üzerinde işlem yapar. mstate ayrıca [curl_multi_fdset()][12] vb. çağrıldığında belirli bir Curl_easy için hangi soketlerin döndürüleceğini söyleyen şeydir.
libcurl kaynak kodu genellikle Curl_easy yapısına işaret eden yerel değişken için her yerde data adını kullanır.
Çoğullanmış (multiplexed) HTTP/2 transferleri yaparken, her Curl_easy, aynı connectdata yapısını paylaşan ayrı bir akışla ilişkilendirilir. Çoğullama, şeyleri doğru şeyle ilişkili tutmayı daha da önemli hale getirir.
connectdata
libcurl'deki genel bir fikir, bağlantıları kullanıldıktan sonra tekrar kullanılmaları durumunda bir bağlantı önbelleğinde tutmak ve ardından yeni bir tane oluşturmak yerine mevcut birini yeniden kullanmaktır; bu önemli bir performans artışı yaratır.
Her connectdata yapısı bir sunucuya tek bir fiziksel bağlantıyı tanımlar. Bağlantı canlı tutulamazsa, kullanımdan sonra bağlantı kapatılır ve ardından bu yapı önbellekten çıkarılabilir ve serbest bırakılabilir.
Böylece, aynı Curl_easy birden çok kez kullanılabilir ve her seferinde bağlantı için kullanılacak başka bir connectdata yapısı seçebilir. Bunu aklınızda bulundurun, çünkü seçeneklerin veya seçimlerin bağlantıya mı yoksa Curl_easy'ye mi dayalı olduğunu düşünmek o zaman önemlidir.
Özel bir karmaşıklık olarak, libcurl tarafından desteklenen bazı protokoller, sadece soketi kapatmaktan daha fazlası olan özel bir bağlantı kesme prosedürü gerektirir. Bunu yapmadan önce sunucuya bir veya daha fazla komut göndermeyi içerebilir. Bağlantılar kullanımdan sonra bağlantı önbelleğinde tutulduğundan, belirli bir bağlantıyı kapatma zamanı geldiğinde orijinal Curl_easy artık etrafta olmayabilir. Bu amaçla libcurl, gerektiğinde kullanmak üzere Curl_multi yapısında özel bir kukla closure_handle Curl_easy tutar.
FTP, tipik bir transfer için iki TCP bağlantısı kullanır ancak her ikisini de bu tek yapıda tutar ve bu nedenle çoğu dahili endişe için tek bir bağlantı olarak kabul edilebilir.
libcurl kaynak kodu genellikle connectdata'ya işaret eden yerel değişken için conn adını kullanır.
Curl_multi
Dahili olarak, easy arayüzü multi arayüzü işlevlerinin etrafında bir sarmalayıcı olarak uygulanır. Bu her şeyi multi arayüzü yapar.
Curl_multi, harici API'lerde opak CURLM * olarak sunulan multi handle yapısıdır.
Bu yapı, [curl_multi_add_handle()][13] ile bu handle'a eklenmiş Curl_easy yapılarının bir listesini tutar. Listenin başı ->easyp'dir ve ->num_easy, eklenen Curl_easy'lerin bir sayacıdır.
->msglist, [curl_multi_info_read()][14] çağrıldığında geri gönderilecek mesajların bağlantılı bir listesidir. Temel olarak, bireysel bir Curl_easy'nin transferi tamamlandığında o listeye bir düğüm eklenir.
->hostcache isim önbelleğine işaret eder. İsimden IP'ye arama yapmak için bir karma tablosudur. Düğümlerin orada sınırlı bir ömrü vardır ve bu önbellek, aynı ismin kısa bir süre içinde istendiği zaman süreyi azaltmak içindir.
->timetree, kontrol edilmesi gereken kalan süreye göre sıralanmış Curl_easy ağacına işaret eder - normalde bir tür zaman aşımı. Her Curl_easy ağaçta bir düğüme sahiptir.
->sockhash, hangi Curl_easy'nin o tanımlayıcıyı kullandığına dair soket tanımlayıcısının hızlı aramalarına izin vermek için bir karma tablosudur. Bu, multi_socket API'si için gereklidir.
->conn_cache bağlantı önbelleğine işaret eder. Kullanımdan sonra tutulan tüm bağlantıları takip eder. Önbelleğin maksimum bir boyutu vardır.
->closure_handle, connectdata bölümünde açıklanmıştır.
libcurl kaynak kodu genellikle Curl_multi yapısına işaret eden değişken için multi adını kullanır.
Curl_handler
libcurl tarafından desteklenen her benzersiz protokolün en az bir Curl_handler yapısı sağlaması gerekir. Protokolün ne olarak adlandırıldığını ve ana kodun protokole özgü sorunlarla başa çıkmak için hangi işlevleri çağırması gerektiğini tanımlar. Genel olarak, içinde struct Curl_handler Curl_handler_[protocol] bildirilmiş [protocol].c adında bir kaynak dosyası vardır. url.c içinde, libcurl'e çalışması için bir URL verildiğinde taranan tek bir diziden işaret edilen tüm bireysel Curl_handler yapılarına sahip ana dizi vardır.
Somut işlev işaretçisi prototipleri lib/urldata.h içinde bulunabilir.
-
->scheme, genellikle büyük harflerle yazılan URL şema adıdır. Yani HTTP veya FTP vb. Protokolün SSL sürümlerinin kendiCurl_handlerkurulumuna ihtiyacı vardır, bu nedenle HTTPS HTTP'den ayrıdır. -
->setup_connection, protokol kodunun daha sonra bu transferin geri kalanı için oCurl_easyile ilişkilendirilecek protokole özgü verileri tahsis etmesine izin vermek için çağrılır. Transferin sonunda tekrar serbest bırakılır. Transfer içinconnectdataseçilmeden/oluşturulmadan önce çağrılır. Çoğu protokol burada özelstruct [PROTOCOL]yapısını tahsis eder veCurl_easy->req.p.[protocol]'u buna atar. -
->connect_it, bir protokolün TCP bağlantısı yapıldıktan sonra bazı belirli eylemleri yapmasına izin verir, bu hala bağlantı aşamasının bir parçası olarak kabul edilebilir. Bazı protokoller bu işlevdeconnectdata->recv[]veconnectdata->send[]işlev işaretçilerini değiştirir. -
->connectingbenzer şekilde protokol kendini hala bağlantı aşamasında gördüğü sürece çağrılmaya devam eden bir işlevdir. -
->do_it, transfer isteğini yayınlamak için çağrılan işlevdir. Dahili olarak DO eylemi dediğimiz şey. DO yeterli değilse ve tüm DO dizisinin tamamlanması için bir şeylerin yapılmaya devam etmesi gerekiyorsa, o zaman genellikle->doingde sağlanır. Do/doing için birden fazla komut veya benzerini yapması gereken her protokolün kendi durum makinelerini uygulaması gerekir (bkz. SCP, SFTP, FTP). Bazı protokoller (yalnızca FTP ve yalnızca tarihsel nedenlerden dolayı)DO_MOREadı verilen DO durumunun ayrı bir parçasına sahiptir. -
->doing, transfer isteği komut(lar)ını yayınlarken çağrılmaya devam eder -
->done, transfer tamamlandığında ve BİTTİĞİNDE çağrılır. Yani ana veriler transfer edildikten sonra. -
->do_more,DO_MOREdurumu sırasında çağrılır. FTP protokolü ikinci bağlantıyı kurarken bu durumu kullanır. -
->proto_getsock,->doing_getsock,->domore_getsock,->perform_getsockSoket bilgisi döndüren işlevler. Belirli multi durumu sırasında hangi G/Ç eylem(ler)i için hangi soket(ler)in bekleneceği. -
->disconnect, TCP bağlantısı kapatılmadan hemen önce çağrılır. -
->readwrite, protokolün fazladan okuma/yazma yapmasına izin vermek için transfer sırasında çağrılır -
->attach, bir transferi bağlantıya ekler. -
->defport, bu protokolün kullandığı varsayılan rapor TCP veya UDP portudur -
->protocol,CURLPROTO_*setindeki bir veya daha fazla bittir. SSL sürümlerinin temel protokol seti ve ardından SSL varyasyonu vardır.HTTP|HTTPSgibi. -
->flags, protokol hakkında genel motor tarafından farklı muamele görmesini sağlayan ek bilgiler içeren bir bit maskesidir:PROTOPT_SSL- bağlanmasını ve SSL anlaşmasını sağlarPROTOPT_DUAL- bu protokol iki bağlantı kullanırPROTOPT_CLOSEACTION- bu protokolün bağlantıyı kapatmadan önce yapması gereken eylemleri vardır. Bu bayrak artık kod tarafından kullanılmıyor, ancak yine de bir dizi protokol işleyicisi için ayarlanmış.PROTOPT_DIRLOCK- yön kilidi. SSH protokolleri, ana motorun kendisiyle ilgilendiği soket eylemlerinin hangi yönünü sınırlamak için bu biti ayarlar.PROTOPT_NONETWORK- ağı kullanmayan bir protokol (file:okuma)PROTOPT_NEEDSPWD- bu protokol bir parolaya ihtiyaç duyar ve bir tane sağlanmadıkça varsayılan bir tane kullanırPROTOPT_NOURLQUERY- bu protokol URL'deki bir sorgu parçasını işleyemez (?foo=bar)
conncache
Daha sonra yeniden kullanılmak üzere bağlantıları olan bir karma tablosudur. Her Curl_easy'nin kendi bağlantı önbelleğine bir işaretçisi vardır. Her multi handle, eklenen tüm Curl_easy'lerin varsayılan olarak paylaştığı bir bağlantı önbelleği kurar.
Curl_share
libcurl paylaşım API'si, harici API'ye CURLSH * olarak sunulan bir Curl_share yapısı tahsis eder.
Fikir, yapının kendi önbellek ve havuz sürümlerine sahip olabilmesi ve ardından bu yapıyı CURLOPT_SHARE seçeneğinde sağlayarak, bu belirli Curl_easy'lerin bu paylaşım handle'ının tuttuğu önbellekleri/havuzları kullanmasıdır.
Daha sonra bireysel Curl_easy yapıları, aksi takdirde paylaşmayacakları çerezler gibi belirli şeyleri paylaşacak şekilde yapılabilir.
Curl_share yapısı şu anda çerezleri, DNS önbelleğini ve SSL oturum önbelleğini tutabilir.
CookieInfo
Bu ana çerez yapısıdır. Bilinen tüm çerezleri ve ilgili bilgileri tutar. Bir multi handle'a eklendiklerinde bile her Curl_easy'nin kendi özel CookieInfo'su vardır. Paylaşım API'si kullanılarak çerezleri paylaşmaları sağlanabilir.
Ana bilgisayar adlarını çözümleme (Resolving hostnames)
Yani hostip.c açıklandı
host*.c kaynak dosyasını okurken akılda tutulması gereken ana derleme zamanı tanımları şunlardır:
CURLRES_IPV6
bu ana bilgisayarın getaddrinfo() ve ailesine sahip olduğu ve dolayısıyla bunu kullandığımız anlamına gelir. Ana bilgisayar IPv6'yı çözümleyemeyebilir, ancak bunu gerçekten hesaba katmamız gerekmez. IPv6 özellikli olmayan ana bilgisayarlarda CURLRES_IPV4 tanımlıdır.
CURLRES_ARES
libcurl asenkron ad çözümlemeleri için c-ares kullanacak şekilde oluşturulmuşsa tanımlanır. Bu Windows veya *nix olabilir.
CURLRES_THREADED
libcurl asenkron ad çözümlemeleri için iş parçacığı (threading) kullanacak şekilde oluşturulmuşsa tanımlanır. Ad çözümlemesi yeni bir iş parçacığında yapılır ve desteklenen asenkron API, ares derlemeleriyle aynıdır. Bu (yerel) Windows altında varsayılandır.
Önceki ikisinden herhangi biri tanımlanmışsa, CURLRES_ASYNCH de tanımlanır. libcurl asenkron bir çözümleyici kullanacak şekilde oluşturulmamışsa, CURLRES_SYNCH tanımlanır.
host*.c kaynakları
host*.c kaynak dosyaları şu şekilde bölünmüştür:
hostip.c- yöntemden bağımsız çözümleyici işlevleri ve yardımcı işlevlerhostasyn.c- asenkron ad çözümlemeleri için işlevlerhostsyn.c- senkron ad çözümlemeleri için işlevlerasyn-ares.c- c-ares kullanan asenkron ad çözümlemeleri için işlevlerasyn-thread.c- iş parçacığı kullanan asenkron ad çözümlemeleri için işlevlerhostip4.c- IPv4'e özgü işlevlerhostip6.c- IPv6'ya özgü işlevler
hostip.h, tüm bunlar için tek birleşik başlık dosyasıdır. config*.h ve curl_setup.h tanımlarına dayanarak CURLRES_* tanımlarını tanımlar.
Testler (Tests)
curl test paketi, geliştirme sürecimizdeki temel bir yapı taşıdır. Mevcut işlevselliğin eskisi gibi hala orada olduğunu doğrulamamıza yardımcı olur ve yeni işlevselliğin beklendiği gibi davrandığını kontrol etmek için kullanırız.
Her hata düzeltmesi ve yeni özellik ile ideal olarak bir veya daha fazla test senaryosu da oluştururuz.
Test paketi, curl'ü ihtiyacımız olduğunu düşündüğümüz her açıdan test etmemize izin vermek için kendi amaçlarımıza özel olarak yapılmış ve uyarlanmıştır. Herhangi bir üçüncü taraf test çerçevesine dayanmaz.
Testlerin mevcut hemen hemen tüm platformlarda derlenmesi ve çalıştırılması amaçlanmıştır.
- Test dosya formatı
- Testleri derleme
- Testleri çalıştırma
- Hata ayıklama derlemeleri
- Test sunucuları
- curl testleri
- libcurl testleri
- Birim testleri
- Valgrind
- Sürekli Entegrasyon (CI)
- Otomatik derlemeler
- İşkence (Torture)
Test dosya formatı
Her curl testi, XML benzeri bir format kullanılarak tek bir metin dosyasında tasarlanmıştır.
Etiketler tüm bölümlerin başlangıcını ve sonunu işaretler ve her etiket kendi satırına yazılmalıdır. Yorumlar XML tarzı (<!-- ve --> ile çevrili) veya kabuk betiği tarzındadır (# ile başlayan) ve gerçek test verilerinin yanında değil kendi satırlarında görünmelidir. Çoğu test veri dosyası sözdizimsel olarak geçerli XML'dir, ancak birkaç dosya değildir (karakter varlıkları için destek eksikliği ve satır sonlarında satır başı ve satır besleme karakterlerinin korunması en büyük farklardır).
Tüm testler, dosyanın geri kalanını kapsayan bir <testcase> etiketiyle başlamalıdır. Diğer etiketler için aşağıya bakın.
Her test dosyası tests/data/testNUMBER olarak adlandırılır, burada NUMBER benzersiz bir sayısal test tanımlayıcısıdır. Her testin kendi özel numarasını kullanması gerekir. Sayının testi tanımlamak dışında bir anlamı yoktur.
Test dosyası, tam olarak hangi komut satırının veya aracın çalıştırılacağını, hangi test sunucularının çağrılacağını ve nasıl yanıt vermeleri gerektiğini, tam olarak hangi protokol değişiminin gerçekleşmesi gerektiğini, hangi çıktı ve dönüş kodunun beklendiğini ve çok daha fazlasını tanımlar.
İsim ayarlandığında her şey aşağıdaki gibi kendi özel etiketlerinin içine yazılır:
<name>
HTTP with host name written backwards
</name>
anahtar kelimeler (keywords)
Her testin dosyanın en üstünde ayarlanmış bir veya daha fazla <keywords> vardır. Bunlar, bu test senaryosu tarafından test edilen özellik ve protokolleri tanımlayan "etiketler" olması amaçlanmıştır. runtests.pl, yalnızca bu tür anahtar kelimelerle eşleşen (veya eşleşmeyen) testleri çalıştıracak şekilde yapılabilir.
Önceden işlenmiş (Preprocessed)
Kaputun altında, her test girdi dosyası runtests.pl tarafından başlangıçta önceden işlenir. Bu, değişkenlerin, makroların ve anahtar kelimelerin genişletildiği ve dosyanın geçici bir sürümünün tests/log/testNUMBER içinde saklandığı anlamına gelir - ve o dosya daha sonra tüm test sunucuları vb. tarafından kullanılır.
Bu işlem, test formatının girdi dosyalarını buna karşılık gelen şekilde şişirmeden gerçekten büyük test dosyaları oluşturmak için %repeat gibi özellikler sunmasına olanak tanır.
Base64 Kodlama
Ön işlem aşamasında, runtests.pl'nin belirli bir bölümü base64 kodlamasını ve oluşturulan çıktı dosyasına eklemesini sağlamak için özel bir talimat kullanılabilir. Bu, test aracının sunucu port numarası gibi bu belirli test çağrısı için benzersiz olan dinamik bilgileri kullanabilecek base64 kodlu içeriği iletmesinin beklendiği test durumları için özellikle iyidir.
Çıktıya base64 kodlu bir dize eklemek için şu sözdizimini kullanın:
%b64[ kodlanacak veri ]b64%
Kodlanacak veri daha sonra aşağıda belirtilen mevcut değişkenlerden herhangi birini veya hatta yüzde kodlu bireysel baytları kullanabilir. Örnek olarak, HTTP sunucusunun port numarasını (ASCII olarak) ve ardından bir boşluk ve onaltılık bayt 9a'yı ekleyin:
%b64[%HTTPPORT %9a]b64%
Onaltılık şifre çözme (Hexadecimal decoding)
Ön işlem aşamasında, runtests.pl'nin bir ikili bayt dizisi oluşturmasını sağlamak için özel bir talimat kullanılabilir.
Hex kodlu bir dizeden bir bayt dizisi eklemek için şu sözdizimini kullanın:
%hex[ şifresi çözülecek %XX-kodlu veri ]hex%
Örneğin, test dosyasına ikili sekizliler 0, 1 ve 255'i eklemek için:
%hex[ %00%01%FF ]hex%
İçeriği tekrarlama (Repeat content)
Ön işlem aşamasında, runtests.pl'nin tekrarlayan bir bayt dizisi oluşturmasını sağlamak için özel bir talimat kullanılabilir.
Bir tekrar bayt dizisi eklemek için, <string>'in <number> kez tekrarlanmasını sağlamak üzere şu sözdizimini kullanın. Sayı 1 veya daha büyük olmalıdır ve dize %HH onaltılık kodlar içerebilir:
%repeat[<number> x <string>]%
Örneğin, hello kelimesini 100 kez eklemek için:
%repeat[100 x hello]%
Koşullu satırlar (Conditional lines)
Test dosyasındaki satırlar, belirli bir özelliğin (aşağıdaki "özellikler" bölümüne bakın) ayarlanıp ayarlanmadığına bağlı olarak koşullu olarak görünebilir. Belirli özellik mevcutsa, aşağıdaki satırlar çıkarılır, aksi takdirde bir sonraki else veya endif cümlesine kadar hiçbir şey çıkarmaz. Şunun gibi:
%if brotli
Accept-Encoding
%endif
Ayrıca ters koşulu da kontrol edebilir, bu nedenle özellik bir ünlem işareti kullanılarak ayarlanmamışsa:
%if !brotli
Accept-Encoding: not-brotli
%endif
Karşıt durum için çıktı almak üzere bir "else" cümlesi de yapabilirsiniz, şöyle:
%if brotli
Accept-Encoding: brotli
%else
Accept-Encoding: nothing
%endif
Not içiçe geçmiş koşullar olamaz. Bir seferde yalnızca bir koşullu yapabilirsiniz ve içinde yalnızca tek bir özelliği kontrol edebilirsiniz.
Değişkenler (Variables)
Test önceden işlendiğinde, test dosyasındaki bir dizi değişken o andaki içerikleriyle değiştirilir.
Mevcut ikame değişkenleri şunları içerir:
%CLIENT6IP- curl çalıştıran istemcinin IPv6 adresi%CLIENTIP- curl çalıştıran istemcinin IPv4 adresi%CURL- curl çalıştırılabilir dosyasının yolu%FILE_PWD- Geçerli dizin, windows'ta başında bir eğik çizgi ile%FTP6PORT- FTP sunucusunun IPv6 port numarası%FTPPORT- FTP sunucusunun port numarası%FTPSPORT- FTPS sunucusunun port numarası%FTPTIME2- Test FTP sunucusundan bir yanıt almak için yeterli olması gereken saniye cinsinden zaman aşımı%FTPTIME3-%FTPTIME2'den daha da uzun%GOPHER6PORT- Gopher sunucusunun IPv6 port numarası%GOPHERPORT- Gopher sunucusunun port numarası%GOPHERSPORT- Gophers sunucusunun port numarası%HOST6IP- Bu testi çalıştıran ana bilgisayarın IPv6 adresi%HOSTIP- Bu testi çalıştıran ana bilgisayarın IPv4 adresi%HTTP6PORT- HTTP sunucusunun IPv6 port numarası%HTTPPORT- HTTP sunucusunun port numarası%HTTP2PORT- HTTP/2 sunucusunun port numarası%HTTPSPORT- HTTPS sunucusunun port numarası%HTTPSPROXYPORT- HTTPS vekil sunucusunun port numarası%HTTPTLS6PORT- HTTP TLS sunucusunun IPv6 port numarası%HTTPTLSPORT- HTTP TLS sunucusunun port numarası%HTTPUNIXPATH- HTTP sunucusunun Unix soketine giden yol%SOCKSUNIXPATH- SOCKS sunucusunun Unix soketine mutlak yol%IMAP6PORT- IMAP sunucusunun IPv6 port numarası%IMAPPORT- IMAP sunucusunun port numarası%MQTTPORT- MQTT sunucusunun port numarası%TELNETPORT- telnet sunucusunun port numarası%NOLISTENPORT- Hiçbir servisin dinlemediği port numarası%POP36PORT- POP3 sunucusunun IPv6 port numarası%POP3PORT- POP3 sunucusunun port numarası%POSIX_PWD- Geçerli dizin biraz mingw dostu%PROXYPORT- HTTP vekil sunucusunun port numarası%PWD- Geçerli dizin%RTSP6PORT- RTSP sunucusunun IPv6 port numarası%RTSPPORT- RTSP sunucusunun port numarası%SMBPORT- SMB sunucusunun port numarası%SMBSPORT- SMBS sunucusunun port numarası%SMTP6PORT- SMTP sunucusunun IPv6 port numarası%SMTPPORT- SMTP sunucusunun port numarası%SOCKSPORT- SOCKS4/5 sunucusunun port numarası%SRCDIR- Kaynak dizinine tam yol%SSHPORT- SCP/SFTP sunucusunun port numarası%SSHSRVMD5- SSH sunucusunun genel anahtarının MD5'i%SSHSRVSHA256- SSH sunucusunun genel anahtarının SHA256'sı%SSH_PWD- SSH sunucusu için dostu geçerli dizin%TESTNUMBER- Test senaryosunun numarası%TFTP6PORT- TFTP sunucusunun IPv6 port numarası%TFTPPORT- TFTP sunucusunun port numarası%USER- Testi çalıştıran kullanıcının Oturum Açma Kimliği%VERSION- test edilen curl'ün tam sürüm numarası
Etiketler (Tags)
Her test her zaman tamamen <testcase> etiketi içinde belirtilir. Her test senaryosu ayrıca dört ana bölüme ayrılır: info, reply, client ve verify.
-
info test senaryosu hakkında bilgi sağlar
-
reply, sunucunun curl'ün gönderdiği isteklere yanıt olarak ne göndereceğini bilmesi için kullanılır
-
client, istemcinin nasıl davranması gerektiğini tanımlar
-
verify, bir komut çalıştırıldıktan sonra saklanan verilerin doğru şekilde sonuçlandığını nasıl doğrulayacağınızı tanımlar
Her ana bölüm, belirtilebilen ve belirtilirse kontrol edilen/kullanılan bir dizi mevcut alt etiketi destekler.
<info>
<keywords>
Bu test senaryosunun neyi kullandığını ve test ettiğini açıklayan yeni satırla ayrılmış bir anahtar kelime listesi. Zaten kullanılmış anahtar kelimeleri kullanmaya çalışın. Bu anahtar kelimeler istatistiksel/bilgilendirme amaçlıdır ve test sınıflarını seçmek veya atlamak içindir. "Anahtar kelimeler" alfabetik bir karakter, "-", "[" veya "{" ile başlamalı ve tek bir tanımlayıcı olarak birlikte ele alınan boşluklarla ayrılmış birden fazla kelimeden oluşabilir.
<reply>
<data [nocheck="yes"] [sendzero="yes"] [base64="yes"] [hex="yes"] [nonewline="yes"]>
İsteği üzerine istemciye gönderilecek ve daha sonra güvenli bir şekilde ulaştığı doğrulanacak veriler. Test betiğinin bu verilerin gelişini doğrulamasını önlemek için nocheck="yes" olarak ayarlayın.
Veriler başlangıç ve bitiş etiketi içinde herhangi bir yerde swsclose içeriyorsa ve bu bir HTTP testiyse, bu yanıt gönderildikten sonra sunucu tarafından bağlantı kapatılır. Değilse, bağlantı kalıcı tutulur.
Veriler başlangıç ve bitiş etiketi içinde herhangi bir yerde swsbounce içeriyorsa, HTTP sunucusu bunun aynı test ve parça numarasını kullanan ikinci bir istek olup olmadığını algılar ve ardından parça numarasını bir artırır. Bu, kimlik doğrulama testleri ve benzerleri için yararlıdır.
sendzero=yes, boyut sıfır bayt olsa bile (FTP) sunucusunun verileri "gönderdiği" anlamına gelir. curl'ün sıfır bayt transferlerindeki davranışını doğrulamak için kullanılır.
base64=yes, test dosyasında sağlanan verilerin base64 ile kodlanmış bir veri yığını olduğu anlamına gelir. Bir test senaryosunun ikili veriler içerebilmesinin tek yolu budur. (Bu öznitelik aslında herhangi bir bölümde kullanılabilir, ancak "data" dışındaki diğer bölümler için pek mantıklı değildir).
hex=yes, verilerin onaltılık çiftlerin bir dizisi olduğu anlamına gelir. Kodu çözülür ve "ham" veri olarak kullanılır.
nonewline=yes, son baytın (sondaki yeni satır karakteri) göndermeden veya karşılaştırmadan önce verilerden kesilmesi gerektiği anlamına gelir.
FTP dosya listeleri için, <data> bölümü yalnızca önce test-[number] adlı bir dizine CWD yapıldığından eminseniz kullanılır; burada [number] test senaryosu numarasıdır. Aksi takdirde ftp sunucusu liste içeriğini hangi test dosyasından yükleyeceğini bilemez.
<dataNUMBER>
<data> yerine bu içeriği geri gönderin. NUMBER sayısı şu şekilde ayarlanır:
- İstek satırındaki test numarası >10000 ve bu [test senaryosu numarası]%10000'in kalanıdır.
- İstek HTTP idi ve 1000 sayısını ekleyen özet (digest) ayrıntılarını içeriyordu
- Bir HTTP isteği NTLM tip-1 ise, sayıya 1001 ekler
- Bir HTTP isteği NTLM tip-3 ise, sayıya 1002 ekler
- Bir HTTP isteği Temel (Basic) ve sayı zaten >=1000 ise, 1 ekler
- Bir HTTP isteği Negotiate ise, aynı test senaryosunda Negotiate yetkilendirme başlığına sahip her istek için sayı bir artırılır.
Test numarasını bu şekilde dinamik olarak değiştirmek, test donanımının bir transferi tamamlamak için birkaç farklı isteğin gönderilmesi gereken kimlik doğrulama müzakeresini test etmek için kullanılmasına olanak tanır. Her isteğe verilen yanıt kendi veri bölümünde bulunur. Tüm müzakere sırasını doğrulamak bir datacheck bölümü belirterek yapılabilir.
<connect>
Connect bölümü, tüm CONNECT istekleri için 'data' yerine kullanılır. Veri bölümü kurallarının geri kalanı o zaman geçerlidir ancak bir connect öneki ile.
<socks>
SOCKS vekil sunucusu tarafından kaydedilen adres türü ve adres ayrıntıları.
<datacheck [mode="text"] [nonewline="yes"]>
veriler gönderilir ancak daha sonra kontrol edilmesi gereken şey budur. nonewline=yes ayarlanırsa, runtests istemci tarafından gerçekten alınanla karşılaştırmadan önce verilerden sondaki yeni satırı keser.
Metin/ikili farkı olan platformlarda çıktı metin modundaysa mode="text" özniteliğini kullanın.
<datacheckNUM [nonewline="yes"] [mode="text"]>
Numaralandırılmış datacheck bölümlerinin içeriği numaralandırılmamış olana eklenir.
<size>
bir ftp SIZE komutunda döndürülecek sayı (bu komutun başarısız olmasını sağlamak için -1'e ayarlayın)
<mdtm>
İstemci bir FTP MDTM komutu gönderirse ne geri gönderilecek, dosyanın mevcut olmadığını döndürmesi için -1'e ayarlayın
<postcmd>
yanıt gönderildikten sonra davranışını kontrol etmek için özel amaçlı sunucu komutu HTTP/HTTPS için bunlar desteklenir:
wait [saniye] - Belirtilen süre boyunca duraklat
<servercmd>
Sunucu için özel komutlar.
Bu dosyanın ilk satırı, sunucuların istemcinin hangi testi yapmak üzere olduğunu bilmek için bunu okumasına izin vermek üzere test betiği tarafından her zaman Testnum [number] olarak ayarlanır.
FTP/SMTP/POP/IMAP İçin
REPLY [komut] [dönüş değeri] [yanıt dizesi]- Sunucunun [komut]'a nasıl yanıt vereceğini değiştirir. [yanıt dizesi] bir perl dizesi olarak değerlendirilir, böylece örneğin gömülü\r\niçerebilir. Bağlantıda bir karşılama olarak hemen gönderilen dize olan "welcome" (tırnak işaretleri olmadan) adında özel bir [komut] vardır.REPLYLF(yukarıdaki gibi ama yanıtı CRLF yerine yalnızca LF ile sonlandırılmış olarak gönderir)COUNT [komut] [sayı]-REPLYdeğişikliğini[komut]için yalnızca[sayı]kez yapın ve ardından yerleşik yaklaşıma geri dönünDELAY [komut] [saniye]- Bu komuta yanıt vermeyi belirtilen süre kadar geciktirinRETRWEIRDO- Bir dosya transfer edildiğinde birden fazla yanıt satırı aynı anda göründüğünde "weirdo" (tuhaf) RETR durumunu etkinleştirinRETRNOSIZE- RETR yanıtının dosyanın boyutunu içermediğinden emin olunNOSAVE- Alınanları kaydetmeyinSLOWDOWN- FTP yanıtlarını her bayt arasında 0,01 saniye gecikmeyle gönderinPASVBADIP- PASV'nin 227 yanıtında yasadışı bir IP geri göndermesini sağlarCAPA [yetenekler]- IMAPCAPABILITY, POP3CAPAve SMTPEHLOkomutları için istemciye döndürülecek boşlukla ayrılmış yetenekler listesini belirtir ve desteği etkinleştirirAUTH [mekanizmalar]- SASL kimlik doğrulaması desteğini etkinleştirir ve IMAP, POP3 ve SMTP için boşlukla ayrılmış mekanizmaların bir listesini belirtirSTOR [mesaj]-STOR'dan sonra varsayılan yerine bununla yanıt verin
HTTP/HTTPS İçin
auth_requiredbu ayarlanmışsa ve kimlik doğrulama olmadan bir POST/PUT yapılırsa, sunucu tam istek gövdesinin gönderilmesini BEKLEMEZidle- isteği aldıktan sonra hiçbir şey yapma, sadece "boşta otur"stream- istemciye sürekli veri gönder, hiç bitmeyenwritedelay: [milisaniye]- yanıt paketleri arasında bu miktar kadar gecikskip: [sayı]- sunucuya bir PUT veya POST isteğinden bu kadar bayt okumayı görmezden gelmesini talimat verirrtp: part [sayı] channel [sayı] size [sayı]- verilen yük boyutu ile seçilen bir kanalda verilen parça için sahte bir RTP paketi yayınlaconnection-monitor- Kullanıldığında, bağlantı kesildiğindeserver.inputgünlüğüne[DISCONNECT]kaydeder.upgrade- bir HTTP yükseltme başlığı bulunduğunda, sunucu http2'ye yükseltirswsclose- yanıttan sonra sunucuya bağlantıyı kapatmasını talimat verno-expect- Expect: mevcutsa istek gövdesini okuma
TFTP İçin
writedelay: [saniye] yanıt paketleri arasında bu miktar kadar gecik (her paket 512 bayt yük olmak üzere)
<client>
<server>
Bu test senaryosunun gerektirdiği/kullandığı sunucu(lar). Mevcut sunucular:
fileftp-ipv6ftpftpsgophergophershttp-ipv6http-proxyhttp-unixhttp/2httphttpshttptls+srp-ipv6httptls+srpimapmqttnonepop3rtsp-ipv6rtspscpsftpsmtpsocks4socks5
Satır başına yalnızca bir sunucu girin. Bu alt bölüm zorunludur.
<features>
Bu testin çalışabilmesi için istemcide/kütüphanede mevcut OLMASI GEREKEN özelliklerin bir listesi. Gerekli bir özellik mevcut değilse test ATLANIR.
Alternatif olarak, bir özelliğin gerekli OLMADIĞINI belirtmek için bir özelliğin önüne ünlem işareti konabilir. Özellik mevcutsa test ATLANIR.
Burada test edilebilir özellikler şunlardır:
alt-svcbearsslc-arescookiescryptodebugDoHgetrlimitGnuTLSGSS-APIh2cHSTSHTTP-authhttp/2idnipv6Kerberoslarge_fileld_preloadlibssh2libssholdlibssh(0.9.4 öncesi sürümler)libzmanualMimenetrcNTLMOpenSSLparsedateproxyPSLrustlsSchannelsectranspshuffle-dnssocksSPNEGOSSLSSLpinningSSPIthreaded-resolverTLS-SRPTrackMemorytypecheckUnicodeunittestunix-socketsverbose-stringswakeupwin32wolfsshwolfssl
curl'ün desteklediği tüm protokollere ek olarak. Bir protokolün yalnızca sunucudan farklıysa belirtilmesi gerekir (sunucu none olduğunda yararlıdır).
<killserver>
<server> ile aynı sözdizimini kullanarak, ancak burada belirtildiğinde bu sunucular bu test senaryosu tamamlandığında açıkça ÖLDÜRÜLÜR. Bunu yalnızca başka alternatif yoksa kullanın. Bunu kullanmak elbette sonraki testlerin sunucuları yeniden başlatmasını gerektirir.
<precheck>
Test betiği tarafından testten önce çalıştırılmak üzere ayarlanan bir komut satırı. Komut tarafından bir çıktı görüntülenirse veya dönüş kodu sıfır değilse, test atlanır ve (tek satırlık) çıktı testi çalıştırmama nedeni olarak görüntülenir.
<postcheck>
Test betiği tarafından testten sonra çalıştırılmak üzere ayarlanan bir komut satırı. Komut sıfır olmayan bir durum koduyla mevcutsa, test başarısız kabul edilir.
<tool>
"curl" yerine çağrılacak aracın adı. Bu araç oluşturulmalı ve libtest/ dizininde (araç adı lib ile başlıyorsa) veya unit/ dizininde (araç adı unit ile başlıyorsa) bulunmalıdır.
<name>
Kısa test senaryosu açıklaması, test çalışırken gösterilir.
<setenv>
variable1=contents1
variable2=contents2
Gerçek komut çalıştırılmadan önce verilen ortam değişkenlerini belirtilen değere ayarlayın. Komut çalıştırıldıktan sonra tekrar temizlenirler.
<command [option="no-output/no-include/force-output/binary-trace"] [timeout="secs"][delay="secs"][type="perl/shell"]>
Çalıştırılacak komut satırı.
Sunucuya iletilen URL'in aslında hangi verilerin döndürüleceğini kontrol ettiğini unutmayın. URL'deki son eğik çizgi bir sayı ile takip edilmelidir. Bu sayı (N), test sunucusu tarafından test senaryosu N'yi yüklemek ve <reply><data></data></reply> bölümünde tanımlanan verileri döndürmek için kullanılır.
Yukarıda test numarası bulunamazsa, HTTP test sunucusu verilen ana bilgisayar adındaki son noktadan sonraki sayıyı kullanır (böylece bir CONNECT yine de test numarasını geçebilir), böylece "foo.bar.123" test senaryosu 123 olarak ele alınır. Alternatif olarak, CONNECT'e bir IPv6 adresi sağlanırsa, adresteki son onaltılık grup test numarası olarak kullanılır. Örneğin "[1234::ff]" adresi test senaryosu 255 olarak ele alınır.
type="perl" ayarlayarak test senaryosunu bir perl betiği olarak yazın. Bu test için bellek hatası ayıklamanın olmadığını ve valgrind'in kapatıldığını ima eder.
type="shell" ayarlayarak test senaryosunu bir kabuk betiği olarak yazın. Bu test için bellek hatası ayıklamanın olmadığını ve valgrind'in kapatıldığını ima eder.
option="no-output" ayarlayarak test betiğinin çıktıyı bir dosyaya yönlendiren --output argümanını eklemesini önleyin. verify/stdout bölümü kullanılıyorsa --output da eklenmez.
option="force-output" ayarlayarak testin stdout'u doğrulamak için yazıldığı durumlarda bile --output kullanımını sağlayın.
option="no-include" ayarlayarak test betiğinin --include argümanını eklemesini önleyin.
option="binary-trace" ayarlayarak izleme için --trace-ascii yerine --trace kullanın. MQTT gibi ikili yönelimli protokoller için uygundur.
timeout="saniye" ayarlayarak varsayılan sunucu günlükleri danışmanı okuma kilidi zaman aşımını geçersiz kılın. Bu zaman aşımı, komut yürütmeyi tamamladıktan sonra test donanımı tarafından test sunucusunun sunucu tarafı günlük dosyalarını yazmasını ve bunları okumamasını tavsiye eden kilidi kaldırmasını beklemek için kullanılır. "Saniye" parametresi, zaman aşımı için negatif olmayan tam sayı saniye sayısıdır. Bu timeout özniteliği bütünlük adına belgelenmiştir, ancak derin test donanımı işidir ve yalnızca belirli test durumları için gereklidir. Kullanmaktan kaçının.
delay="saniye" ayarlayarak komut yürütmeyi tamamladıktan sonra ve <postcheck> bölümü çalışmadan önce bir zaman gecikmesi ekleyin. "Saniye" parametresi, gecikme için negatif olmayan tam sayı saniye sayısıdır. Bu 'delay' özniteliği belirli test durumları için tasarlanmıştır ve normalde gerekli değildir.
<file name="log/filename" [nonewline="yes"]>
Bu, test senaryosu çalıştırılmadan önce bu içerikle adlandırılan dosyayı oluşturur; bu, test senaryosunun üzerinde işlem yapması gereken bir dosyaya ihtiyacı varsa kullanışlıdır.
nonewline="yes" kullanılırsa, oluşturulan dosyanın sonundaki yeni satır soyulur.
<stdin [nonewline="yes"]>
Bu verilen verileri stdin üzerinden araca iletin.
nonewline ayarlanırsa, istemci tarafından gerçekten alınanla karşılaştırmadan önce bu verilen verilerin sondaki yeni satırını keseriz.
<verify>
<errorcode>
curl'ün döndürmesi gereken sayısal hata kodu. Birden fazla sayıyı virgülle ayırarak kabul edilen hata kodlarının bir listesini belirtin. Bir örnek için test 237'ye bakın.
<strip>
Karşılaştırma yapılmadan önce protokol dökümlerinden kaldırılan satır başına bir regex. Bu, port numaraları veya kullanıcı aracısı (user-agent) dizeleri gibi dinamik olarak değişen protokol verilerine olan bağımlılıkları kaldırmak için yararlıdır.
<strippart>
Protokol dökümü üzerinde çalışan satır başına bir perl op. Bu oldukça gelişmiştir. Örnek: s/^EPRT .*/EPRT stripped/.
<protocol [nonewline="yes"]>
curl'ün iletmesi gereken protokol dökümü, nonewline ayarlanırsa, istemci tarafından gerçekten gönderilenle karşılaştırmadan önce bu verilen verilerin sondaki yeni satırını keseriz <strip> ve <strippart> kuralları karşılaştırmalar yapılmadan önce uygulanır.
<proxy [nonewline="yes"]>
curl'ün bir HTTP vekil sunucusuna (http-proxy sunucusu kullanıldığında) iletmesi gereken protokol dökümü, nonewline ayarlanırsa, istemci tarafından gerçekten gönderilenle karşılaştırmadan önce bu verilen verilerin sondaki yeni satırını keseriz <strip> ve <strippart> kuralları karşılaştırmalar yapılmadan önce uygulanır.
<stderr [mode="text"] [nonewline="yes"]>
Bu, bu verilerin stderr'e geçirildiğini doğrular.
Metin/ikili farkı olan platformlarda çıktı metin modundaysa mode="text" özniteliğini kullanın.
nonewline ayarlanırsa, istemci tarafından gerçekten alınanla karşılaştırmadan önce bu verilen verilerin sondaki yeni satırını keseriz.
<stdout [mode="text"] [nonewline="yes"]>
Bu, bu verilerin stdout'a geçirildiğini doğrular.
Metin/ikili farkı olan platformlarda çıktı metin modundaysa mode="text" özniteliğini kullanın.
nonewline ayarlanırsa, istemci tarafından gerçekten alınanla karşılaştırmadan önce bu verilen verilerin sondaki yeni satırını keseriz.
<file name="log/filename" [mode="text"]>
Dosyanın içeriği test tamamlandıktan sonra bununla aynı olmalıdır. Metin/ikili farkı olan platformlarda çıktı metin modundaysa mode="text" özniteliğini kullanın.
<file1>
Daha fazla dosyayı karşılaştırmak için 'file'a 1 ila 4 eklenebilir.
<file2>
<file3>
<file4>
<stripfile>
Çıktı dosyası veya stdout üzerinde çalışan ve test dosyasında saklananla karşılaştırılmadan önce satır başına bir perl op. Bu oldukça gelişmiştir. Örnek: "s/^EPRT .*/EPRT stripped/"
<stripfile1>
İlgili <fileN> içeriğini soymak için stripfile'a 1 ila 4 eklenebilir
<stripfile2>
<stripfile3>
<stripfile4>
<upload>
curl'ün göndermiş olması gereken yükleme verilerinin içeriği
<valgrind>
disable - bu test için valgrind günlük kontrolünü devre dışı bırakır
Testleri derleme (Build tests)
Herhangi bir testi çalıştırmadan önce sadece curl'ü değil, aynı zamanda test paketini ve ilgili araçlarını ve sunucularını da derlemeniz gerekir.
En kolayı, derleme dizini kökünde make test komutunu vererek hepsini derleyip çalıştırabilirsiniz, ancak testler üzerinde daha fazla çalışmak veya belki bir tanesinde hata ayıklamak istiyorsanız, tests dizinine atlayıp oradan çalışmak isteyebilirsiniz. Hepsini derleyin ve test 144'ü şu şekilde çalıştırın:
cd tests
make
./runtests.pl 144
Testleri çalıştırma (Run tests)
Testleri çalıştıran ana betik tests/runtests.pl olarak adlandırılır ve daha yararlı özelliklerinden bazıları şunlardır:
Bir test aralığını çalıştırma
Test 1'den 27'ye kadar çalıştır:
./runtests.pl 1 to 27
Belirli bir kategoriye göre testleri çalıştırma
SFTP olarak işaretlenmiş tüm testleri çalıştır:
./runtests.pl SFTP
FTP olarak işaretlenmemiş tüm testleri çalıştır:
./runtests.pl '!FTP'
Belirli bir testi gdb ile çalıştırma
./runtests.pl -g 144
gdb'yi başlatır, kesme noktaları vb. ayarlayabilirsiniz ve ardından run yazarsınız ve yola çıkar ve tüm işlemi hata ayıklayıcı aracılığıyla gerçekleştirir.
Belirli bir testi valgrind olmadan çalıştırma
Test paketi, bulursa varsayılan olarak valgrind'i kullanır; bu, sorunları bulmak için mükemmel bir yoldur ancak aynı zamanda testin çok daha yavaş çalışmasını sağlar. Bazen daha hızlı yapmak istersiniz:
./runtests.pl -n 144
Hata ayıklama derlemeleri (Debug builds)
Hata ayıklama derlemelerinden bahsettiğimizde, genellikle hata ayıklama kodunun ve sembollerin hala mevcut olduğu curl derlemelerine atıfta bulunuruz. curl geliştirmeyle çalışmak istiyorsanız, test etmeyi ve hata ayıklamayı kolaylaştırdığı için bunu yapmanızı şiddetle tavsiye ederiz.
Configure kullanarak bir hata ayıklama derlemesini şu şekilde yaparsınız:
./configure --enable-debug
Hata ayıklama derlemeleri, runtests.pl ile gdb ile bireysel test durumlarını çalıştırmayı mümkün kılar, bu da kullanışlıdır - özellikle örneğin bir yerde çökmesini sağlayabilirseniz, o zaman gdb onu yakalayabilir ve tam olarak nerede olduğunu vb. gösterebilir.
Hata ayıklama derlemeleri ayrıca normal sürüm derlemelerinden biraz farklıdır çünkü curl'ü test etmeyi kolaylaştıran bazı kod parçacıkları içerirler. Örneğin test paketinin rastgele sayı üretecini geçersiz kılmasına izin verir, böylece aksi takdirde rastgele olan değerler için test yapmak gerçekten çalışır. Ayrıca, birim testleri yalnızca hata ayıklama derlemelerinde çalışır.
Memdebug
Hata ayıklama derlemeleri ayrıca memdebug dahili bellek izleme ve hata ayıklama sistemini de etkinleştirir.
Açıldığında, memdebug sistemi bellekle ilgili birçok seçenek hakkında ayrıntılı bilgiyi bir günlük dosyasına çıkarır, böylece olaydan sonra analiz edilebilir ve doğrulanabilir. Tüm belleğin serbest bırakıldığı, tüm dosyaların kapatıldığı vb. doğrulandı.
Bu, valgrind'in fakir adam versiyonudur ancak özellikleriyle hiç kıyaslanamaz. Ancak oldukça taşınabilir ve düşük etkilidir.
Bir hata ayıklama derlemesinde, CURL_MEMDEBUG ortam değişkeni günlük için kullanılan bir dosya adına ayarlanmışsa memdebug sistemi curl tarafından etkinleştirilir. Test paketi bu değişkeni bizim için ayarlar (bkz. tests/log/memdump) ve varsa her test çalışmasından sonra doğrular.
Test sunucuları (Test servers)
curl test paketinin büyük bir kısmı, test sırasında sadece test amaçlı olarak yerel makinede başlatılan ve test turunun sonunda tekrar kapatılan sunucularla etkileşime giren curl komut satırlarını çalıştırır.
Test sunucuları, bu amaçla yazılmış ve HTTP, FTP, IMAP, POP3, SMTP, TFTP, MQTT, SOCKS vekil sunucuları ve daha fazlasını konuşan özel sunuculardır.
Tüm test sunucuları test dosyası aracılığıyla kontrol edilir: her test senaryosunun çalışması için hangi sunuculara sahip olması gerektiği, ne döndürmeleri gerektiği ve her test için nasıl davranmaları gerektiği.
Test sunucuları eylemlerini tipik olarak tests/log içindeki özel dosyalara kaydeder ve testiniz istediğiniz gibi davranmıyorsa kontrol etmek yararlı olabilir.
curl testleri
Paketteki standart test "curl testi"dir. Hepsi bir curl komut satırını çağırır ve gönderdiği, geri aldığı ve döndürdüğü her şeyin tam olarak beklendiği gibi olduğunu doğrular. Herhangi bir uyuşmazlık durumunda test başarısız kabul edilir ve betik hata hakkındaki ayrıntıları gösterir.
<client><command> bölümünde testin içerdiği şey, komut satırında kullanılan şeydir, kelimesi kelimesine.
tests/log/commands.log, testte çalıştırılan tam komut satırını içerdiği için bir çalışmadan sonra bakmak için kullanışlıdır.
curl komut satırı aracını çağırmayan bir test yapmak istiyorsanız, bunun yerine libcurl testlerini veya birim testlerini düşünmelisiniz.
libcurl testleri
Bir libcurl testi, bir şeyler yapmak için genel libcurl API'sini kullanan bağımsız bir C programıdır.
Bunun dışında, diğer her şey test edilir, doğrulanır ve curl testlerinin olduğu gibi kontrol edilir.
Bu C programları genellikle çok sayıda farklı platformda oluşturulup çalıştırıldığından, hususların dikkate alınması gerekebilir.
Tüm libcurl test programları tests/libtest içinde tutulur
Birim testleri (Unit tests)
Birim testleri yalnızca hata ayıklama derlemelerinde çalışır.
Birim testleri, libcurl dahili olan ve bu nedenle herhangi bir genel API, başlık veya harici belgeden parçası olmayan işlevleri kullanan testlerdir.
Test etmek istediğiniz dahili işlev static yapılmışsa, bunun yerine UNITTEST olarak ayarlanmalıdır - bu daha sonra hata ayıklama derlemelerinin bunlar için static kullanmamasını sağlar ve böylece birim testlerinden test edilmek üzere erişilebilir hale gelirler.
Birim testleri için bunları hızlı ve kolay yazmayı sağlamak üzere bir dizi kolaylık işlevi ve makrosu sağlıyoruz.
Tüm birim test programları tests/unit içinde tutulur
Valgrind
Valgrind, programlarda hata ayıklamak ve özellikle bellek kullanımlarını ve suiistimallerini bulmak için popüler ve güçlü bir araçtır.
runtests.pl, sisteminizde valgrind'in kurulu olup olmadığını otomatik olarak algılar ve varsayılan olarak bulunursa valgrind kullanarak testleri çalıştırır. Valgrind kullanımını devre dışı bırakmak için runtests'e -n geçirebilirsiniz.
Valgrind yürütmeyi çok daha yavaşlatır, ancak bellek sızıntılarını ve başlatılmamış bellek kullanımını bulmak için mükemmel bir araçtır.
Sürekli Entegrasyon (Continuous Integration)
GitHub'daki curl projesine gönderilen her çekme isteği (pull request) için ve git deposundaki master dalına itilen (push) her taahhüt (commit) için, çok sayıda sanal makine çalışır, o kodu git'ten kontrol eder (check out), farklı seçeneklerle derler ve test paketini çalıştırır ve her şeyin iyi çalıştığından emin olur.
Linux, macOS, Windows, Solaris ve FreeBSD dahil olmak üzere çeşitli farklı işletim sistemlerinde CI işleri çalıştırıyoruz.
Birçok farklı arka ucu (ve bunların kombinasyonlarını) oluşturan ve test eden işler çalıştırıyoruz.
Farklı oluşturma yollarını kullanan işlerimiz var: autotools, cmake, Visual Studio, vb.
Dağıtım tarball'ının çalıştığını doğrularız.
Kaynak kodu çözümleyicileri çalıştırırız.
Başarısız derlemeler
Ne yazık ki, dahil olan her şeyin karmaşıklığı nedeniyle genellikle "kalıcı başarısız" (permafailing) gibi görünen, işleri kalıcı olarak başarısızlığa uğratan bir veya iki CI işine sahibiz.
Onları öyle yapmamak için çok çalışıyoruz, ancak bu zor bir iş ve aksi takdirde tamamen yeşil olması gereken değişiklikler için bile sık sık kırmızı derlemeler görüyoruz.
Otomatik derlemeler (Autobuilds)
Gönüllü bireyler otomatik derlemeleri (autobuilds) çalıştırır. Bu, otomatik olarak çalışan bir betiktir:
- en son kodu git deposundan kontrol eder (check out)
- her şeyi derler
- test paketini çalıştırır
- tam günlüğü e-posta üzerinden curl sunucusuna gönderir
Daha sonra farklı derleme seçenekleriyle farklı platformlarda çalıştırıldıkları için, curl derleme sağlığı hakkında ekstra bir geri bildirim boyutu sunarlar.
Durumu kontrol et
Tüm günlükler ayrıştırılır, yönetilir ve curl sitesinde görüntülenir.
Miras (Legacy)
Otomatik derleme sistemini 2003 yılında, CI işlerinin ciddi bir alternatif olmaya başlamasından on yıl önce başlattık.
Şimdi, otomatik derlemeler daha çok bir miras sistemidir çünkü CI ve daha doğrudan ve daha erken geri bildirim dünyasına daha fazla geçiyoruz.
İşkence (Torture)
curl hata ayıklama etkin olarak oluşturulduğunda, özel bir test türü sunar. İşkence testleri dediğimiz testler. Endişelenmeyin, kulağa geldiği kadar korkunç değildir.
libcurl ve curl çıkış yollarının herhangi bir çökme veya bellek sızıntısı olmadan çalıştığını doğrularlar,
İşkence testleri şu şekilde çalışır:
- tek testi önce olduğu gibi çalıştır
- çağrılan hata verebilir (fallible) işlevlerin sayısını say
- testi her hata verebilir işlev çağrısı için bir kez yeniden çalıştır
- her hata verebilir işlev çağrısını birer birer hata döndürmeye zorla
- sızıntı veya çökme olmadığını doğrula
- tüm hata verebilir işlevler başarısız olmaya zorlanana kadar devam et
Bu test yöntemi ciddi anlamda uzun zaman alabilir. Bunu denerken valgrind'i kapatmanızı tavsiye ederim.
Belirli bir hatayı yeniden çalıştır
Tek bir test başarısız olursa, runtests.pl sorunu tetikleyen "turu" tam olarak tanımlar ve gösterildiği gibi -t kullanarak, çağrıldığında yalnızca o belirli hata verebilir işlevi başarısız kılan bir komut satırını çalıştırabilirsiniz.
Sığ (Shallow)
Bu test yöntemini biraz daha pratik hale getirmek için test paketi ayrıca bir --shallow seçeneği sunar. Bu, kullanıcının test senaryosu başına başarısız olacak maksimum hata verebilir işlev sayısını ayarlamasına olanak tanır. Bu değerle ayarlanandan daha fazla başarısız olacak çağrı varsa, betik hangilerinin başarısız olacağını rastgele seçer.
Özel bir özellik olarak, testlerde bir şeyleri rastgele hale getirmek rahatsız edici olabileceğinden, betik yıl + aya dayalı rastgele bir tohum (seed) kullanır, böylece her takvim ayı için aynı kalır. Kullanışlıdır, çünkü aynı testi aynı --shallow değeriyle yeniden çalıştırırsanız aynı rastgele testleri çalıştırır.
Runtests'in --seed seçeneğiyle farklı bir tohumu zorlayabilirsiniz.
Dizin
A
- ALPN: Tüm seçenekler
- --alt-svc: Etkinleştirme
- --anyauth: Kimlik Doğrulama
- --append: trurl örnek komut satırları, FTP ve SFTP yüklemeleri, FTP ile yükleme
- apt: Ubuntu ve Debian
- Aralıklar: Sayısal aralıklar, Devam ettirme ve aralıklar, Bir aralık hilesi, Aralıklar (Ranges), Aralıklar (Ranges)
- Arch Linux: Arch Linux
- AWS sigv4: AWS sigv4
- --aws-sigv4: AWS sigv4
B
- -b: Çerez motoru, Çerezleri dosyadan okuma, Çerezleri dosyaya yazma, Yeni çerez oturumu, Web girişleri ve oturumları
- Bağlantı havuzu: Bağlantı yeniden kullanımı, Bağlantı önbelleği, havuz boyutu, Bağlantı yeniden kullanımı (Connection reuse), bağlantı önbelleği (connection cache)
- Bağlantı önbelleği: Bağlantı yeniden kullanımı, Mevcut --write-out değişkenleri, Bağlantı önbelleği, Bağlantı yeniden kullanımı (Connection reuse), Multi handle, bağlantı önbelleği (connection cache), connectdata
- Bağlantı yeniden kullanımı: Bağlantı yeniden kullanımı, Bağlantı önbelleği, iş parçacıkları (threads), Bağlantı yeniden kullanımı (Connection reuse)
- Bağlayıcılar:
rpath - --basic: Kimlik Doğrulama
- Başlık geri çağırımı: Tüm seçenekler, Başlık verileri (Header data), Yanıt gövdesi
- BearSSL: lib/vtls, TLS kütüphaneleri,
<features> - BoringSSL: TLS kütüphaneleri, BoringSSL, Kısıtlamalar, HTTP/3 arka uçları
- brotli: HTTP Sıkıştırma, Sürüm, Hangi libcurl sürümü çalışıyor, İçerik kodlamaları hakkında, Koşullu satırlar (Conditional lines)
C
- -c: Çerezleri dosyaya yazma, Web girişleri ve oturumları
- c-ares: c-ares, Satır 4: Özellikler (Features), c-ares ile isim çözümleme hileleri, Ad çözümleyici arka uçları,
CURLRES_ARES,<features> - C89: Yorumlar
- CA: Mevcut çıkış kodları, MITM vekil sunucusu, Sunucu sertifikalarını doğrulama, Önbellekler, CA deposu önbelleğe alma, Doğrulama, Tüm seçenekler, Mevcut bilgiler, CA deposu önbelleği (CA store cache)
- --ca-native: Yerel CA depoları
- Canlı tutma: Bağlantı yeniden kullanımı, Canlı tutma (Keep alive), Tüm seçenekler, Canlı tutma (Keep alive)
- Çerez motoru: Çerez motoru, Çerezleri dosyaya yazma, Çerez motoru
- Çerezler: Çerezleri dosyadan okuma, Çerezler (Cookies), Kimlik Doğrulama, Çerezler (Cookies), HTTP üzerinden bir giriş formu gönder (Submit a login form over HTTP), Çerezler (Cookies), Curl_share
- Chrome: curl olarak kopyala, SSLKEYLOGFILE
- clone: MSYS2 üzerinde libcurl derleme, git, Web sitesi, boringssl derleme
- code of conduct: Güven, Davranış Kuralları (Code of Conduct)
- --compressed: Gzip ile sıkıştırılmış transferler, Sıkıştırma (Compression), curl arayüzü
- --compressed-ssh: SFTP/SCP için
- configure: kök (root), Derleme seçeneklerini yönetme, Platforma bağımlı kod, Autotools,
rpath, configure, curl'ün configure betiği tarafından algılanması için derleme ağacını ayarlama, Ifdefs, Bellek hata ayıklama (Memory debugging), Hata ayıklama derlemeleri (Debug builds) - --connect-timeout: Bağlantı zaman aşımı, Bağlanmak için asla bundan fazlasını harcama
- --connect-to: Bir yedek isim sağlayın
- copyright: Lisans
- curl-announce: curl-announce
- curl-library: curl-library, Posta listesi için bir yama yapın, Güvenlik açığı yönetimi
- curl-users: curl-users, Güvenlik açığı yönetimi
- <curl/curl.h>: include/curl, Başlık dosyaları (Header files), --libcurl, Yavaş transferleri durdurma, Hız sınırı (Rate limit), İlerleme ölçer (Progress meter), Dosyaları dahil et (Include files), Basit bir HTTP sayfası al (Get a simple HTTP page), Belleğe bir yanıt al (Get a response into memory), HTTP üzerinden bir giriş formu gönder (Submit a login form over HTTP), Bir FTP dizin listesi al (Get an FTP directory listing), Bloklamayan HTTP form-post (Non-blocking HTTP form-post)
- CURLE_ABORTED_BY_CALLBACK: İlerleme bilgisi (Progress information)
- CURLHSTS_ENABLE: Bir handle için HSTS'yi etkinleştir
- CURLINFO_CERTINFO: Mevcut bilgiler
- CURLINFO_CONN_ID: Transfer ve bağlantı tanımlayıcıları, Mevcut bilgiler
- CURLINFO_CONTENT_TYPE: Transfer sonrası bilgi
- CURLINFO_EFFECTIVE_URL: Mevcut bilgiler
- CURLINFO_FILETIME: Mevcut bilgiler
- CURLINFO_TOTAL_TIME_T: Mevcut bilgiler
- CURLINFO_XFER_ID: Transfer ve bağlantı tanımlayıcıları, Mevcut bilgiler
- CURLMOPT_PIPELINING: Çoğullama (Multiplexing)
- CURLMOPT_SOCKETFUNCTION: socket_callback
- CURLMOPT_TIMERFUNCTION: timer_callback, Uygulamalara yalnızca tek bir zaman aşımı sunar
- CURLOPT_ALTSVC: Tüm seçenekler, Etkinleştir
- CURLOPT_ALTSVC_CTRL: Tüm seçenekler, Etkinleştir
- CURLOPT_CA_CACHE_TIMEOUT: CA sertifika önbelleği, Tüm seçenekler
- CURLOPT_CLOSESOCKETFUNCTION: Tüm seçenekler, Soket kapatma geri çağırımı
- CURLOPT_CONNECTTIMEOUT: Tüm seçenekler, easy API
- CURLOPT_COOKIE: Tüm seçenekler, Özel çerezleri ayarlama
- CURLOPT_COOKIEFILE: Tüm seçenekler, Okuma ile çerez motorunu etkinleştir, HTTP üzerinden bir giriş formu gönder (Submit a login form over HTTP)
- CURLOPT_COOKIEJAR: Tüm seçenekler, Yazma ile çerez motorunu etkinleştir
- CURLOPT_COOKIELIST: Tüm seçenekler, Çerez deposuna bir çerez ekle
- CURLOPT_CURLU: Tüm seçenekler, CURLOPT_CURLU
- CURLOPT_CUSTOMREQUEST: Tüm seçenekler, İstek yöntemi
- CURLOPT_DEBUGDATA: Her şeyi izle, Tüm seçenekler, Hata ayıklama (Debug)
- CURLOPT_DEBUGFUNCTION: Her şeyi izle, Tüm seçenekler, Hata ayıklama (Debug)
- CURLOPT_DNS_CACHE_TIMEOUT: DNS önbelleği, Tüm seçenekler, Önbelleğe alma
- CURLOPT_DNS_INTERFACE: Tüm seçenekler, Ad sunucusu seçenekleri
- CURLOPT_DNS_LOCAL_IP4: Tüm seçenekler, Ad sunucusu seçenekleri
- CURLOPT_DNS_LOCAL_IP6: Tüm seçenekler, Ad sunucusu seçenekleri
- CURLOPT_DNS_SERVERS: Tüm seçenekler, Ad sunucusu seçenekleri
- CURLOPT_DNS_USE_GLOBAL_CACHE: Tüm seçenekler, Küresel DNS önbelleği yok
- CURLOPT_ERRORBUFFER: --libcurl, CURLcode dönüş kodları, Tüm seçenekler
- CURLOPT_FAILONERROR: Tüm seçenekler, HTTP yanıt kodu "hataları" hakkında
- CURLOPT_HEADER: Tüm seçenekler, Veri yazma (Write data), Yönlendiren (Referrer), Başlıkları da indir
- CURLOPT_HEADERDATA: --libcurl, Tüm seçenekler, Başlık verileri (Header data), Başlıkları da indir
- CURLOPT_HEADERFUNCTION: --libcurl, Tüm seçenekler, Başlık verileri (Header data)
- CURLOPT_HSTS: Tüm seçenekler, Bir HSTS önbellek dosyası ayarla
- CURLOPT_HSTS_CTRL: Tüm seçenekler, Bir handle için HSTS'yi etkinleştir
- CURLOPT_HTTPGET: Tüm seçenekler, İndirme (Download), HTTP üzerinden bir giriş formu gönder (Submit a login form over HTTP)
- CURLOPT_HTTPHEADER: Tüm seçenekler, Bir başlık ekle, HTTP PUT, Bloklamayan HTTP form-post (Non-blocking HTTP form-post)
- CURLOPT_HTTPPOST: Tüm seçenekler
- CURLOPT_IPRESOLVE: Tüm seçenekler, libcurl nasıl bağlanır (How libcurl connects), Ad çözme (Name resolving)
- CURLOPT_LOCALPORT: Tüm seçenekler, Yerel port numarası
- CURLOPT_LOCALPORTRANGE: Tüm seçenekler, Yerel port numarası
- CURLOPT_LOW_SPEED_LIMIT: Tüm seçenekler, easy API, Yavaş transferleri durdurma
- CURLOPT_LOW_SPEED_TIME: Tüm seçenekler, easy API, Yavaş transferleri durdurma
- CURLOPT_MAXFILESIZE_LARGE: Sayısal seçenekleri ayarla, Tüm seçenekler
- CURLOPT_MAXREDIRS: --libcurl, Tüm seçenekler
- CURLOPT_MIMEPOST: Tüm seçenekler, HTTP çok parçalı form gönderileri (multipart formposts), Bloklamayan HTTP form-post (Non-blocking HTTP form-post)
- CURLOPT_NOBODY: Tüm seçenekler, İstek yöntemi
- CURLOPT_NOPROGRESS: --libcurl, Tüm seçenekler, İlerleme bilgisi (Progress information), İlerleme ölçer (Progress meter)
- CURLOPT_OPENSOCKETDATA: Tüm seçenekler, Bir dosya tanımlayıcısı (file descriptor) sağla
- CURLOPT_OPENSOCKETFUNCTION: Tüm seçenekler, Bir dosya tanımlayıcısı (file descriptor) sağla
- CURLOPT_PIPEWAIT: Tüm seçenekler, Çoğullama (Multiplexing)
- CURLOPT_POST: Tüm seçenekler, HTTP POST
- CURLOPT_POSTFIELDS: Dize (string) seçeneklerini ayarla, Tüm seçenekler, İstek yöntemi, HTTP POST, HTTP üzerinden bir giriş formu gönder (Submit a login form over HTTP)
- CURLOPT_POSTFIELDSIZE: Tüm seçenekler, HTTP POST
- CURLOPT_POSTREDIR: Yönlendirmelerde hangi yöntemin kullanılacağına karar verin, Tüm seçenekler
- CURLOPT_PROGRESSFUNCTION: Tüm seçenekler, İlerleme bilgisi (Progress information)
- CURLOPT_PROXY: Tüm seçenekler, Proxy türleri
- CURLOPT_PROXYPORT: Tüm seçenekler, Proxy türleri
- CURLOPT_PROXYTYPE: Tüm seçenekler, Proxy türleri
- CURLOPT_READDATA: --libcurl, Tüm seçenekler, Veri okuma (Read data)
- CURLOPT_READFUNCTION: --libcurl, Tüm seçenekler, Veri okuma (Read data), HTTP POST
- CURLOPT_RESOLVE: Tüm seçenekler, Ana bilgisayarlar için özel adresler
- CURLOPT_SEEKDATA: --libcurl, Tüm seçenekler, Arama ve ioctl (Seek and ioctl)
- CURLOPT_SEEKFUNCTION: --libcurl, Tüm seçenekler, Arama ve ioctl (Seek and ioctl)
- CURLOPT_SOCKOPTDATA: Tüm seçenekler, sockopt
- CURLOPT_SOCKOPTFUNCTION: Tüm seçenekler, sockopt
- CURLOPT_SSH_KNOWNHOSTS: --libcurl, Tüm seçenekler, SSH anahtarı
- CURLOPT_SSLVERSION: Protokol sürümü, Tüm seçenekler
- CURLOPT_SSL_VERIFYHOST: Doğrulama, Tüm seçenekler
- CURLOPT_SSL_VERIFYPEER: Doğrulama, Tüm seçenekler
- CURLOPT_STDERR: --libcurl, Ayrıntılı operasyonlar, Tüm seçenekler
- CURLOPT_TCP_KEEPALIVE: --libcurl, Tüm seçenekler, Canlı tutmayı etkinleştir
- CURLOPT_TCP_KEEPCNT: Sonda sayısı (Probe count)
- CURLOPT_TCP_KEEPIDLE: Tüm seçenekler, Boşta kalma süresi (Idle time)
- CURLOPT_TCP_KEEPINTVL: Tüm seçenekler, Sonda aralığı (Probe interval)
- CURLOPT_TIMEOUT: Sayısal seçenekleri ayarla, Tüm seçenekler, easy API
- CURLOPT_TLSAUTH_USERNAME: TLS yetkilendirmesi, Tüm seçenekler
- CURLOPT_UPLOAD: Tüm seçenekler, İstek yöntemi, HTTP PUT
- CURLOPT_URL: --libcurl, Dizeler C++ dize nesneleri değil, C dizeleridir, Easy handle, Dize (string) seçeneklerini ayarla, Tüm seçenekler, Örnek, Yavaş transferleri durdurma, Hız sınırı (Rate limit), İlerleme ölçer (Progress meter), İstek yöntemi, Bearer, İndirme (Download), HTTP PUT, Basit bir HTTP sayfası al (Get a simple HTTP page), Belleğe bir yanıt al (Get a response into memory), HTTP üzerinden bir giriş formu gönder (Submit a login form over HTTP), Bir FTP dizin listesi al (Get an FTP directory listing), Bloklamayan HTTP form-post (Non-blocking HTTP form-post)
- CURLOPT_USERAGENT: --libcurl, Tüm seçenekler, Belleğe bir yanıt al (Get a response into memory)
- CURLOPT_VERBOSE: Ayrıntılı operasyonlar, Tüm seçenekler, Ada göre belirli bir seçeneği bul, Bağlantılar istediğiniz gibi yeniden kullanılmadığında, Başlıkları da indir, Bloklamayan HTTP form-post (Non-blocking HTTP form-post)
- CURLOPT_WRITEDATA: --libcurl, Geri çağırım (Callback) hususları, Tüm seçenekler, Veri yazma (Write data), Belleğe bir yanıt al (Get a response into memory)
- CURLOPT_WRITEFUNCTION: --libcurl, Geri çağırım (Callback) hususları, Tüm seçenekler, Veri yazma (Write data), Belleğe bir yanıt al (Get a response into memory)
- CURLOPT_XFERINFODATA: Tüm seçenekler, İlerleme bilgisi (Progress information)
- CURLOPT_XFERINFOFUNCTION: Tüm seçenekler, İlerleme bilgisi (Progress information)
- CURLUPART_FRAGMENT: URL parçalarını al (Get URL parts), URL parçalarını ayarla (Set URL parts)
- CURLUPART_HOST:
CURLU_PUNYCODE, URL parçalarını al (Get URL parts), URL parçalarını ayarla (Set URL parts) - CURLUPART_PASSWORD: URL parçalarını al (Get URL parts), URL parçalarını ayarla (Set URL parts)
- CURLUPART_PATH: URL parçalarını al (Get URL parts), URL parçalarını ayarla (Set URL parts)
- CURLUPART_PORT: URL parçalarını al (Get URL parts), URL parçalarını ayarla (Set URL parts)
- CURLUPART_QUERY: URL parçalarını al (Get URL parts), URL parçalarını ayarla (Set URL parts), Sorguya ekle (Append to the query)
- CURLUPART_USER: URL parçalarını al (Get URL parts), URL parçalarını ayarla (Set URL parts)
- curl_easy_cleanup: --libcurl, Yavaş transferleri durdurma, Hız sınırı (Rate limit), İlerleme ölçer (Progress meter), easy handle, Bearer, Yazma ile çerez motorunu etkinleştir, Başlık yapısı (Header struct), Basit bir HTTP sayfası al (Get a simple HTTP page), Belleğe bir yanıt al (Get a response into memory), HTTP üzerinden bir giriş formu gönder (Submit a login form over HTTP), Bir FTP dizin listesi al (Get an FTP directory listing), Bloklamayan HTTP form-post (Non-blocking HTTP form-post)
- curl_easy_getinfo: docs/libcurl/opts, Transfer ve bağlantı tanımlayıcıları, Transfer sonrası bilgi, Yanıt meta verileri, Çerez deposundan tüm çerezleri al
- curl_easy_init: --libcurl, Easy handle, Örnek, Yavaş transferleri durdurma, Hız sınırı (Rate limit), İlerleme ölçer (Progress meter), Bearer, İndirme (Download), CURLOPT_CURLU, Basit bir HTTP sayfası al (Get a simple HTTP page), Belleğe bir yanıt al (Get a response into memory), HTTP üzerinden bir giriş formu gönder (Submit a login form over HTTP), Bir FTP dizin listesi al (Get an FTP directory listing), Bloklamayan HTTP form-post (Non-blocking HTTP form-post)
- curl_easy_option_by_id: Kimliğe göre belirli bir seçeneği bul
- curl_easy_option_by_next: Tüm seçenekler üzerinde yinele
- curl_easy_perform: --libcurl, Easy ile yürütme, Easy API havuzu, Örnek, Önbelleğe alma, easy API, Yavaş transferleri durdurma, Hız sınırı (Rate limit), İlerleme ölçer (Progress meter), Bir başlık ekle, Bearer, İndirme (Download), Basit bir HTTP sayfası al (Get a simple HTTP page), Belleğe bir yanıt al (Get a response into memory), HTTP üzerinden bir giriş formu gönder (Submit a login form over HTTP), Bir FTP dizin listesi al (Get an FTP directory listing), Her şey multi'dir (Everything is multi)
- curl_easy_reset: Yeniden kullanım (Reuse)
- curl_easy_setopt: docs/libcurl/opts, --libcurl, CURLcode dönüş kodları, Ayrıntılı operasyonlar, Dizeler C++ dize nesneleri değil, C dizeleridir, Easy handle, Sayısal seçenekleri ayarla, Dize (string) seçeneklerini ayarla, TLS seçenekleri, Tüm seçenekler, Veri yazma (Write data), Veri okuma (Read data), İlerleme bilgisi (Progress information), Başlık verileri (Header data), Hata ayıklama (Debug), sockopt, Bir dosya tanımlayıcısı (file descriptor) sağla, Örnek, Ad çözme (Name resolving), Yavaş transferleri durdurma, Hız sınırı (Rate limit), İlerleme ölçer (Progress meter), İstek yöntemi, Aralıklar (Ranges), Kullanıcı adı ve şifre, Okuma ile çerez motorunu etkinleştir, İndirme (Download), HTTP POST, Çoğullama (Multiplexing), Bir handle için HSTS'yi etkinleştir, Etkinleştir, Easy handle'lar arasında paylaşım, CURLOPT_CURLU, Basit bir HTTP sayfası al (Get a simple HTTP page), Belleğe bir yanıt al (Get a response into memory), HTTP üzerinden bir giriş formu gönder (Submit a login form over HTTP), Bir FTP dizin listesi al (Get an FTP directory listing), Bloklamayan HTTP form-post (Non-blocking HTTP form-post), libcurl arayüzü
- curl_global_cleanup: Küresel başlatma (Global initialization), Belleğe bir yanıt al (Get a response into memory), Bir FTP dizin listesi al (Get an FTP directory listing)
- curl_global_init: Küresel başlatma (Global initialization), Belleğe bir yanıt al (Get a response into memory), Bir FTP dizin listesi al (Get an FTP directory listing), Init çağrıları
- curl_global_trace: Daha fazlasını izle
- CURL_IPRESOLVE_V6: Ad çözme (Name resolving)
- CURL_MAX_WRITE_SIZE: Veri yazma (Write data)
- curl_mime_addpart: HTTP çok parçalı form gönderileri (multipart formposts), Bloklamayan HTTP form-post (Non-blocking HTTP form-post)
- curl_mime_filedata: HTTP çok parçalı form gönderileri (multipart formposts), Bloklamayan HTTP form-post (Non-blocking HTTP form-post)
- curl_mime_init: HTTP çok parçalı form gönderileri (multipart formposts), Bloklamayan HTTP form-post (Non-blocking HTTP form-post)
- curl_mime_name: HTTP çok parçalı form gönderileri (multipart formposts), Bloklamayan HTTP form-post (Non-blocking HTTP form-post)
- curl_multi_add_handle: Multi ile yürütme, Çok sayıda easy handle, Bloklamayan HTTP form-post (Non-blocking HTTP form-post), Curl_multi
- curl_multi_cleanup: Multi API, Bloklamayan HTTP form-post (Non-blocking HTTP form-post)
- curl_multi_fdset: Multi ile yürütme, Curl_easy
- curl_multi_info_read: Tek bir transfer ne zaman biter?, Ne zaman biter?, Multi API, Curl_multi
- curl_multi_init: Multi ile yürütme, Bloklamayan HTTP form-post (Non-blocking HTTP form-post)
- curl_multi_remove_handle: Multi ile yürütme, Çok sayıda easy handle, multi API, Multi API
- curl_multi_setopt: docs/libcurl/opts, Multi ile yürütme, socket_callback, Çoğullama (Multiplexing)
- curl_multi_socket_action:
curl_multi_socket_action, socket_callback - curl_multi_timeout: Multi ile yürütme, Uygulamalara yalnızca tek bir zaman aşımı sunar
- curl_multi_wait: Multi ile yürütme
- curl_off_t: Transfer ve bağlantı tanımlayıcıları, Sayısal seçenekleri ayarla, İlerleme bilgisi (Progress information), Arama ve ioctl (Seek and ioctl), Hız sınırı (Rate limit), Mevcut bilgiler, Yanıt meta verileri, HTTP PUT, Meta,
curl_ws_send() - CURL_SOCKET_TIMEOUT: timer_callback
- CURL_SSL_BACKEND: Satır 1: TLS sürümleri, Çoklu TLS arka uçları
- curl_url: Dosyaları dahil et (Include files), Oluştur, temizle, çoğalt (Create, cleanup, duplicate), Bir URL'yi ayrıştır (Parse a URL), URL'ye yönlendir (Redirect to URL), Parçaları güncelle, CURLOPT_CURLU
- curl_url_cleanup: Oluştur, temizle, çoğalt (Create, cleanup, duplicate)
- curl_url_dup: Oluştur, temizle, çoğalt (Create, cleanup, duplicate)
- curl_url_get:
CURLU_ALLOW_SPACE, Bir URL al (Get a URL), URL parçalarını al (Get URL parts) - curl_url_set: Dosyaları dahil et (Include files), Bir URL'yi ayrıştır (Parse a URL), URL'ye yönlendir (Redirect to URL), URL parçalarını ayarla (Set URL parts), Sorguya ekle (Append to the query), CURLOPT_CURLU
- curl_version_info: Hangi libcurl sürümü çalışıyor, Destek (Support)
D
- -d: Seçeneklere verilen argümanlar, URL başına ayrı seçenekler, POST, MQTT, Yöntem (Method), Basit POST, Content-Type, İkili (Binary) gönderme, GET'e dönüştürme, Expect 100-continue, Parçalı (Chunked) kodlanmış POST'lar, Gizli form alanları, -d vs -F, HTTP PUT, Web girişleri ve oturumları
- --data: Seçeneklere verilen argümanlar, URL başına ayrı seçenekler, POST, Basit POST, URL kodlanmış veri
- --data-binary: Mükemmel değil, Basit POST, İkili (Binary) gönderme, JSON, URL kodlanmış veri
- --data-urlencode: Sorgu (Query), URL kodlanmış veri, GET'e dönüştürme
- debian: Ubuntu ve Debian, Sürüm
- Debug callback: Ayrıntılı operasyonlar
- DICT: curl hangi protokolleri destekler?, DICT, Şema olmadan, Sürüm, DICT,
CURLU_GUESS_SCHEME
E
- Edge: curl olarak kopyala
- ephemeral port: Yerel port numarası
- ETag: Koşullular (Conditionals)
- --etag-compare: İçeriğin değiştirilmesine göre kontrol et
- --etag-save: İçeriğin değiştirilmesine göre kontrol et
- /etc/hosts: Yerel bir klon çalıştırın, Ana bilgisayar (Host), hosts dosyasını düzenleyin
- etiquette: E-posta listesi görgü kuralları
- event-driven: multi_socket ile yürütme
F
- -F: Mükemmel değil, multipart formpost, Yöntem (Method), Böyle bir formu curl ile gönderme, -d vs -F
- --fail: Mevcut çıkış kodları, HTTP yanıt kodları
- --fail-with-body: HTTP yanıt kodları
- Firefox: curl olarak kopyala, Vekil sunucunuzu keşfedin, SSLKEYLOGFILE
- Fragment: Sorgu (Query), Bölüm (Fragment), Mevcut --write-out değişkenleri, Parça (Fragment), Tam parça vs kısmi (Full fragment vs partial)
- --ftp-method: multicwd
- --ftp-pasv: Pasif bağlantılar
- --ftp-port: Mevcut çıkış kodları, Aktif bağlantılar
- --ftp-skip-pasv-ip: Pasif bağlantılar
- FTPS: curl hangi protokolleri destekler?, FTPS, TLS kütüphaneleri, Desteklenen şemalar, Ağ sızıntısı, Sürüm, İzleme seçenekleri (Trace options), Yüklemeye izin veren protokoller, TLS'yi etkinleştirme, FTPS, Değişkenler (Variables)
G
- Gelecek: Gelecek, kök (root), Daha fazla veri, Daha fazlasını izle, Ağ veri dönüşümü
- Geliştirme: Proje iletişimi, curl-users, Hata bildirme, Ticari destek, Geliştirme, Geliştirme ekibi, Gelecek, Ubuntu ve Debian, macOS için libcurl edinin, İçeriye neyin gireceğine kim karar verir?, Safari'den, Bir tarayıcının ne gönderdiğini anlama, Bir web formunu dönüştürme, Doğrulama, Başlıkları da indir
- --get: trurl örnek komut satırları, GET'e dönüştürme
- git: Günlük anlık görüntüler (snapshots), Arka kapılar (Backdoors) ve tedarik zinciri riskleri, MSYS2 üzerinde libcurl derleme, kök (root), git, Web sitesi, boringssl derleme, Sürekli Entegrasyon (Continuous Integration), Otomatik derlemeler (Autobuilds)
- Globbing: URL globbing, Globbing, Zaten yapılmışsa indirmeyi atla, FTP ile yükleme
- GnuTLS: lib/vtls, TLS arka ucunu seçin, TLS kütüphaneleri, Yerel CA depoları, OCSP zımbalama (OCSP stapling), Kısıtlamalar, HTTP/3 arka uçları,
<features> - Gopher: Nasıl başladı, curl hangi protokolleri destekler?, GOPHER, Desteklenen şemalar, Sürüm, Değişkenler (Variables)
- GOPHERS: curl hangi protokolleri destekler?, GOPHERS, Desteklenen şemalar, Değişkenler (Variables)
- Güvenlik: trurl, bir URL aracı, curl-announce, Ticari destek, Güvenlik, Güven, Güvenlik, Protokoller ne kadar değişir?, FTPS, docs, Güvenlik açıklarını bildirme, Mevcut çıkış kodları, Yerel port numarası, Canlı tutma (Keep alive),
http_proxysadece küçük harfle, TLS, Şifreler (Ciphers), HTTP/0.9, Aktif bağlantılar, Yaygın FTPS sorunları, Tüm seçenekler, Bağlantılar istediğiniz gibi yeniden kullanılmadığında, Canlı tutma (Keep alive), Kimlik Doğrulama, URL'ler (URLs)
H
- --happy-eyeballs-timeout-ms: İnce ayar (Tweak)
- haproxy: haproxy, Tüm seçenekler
- --haproxy-clientip: curl ve haproxy
- --haproxy-protocol: curl ve haproxy
- --header: Sunucu farklılıkları, Vekil sunucu başlıkları, JSON, Başlıkları özelleştirme
- homebrew: macOS
- Host:: HTTP temelleri, İzleme seçenekleri (Trace options), Host: başlığını değiştirin, Bunun oluşturduğu HTTP, Başlıkları özelleştirme, HTTP istek başlıklarını özelleştirme
- --hsts: HSTS önbelleği
- HSTS: HTTPS, HSTS, Tüm seçenekler, HSTS, HSTS, Ne paylaşılmalı, HSTS,
<features> - HTTP proxy: Tüm seçenekler, Proxy türleri, Mevcut bilgiler
- HTTP Strict Transport Security: HSTS, HSTS, Ne paylaşılmalı, HSTS
- HTTP/1.1: HTTP, HTTP temelleri, İzleme seçenekleri (Trace options), HTTP/2, TELNET ile hata ayıklama, HTTP/2, Uyarılar (Caveats), Bunun oluşturduğu HTTP, GET mi POST mu?, İstek yöntemi (Request method), İstek hedefi (Request target), HTTP istek başlıklarını özelleştirme, Sürümler (Versions), İçerik kodlamaları hakkında
- HTTP/2: HTTP, docs, nghttp2, Satır 4: Özellikler (Features), Mevcut çıkış kodları, Daha fazla veri, HTTP/2, HTTP/2, QUIC reddedildiğinde, HTTP/2 ve sonrası, HTTP başlıkları, HTTP/3, Daha fazlasını izle, Bağlantılar istediğiniz gibi yeniden kullanılmadığında, QUIC ve HTTP/2, HTTPS üzerinden DNS (DNS over HTTPS), HTTPS proxy, Sürümler (Versions), Expect: başlıkları, Çoğullama (Multiplexing), HTTP/3, Curl_easy, Değişkenler (Variables)
- HTTP/3: HTTP, HTTP/3 arka ucunu seçin, QUIC ve HTTP/3, TCP vs UDP, Satır 4: Özellikler (Features), Mevcut çıkış kodları, Daha fazla veri, HTTP/3 yarışı, HTTP/3, HTTP başlıkları, HTTP/3, Hangi libcurl sürümü çalışıyor, Daha fazlasını izle, HTTP/3, Bağlantılar istediğiniz gibi yeniden kullanılmadığında, Sürümler (Versions), Expect: başlıkları, Çoğullama (Multiplexing), HTTP/3, Farklı arka uçlar
- --http0.9: HTTP/0.9
- --http2: HTTP/2
- --http2-prior-knowledge: HTTP/2
- --http3: HTTP/3 yarışı, Etkinleştirme
- --http3-only: QUIC reddedildiğinde
- HttpGet: Nasıl başladı
- HTTPS proxy: Satır 4: Özellikler (Features), Doğrulama, Tüm seçenekler, Yerel veya proxy ad araması
I
- IDN: libidn2, Uluslararası Alan Adları (IDN), Sürüm,
CURLU_URLENCODE, Farklı arka uçlar,<features> - IETF: Protokoller, TLS sürümleri
- Indentation: Girintileme (Indentation)
- --ip-tos: Hizmet Türü (Type of Service)
- IPFS: IPFS
- --ipfs-gateway: Ağ geçidi (Gateway)
- IPv4: Ana bilgisayar (Host), Port numarası, Mevcut --write-out değişkenleri, Hizmet Türü (Type of Service), Mutlu Gözler (Happy Eyeballs), curl ve haproxy, Tüm seçenekler, libcurl nasıl bağlanır (How libcurl connects), Ad çözme (Name resolving), Değişkenler (Variables)
- IPv6: Ana bilgisayar (Host), Port numarası, URL globbing, Sürüm, Mevcut --write-out değişkenleri, Mutlu Gözler (Happy Eyeballs), SOCKS vekil sunucusu, curl ve haproxy, Tüm seçenekler, libcurl nasıl bağlanır (How libcurl connects), Ad çözme (Name resolving), Zone ID (Bölge Kimliği),
CURLRES_IPV6, Değişkenler (Variables) - IRC: Nasıl başladı
- İçerik Kodlama: İçerik Kodlaması (Content Encoding)
- İlerleme geri çağırımı: İlerleme bilgisi (Progress information), İlerleme geri çağırımı
- İsim çözümleme: İsim çözümleme hileleri, Farklı arka uçlar
J
- JavaScript: İstemci farklılıkları, PAC, JavaScript ve formlar, JavaScript yönlendirmeleri, Tarayıcının ne yaptığını anlayın
- --json: trurl örnek komut satırları, JSON
- json: Boşluklu argümanlar, İşlevler (Functions), Mevcut --write-out değişkenleri, Content-Type, JSON, HTML dışında POST
K
- -K: Komut satırları, tırnak işaretleri ve takma adlar (aliases), Kullanılacak yapılandırma dosyasını belirtme
- --keepalive-cnt: Canlı tutma (Keep alive)
- --keepalive-time: Canlı tutma (Keep alive)
- KNOWN_BUGS: Gelecek
L
- -L: Kısa seçenekler, Mevcut --write-out değişkenleri, Location: da, curl'e yönlendirmeleri izlemesini söyleyin, İstek yöntemi (Request method), Çerez motoru, Çerezleri dosyadan okuma, Yönlendirmeler (Redirects)
- LD_LIBRARY_PATH:
LD_LIBRARY_PATH - --libcurl: --libcurl
- libidn2: libidn2
- libpsl: libpsl
- libressl: TLS kütüphaneleri, Kısıtlamalar, HTTP/3 arka uçları
- librtmp: librtmp
- libssh: SSH kütüphaneleri,
<features> - libssh2: SSH kütüphaneleri,
<features> - --limit-rate: Hız sınırlama (Rate limiting)
- Lisans: Kullanıcıları bulma, Lisans, kök (root), Lisans
- --location: Uzun seçenekler, URL başına ayrı seçenekler, Sözdizimi, curl'e yönlendirmeleri izlemesini söyleyin
M
- --max-filesize: Maksimum dosya boyutu
- --max-time: Yeniden denemelerinizi ayarlayın, Harcamasına izin verilen maksimum süre
- MIT: Lisans
- --mptcp: Multipath TCP
- MQTT: curl hangi protokolleri destekler?, MQTT, Desteklenen şemalar, Satır 3: Protokoller (Protocols), MQTT, Değişkenler (Variables), Test sunucuları (Test servers)
- mTLS: İstemci sertifikaları
- multi-threading: çoklu iş parçacığı (multi-threading)
- Multipath TCP: Multipath TCP
- Mutlu Gözler: Mutlu Gözler (Happy Eyeballs)
N
- --negotiate: Ağ sızıntısı, Kimlik Doğrulama
- .netrc: Komut satırı sızıntısı, .netrc, Tüm seçenekler,
.netrc,<features> - --netrc-file: netrc'yi etkinleştir
- --netrc-optional: netrc'yi etkinleştir
- nghttp2: nghttp2, Hangi libcurl sürümü çalışıyor
- nix: nix
- --no-clobber: Üzerine yazma (Overwriting)
- --no-eprt: Aktif bağlantılar
- --no-epsv: Pasif bağlantılar
- --no-keepalive: Canlı tutma (Keep alive)
- NPN: Tüm seçenekler
- --ntlm: Ağ sızıntısı, Kimlik Doğrulama
O
- -O: Birçok seçenek ve URL, Sayısal aralıklar, URL ile adlandırılan bir dosyaya indirme, Sunucudan gelen hedef dosya adını kullanma, Kabuk yönlendirmeleri (Shell redirects), Çoklu indirmeler, Devam ettirme ve aralıklar, İstek hızı sınırlama, SFTP/SCP için, Zaten yapılmışsa indirmeyi atla, Kimlik Doğrulama (Authentication), İndirme (Download), Değiştirilme tarihine göre kontrol et
- Okuma geri çağırımı: geri çağırımları (callback) mümkün olduğunca hızlı yapın, Tüm seçenekler, Veri okuma (Read data), HTTP POST
- openldap: openldap
- OpenSSL: MSYS2'de curl ve libcurl edinin, lib/vtls, TLS arka ucunu seçin, TLS kütüphaneleri, Mevcut çıkış kodları, Yerel CA depoları, OCSP zımbalama (OCSP stapling), Kısıtlamalar, Tüm seçenekler, SSL bağlamı (SSL context), Mevcut bilgiler, HTTP/3 arka uçları,
<features> - Ortam değişkenleri: Ortam değişkenleri, Windows, Vekil sunucu ortam değişkenleri, Proxy ortam değişkenleri,
<setenv> - --output-dir: Başka bir dizinde saklama, Sunucudan gelen hedef dosya adını kullanma
P
- PAC: PAC, Hangi proxy?
- --parallel: Paralel transferler, Paralel ilerleme göstergesi, Paralel, İstek hızı sınırlama
- --parallel-immediate: Multiplex öncesi bağlantı
- --parallel-max: Paralel transferler
- --path-as-is: --path-as-is
- Percent-encoding: URL kodlanmış veri
- POP3: curl hangi protokolleri destekler?, POP3, Desteklenen şemalar, Sürüm, Mevcut çıkış kodları, TLS'yi etkinleştirme, POP3, Güvenli posta transferi, STARTTLS,
CURLU_GUESS_SCHEME, Değişkenler (Variables), Test sunucuları (Test servers) - Port numarası: Port numaralarına bağlanın, URL'in bir isteğe dönüştürülmesi, Port numarası, trurl örnek komut satırları, Mevcut çıkış kodları, Mevcut --write-out değişkenleri, Bir isim için özel bir IP adresi sağlayın, Yerel port numarası, HTTP vekil sunucusu, Tarihi TELNET, Etkinleştirme, Bir web formunu dönüştürme, Tüm seçenekler, Yerel adres ve port numarası, Bağlantı yeniden kullanımı (Connection reuse), Ana bilgisayarlar için özel adresler, Vekil sunucular (Proxies), Transfer sonrası bilgi,
CURLU_DEFAULT_PORT, URL parçalarını ayarla (Set URL parts), Base64 Kodlama - --post301: Yönlendirmelerde hangi yöntemin kullanılacağına karar verin
- --post302: Yönlendirmelerde hangi yöntemin kullanılacağına karar verin
- --post303: Yönlendirmelerde hangi yöntemin kullanılacağına karar verin
- --proxy: HTTP vekil sunucusu, Kimlik Doğrulama
- --proxy-ca-native: Yerel CA depoları
- --proxy-http2: HTTP/2
- --proxy-user: Vekil sunucu kimlik doğrulaması, Kimlik Doğrulama
- --proxy1.0: HTTP vekil sunucusu tünelleme
- --proxytunnel: HTTP vekil sunucusu tünelleme
Q
- -Q: Quote
- Quic: Bir bağlantı kurun, HTTPS, QUIC ve HTTP/3, Mevcut çıkış kodları, Multipath TCP, HTTP/3 yarışı, Bağlanmak için asla bundan fazlasını harcama, QUIC, Hangi libcurl sürümü çalışıyor, HTTP/3, Canlı tutmayı etkinleştir, Kimlik Doğrulama, Sürüm 3 zorunlu olabilir, HTTP/3 arka uçları
- --quote: Quote
R
- --rate: İstek hızı sınırlama
- redhat: Redhat ve CentOS
- RELEASE-NOTES: scripts
- --remote-name-all: Verilen her URL için bir çıktı, Tüm URL'ler için URL'nin dosya adı kısmını kullanma
- --remove-on-error: Hatalarda kalanlar
- repository: Sürümler, GitHub'da kaynak kodu
- --resolve: Bir isim için özel bir IP adresi sağlayın
- --retry: Mevcut --write-out değişkenleri, Yeniden deneme (Retry), İstek hızı sınırlama
- --retry-all-errors: Herhangi bir ve tüm hatalarda yeniden deneyin
- --retry-connrefused: Bağlantı reddedildi
- --retry-delay: Yeniden denemelerinizi ayarlayın
- --retry-max-time: Yeniden denemelerinizi ayarlayın
- RFC 1436: GOPHER
- RFC 1738: FILE, multicwd
- RFC 1939: POP3
- RFC 1945: Yönlendirmeler (Redirects)
- RFC 2229: DICT
- RFC 2246: TLS sürümleri
- RFC 2326: RTSP
- RFC 2595: IMAP
- RFC 2616: İçerik kodlamaları hakkında
- RFC 2818: HTTPS
- RFC 3207: SMTP
- RFC 3501: IMAP
- RFC 3986: Tarayıcılar
- RFC 4217: FTPS
- RFC 4511: LDAP
- RFC 5321: SMTP
- RFC 7838: Alternatif Hizmetler (Alternative Services)
- RFC 8314: IMAPS
- RFC 8446: TLS sürümleri
- RFC 854: TELNET
- RFC 8999: HTTPS
- RFC 9110: HTTP
- RFC 9112: HTTP
- RFC 9113: HTTP
- RFC 9114: HTTP
- RFC 959: FTP, Quote
- roadmap: Gelecek
- rpath:
rpath - RTMP: curl hangi protokolleri destekler?, RTMP, librtmp, Desteklenen şemalar, Sürüm
- RTSP: curl hangi protokolleri destekler?, RTSP, Desteklenen şemalar, Sürüm, Tüm seçenekler, RTSP serpiştirilmiş veriler, Mevcut bilgiler, Değişkenler (Variables)
- rustls: TLS kütüphaneleri,
<features> - rustls-ffi: TLS arka ucunu seçin, Rustls
S
- Safari: Safari'den
- Schannel: TLS kütüphaneleri, Yerel CA depoları, HTTP/3 arka uçları,
<features> - Scheme: Port numaralarına bağlanın, Şema (Scheme), Mevcut çıkış kodları, Mevcut --write-out değişkenleri
- SCP: curl hangi protokolleri destekler?, SCP, SSH kütüphaneleri, Desteklenen şemalar, Sürüm, Mevcut çıkış kodları, Yüklemeye izin veren protokoller, Sıkıştırma, URL'ler (URLs), Kimlik Doğrulama (Authentication), Bilinen ana bilgisayarlar (Known hosts), Tüm seçenekler, Kimlik Doğrulama, Curl_handler,
<server> - SFTP: curl hangi protokolleri destekler?, SFTP, SSH kütüphaneleri, Desteklenen şemalar, Sürüm, Mevcut çıkış kodları, İzleme seçenekleri (Trace options), Yüklemeye izin veren protokoller, Sıkıştırma, URL'ler (URLs), Kimlik Doğrulama (Authentication), Bilinen ana bilgisayarlar (Known hosts), Tüm seçenekler, Kimlik Doğrulama, Curl_handler,
<server>, Belirli bir kategoriye göre testleri çalıştırma - --silent: İlerleme göstergesi, Hata mesajı
- --skip-existing: Zaten yapılmışsa indirmeyi atla
- SMTP: curl hangi protokolleri destekler?, SMTP, Şema olmadan, Sürüm, Mevcut çıkış kodları, Yüklemeye izin veren protokoller, TLS'yi etkinleştirme, E-posta gönderme, STARTTLS, Tüm seçenekler,
CURLU_GUESS_SCHEME, Değişkenler (Variables), Test sunucuları (Test servers) - SMTPS: curl hangi protokolleri destekler?, SMTPS, TLS kütüphaneleri, Desteklenen şemalar, Sürüm, Yüklemeye izin veren protokoller, TLS'yi etkinleştirme
- snapshots: Günlük anlık görüntüler (snapshots), kök (root)
- SNI: Host: başlığını değiştirin
- --socks4: SOCKS vekil sunucusu
- --socks4a: SOCKS vekil sunucusu
- --socks5: SOCKS vekil sunucusu
- --socks5-hostname: SOCKS vekil sunucusu
- --speed-limit: Yavaş transferleri durdurma
- --speed-time: Yavaş transferleri durdurma
- SSH: SCP, SSH arka ucunu seçin, SSH kütüphaneleri, Mevcut çıkış kodları, Kimlik Doğrulama (Authentication), Bilinen ana bilgisayarlar (Known hosts), Tarihi TELNET, Her şeyi izle, Tüm seçenekler, SSH anahtarı, Kimlik Doğrulama, Farklı arka uçlar, Curl_handler, Değişkenler (Variables)
- SSLKEYLOGFILE: TLS, SSLKEYLOGFILE, Bir tarayıcının ne gönderdiğini anlama
- STARTTLS: IMAP, E-postalar için TLS, STARTTLS
- Sürümler: curl-announce, Sürümler, scripts, TLS arka ucunu seçin, .netrc, Sürümler (Versions),
<features>
T
- -T: PUT, Yükleme (Upload), Yöntem (Method), HTTP PUT, FTP ile yükleme
- TCP: Bir bağlantı kurun, Protokoller ne kadar değişir?, DICT, TCP vs UDP, Mevcut çıkış kodları, Mevcut --write-out değişkenleri, Multipath TCP, Bağlantı zaman aşımı, HTTP/3 yarışı, Yerel port numarası, Canlı tutma (Keep alive), Bağlanmak için asla bundan fazlasını harcama, HTTP vekil sunucusu tünelleme, MITM vekil sunucusu, haproxy, TELNET ile hata ayıklama, QUIC, HTTPS, İki bağlantı, Bağlantı önbelleği, Tüm seçenekler, HTTP/3, Canlı tutma (Keep alive), connectdata
- TELNET: curl hangi protokolleri destekler?, TELNET, Desteklenen şemalar, Sürüm, Mevcut çıkış kodları, TELNET, Tüm seçenekler, Değişkenler (Variables)
- TFTP: curl hangi protokolleri destekler?, TFTP, Desteklenen şemalar, TCP vs UDP, Sürüm, Mevcut çıkış kodları, Yüklemeye izin veren protokoller, TFTP, Tüm seçenekler, Değişkenler (Variables), Test sunucuları (Test servers)
- --tftp-blksize: TFTP seçenekleri
- --tftp-no-options: TFTP seçenekleri
- --time-cond: Değiştirilme tarihine göre kontrol et
- TLS: Güvenlik, Protokoller ne kadar değişir?, GOPHERS, URL'in bir isteğe dönüştürülmesi, Ubuntu ve Debian, lib/vtls, Derleme seçeneklerini yönetme, TLS arka ucunu seçin, TLS kütüphaneleri, TLS kütüphaneleri, Satır 1: curl, Mevcut çıkış kodları, Daha fazla veri, Mevcut --write-out değişkenleri, Host: başlığını değiştirin, Bağlanmak için asla bundan fazlasını harcama, MITM vekil sunucusu, TLS, Şifreler (Ciphers), TLS'yi etkinleştirme, TLS sürümleri, Sunucu sertifikalarını doğrulama, Sertifika sabitleme (Certificate pinning), OCSP zımbalama (OCSP stapling), İstemci sertifikaları, TLS kimlik doğrulaması, TLS arka uçları (backends), SSLKEYLOGFILE, Bilinen ana bilgisayarlar (Known hosts), E-postalar için TLS, Uyarılar (Caveats), Yalnızca HTTPS, Bir tarayıcının ne gönderdiğini anlama, HTTPS, TLS parmak izi (TLS fingerprinting), FTPS, Her şeyi izle, Önbellekler, handle'ları yeniden kullanın, TLS seçenekleri, Tüm seçenekler, SSL bağlamı (SSL context), HTTP proxy, Kimlik Doğrulama, Mevcut bilgiler, URL'ler (URLs), Farklı arka uçlar, bağlantı önbelleği (connection cache), Değişkenler (Variables)
- TODO: Gelecek, Öneriler
- --tr-encoding: Aktarım kodlaması (Transfer encoding), Sıkıştırma (Compression)
- --trace: İzleme seçenekleri (Trace options),
<command [option="no-output/no-include/force-output/binary-trace"] [timeout="secs"][delay="secs"][type="perl/shell"]> - --trace-ascii: İzleme seçenekleri (Trace options), Sunucu farklılıkları,
<command [option="no-output/no-include/force-output/binary-trace"] [timeout="secs"][delay="secs"][type="perl/shell"]> - --trace-config: Daha fazla veri
- --trace-ids: Transferleri ve bağlantıları tanımlayın
- --trace-time: Zaman damgaları
- transfer-encoding: Aktarım kodlamasını iletme (Pass on transfer encoding), Parçalı (Chunked) kodlanmış POST'lar
- trurl: curl ne yapar?, trurl
- Type of Service: Hizmet Türü (Type of Service)
U
- -U: MSYS2 üzerinde libcurl derleme, Belirli bir seçenekle ilgili yardım, Vekil sunucu kimlik doğrulaması
- -u: MSYS2 üzerinde libcurl derleme, Parolalar, URL'ler (URLs), Kimlik Doğrulama (Authentication), IMAP, Kimlik Doğrulama
- Ubuntu: Ubuntu ve Debian
- URL Globbing: URL globbing
- --url-query: Sorgu (Query)
V
- --variable: Değişkenler
- variables: Değişkenler (Variables)
- Vekil sunucu: Nasıl başladı, Mevcut --write-out değişkenleri, Aradaki aracıların oynamaları, Vekil sunucunuzu keşfedin, PAC, Esir portallar (Captive portals), Vekil sunucu türü, HTTP vekil sunucusu, SOCKS vekil sunucusu, MITM vekil sunucusu, Vekil sunucu kimlik doğrulaması, HTTPS vekil sunucusu, Vekil sunucu ortam değişkenleri, Vekil sunucu başlıkları, haproxy, Yerel CA depoları, CONNECT yanıt kodları, Kimlik Doğrulama, Vekil sunucular (Proxies), Değişkenler (Variables), Test sunucuları (Test servers)
- --verbose: Uzun seçenekler, Zaman damgaları
- --version: Sürüm, TLS arka uçları (backends), Bellek hata ayıklama (Memory debugging)
- --vlan-priority: VLAN
W
- wcurl: curl ne yapar?
- Wireshark: Mevcut çıkış kodları, İzleme seçenekleri (Trace options), SSLKEYLOGFILE, Bir tarayıcının ne gönderdiğini anlama
- wolfSSH: SSH kütüphaneleri,
<features> - wolfSSL: Ticari destek, lib/vtls, TLS kütüphaneleri, Yerel CA depoları, Kısıtlamalar, Tüm seçenekler, SSL bağlamı (SSL context), HTTP/3 arka uçları,
<features> - --write-out: Hata mesajı, Yazdır (Write out), Üzerine yazma (Overwriting), HTTP yanıt kodları
X
- -X: HTTP PUT, İstek yöntemi (Request method), İstek hedefi (Request target)
- -x: HTTP vekil sunucusu, SOCKS vekil sunucusu, Vekil sunucu kimlik doğrulaması, Vekil sunucu ortam değişkenleri, Vekil sunucu başlıkları, Proxy ortam değişkenleri
Y
- Yazma geri çağırımı: geri çağırımları (callback) mümkün olduğunca hızlı yapın, Geri çağırım (Callback) hususları, Tüm seçenekler, Veri yazma (Write data), Yanıt gövdesi, 1. Geri çağırım yaklaşımı (The callback approach), Ham mod (Raw mode), Yazma geri çağırımı (Write callback), Basit bir HTTP sayfası al (Get a simple HTTP page), Belleğe bir yanıt al (Get a response into memory)
- Yönlendirmeler: Yönlendirmeler (Redirects), Yönlendirmeler (Redirects)
- yum: Redhat ve CentOS