Ç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ÖrnekAnlamı
0example.comAlan adı
1FALSEAlt alanları dahil et boolean
2/foobar/Yol
3FALSEGüvenli bir taşıma üzerinden ayarla
41462299217Bitiş tarihi – 1 Ocak 1970'ten beri saniye, veya 0
5personÇerezin adı
6danielÇerezin değeri