libcurl關於Cookie的一些選項:
CURLOPT_COOKIE
用來指定一個Cookie,用來在之后的http請求中發送這個Cookie。
CURLOPT_COOKIEFILE
告訴libcurl激活cookie引擎,然后讀取指定文件來初始化Cookie,只讀。
CURLOPT_COOKIEJAR
告訴libcurl激活cookie引擎,當easy handle被關閉,保存所有已知的Cookie到cookie jar文件,只寫。
CURLOPT_COOKIELIST
提供單個的Cookie加入內部的Cookie存儲引擎。可以傳遞http頭格式也可以傳遞netscape 格式。這個也可以用來刷新Cookies。
CURLINFO_COOKIELIST
將Cookie信息從內部Cookie存儲里導出,導出格式為鏈表。
CURLOPT_COOKIE
這個函數可以給http請求設置Cookie 用法如下:
curl_easy_setopt(curl, CURLOPT_COOKIE, "tool=curl; fun=yes;");
這個選項顯式對發出的http請求的Cookie進設置,如果由於身份驗證,隨后的重定向或類似的操作完成了多個請求,則他們都將傳遞此Cookie。這句話的意思是重定向類操作會繼續傳遞此Cookie。
通過這個選項設置Cookie是與內部的Cookie存儲引擎分開的,內部的Cookie存儲引擎不會被此選項修改。假如你開啟Cookie存儲引擎你又導入一個同名的Cookie(或者服務器已經設置了這樣一個Cookie),那么你設置的Cookie將不會影響引擎內部的Cookie。向服務器發出的請求會發送兩個Cookie都發。想要替換引擎內部的Cookie可以使用CURLOPT_COOKIELIST這個選項。
多次調用這個選項只有最后一次調用會被使用。
這個選項不會開啟Cookie Engine。你可以使用CURLOPT_COOKIEFILE或者CURLOPT_COOKIEJAR去開啟Cookie引擎來達到自動分析和發送Cookie的功能。
CURL *curl = curl_easy_init(); if(curl) { curl_easy_setopt(curl, CURLOPT_URL, "http://example.com"); curl_easy_setopt(curl, CURLOPT_COOKIE, "tool=curl; fun=yes;"); curl_easy_perform(curl); }
CURLOPT_COOKIELIST
這個選項的參數可以為一行Netscape/Mozilkla格式或者http頭(Set-Cookie:…)。他會打開Cookie引擎。也會將單個Cookie加入內部Cookie存儲。
如果你使用這個選項並且有多個請求要發送的時候要謹慎。如果你使用Set-Cookie格式沒有指定域名的話那這個Cookie將會發送給所有的請求(包括重定向),而且這個Cookie無法被服務器SetCookie更改。如果服務器SetCookie時已經有一個同名的Cookie時,這個Cookie不會被替換,他會將兩者都傳遞給該服務器,這可能不是你想要的。要解決這個問題,請在Set-Cookie中設置一個域(這樣做將包括子域)或使用Netscape格式。如示例所示。
/* 這個例子演示了如何將Netscape格式的COokie的內聯導入, 您可以將cookie設置為HttpOnly,以防XSS攻擊#HttpOnly_到主機名。 如果cookie稍后由瀏覽器導入會很有用*/ #define SEP "\t" /* Tab separates the fields */ char *my_cookie = "example.com" /* Hostname */ SEP "FALSE" /* Include subdomains */ SEP "/" /* Path */ SEP "FALSE" /* Secure */ SEP "0" /* Expiry in epoch time format. 0 == Session */ SEP "foo" /* Name */ SEP "bar"; /* Value */ /* my_cookie 通過 CURLOPT_COOKIELIST導入*/ curl_easy_setopt(curl, CURLOPT_COOKIELIST, my_cookie); /* 在cookie.txt里面的cookie將不會被導入直到在傳輸前正確。如果Cookie里面有相同的hostname,path或者在my_cookies里存在將會被跳過。因為libcurl已經通過my_cookie導入被稱為”活着”的Cookie。活着的cookie不可以被通過讀入文件的Cookie替換。。 */ curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "cookies.txt"); /* import */ /* Cookie的導出是在curl_easy_cleanup被調用之后進行的。服務器可以增加、刪除、修改Cookie。被跳過的的cookie不會被導入 */ curl_easy_setopt(curl, CURLOPT_COOKIEJAR, "cookies.txt"); /* export */ curl_easy_perform(curl); /* cookies imported from cookies.txt */ curl_easy_cleanup(curl); /* cookies exported to cookies.txt */
CURLOPT_COOKIEJAR
這個選項的功能是將Cookie存儲到一個文件。
如果設置了這個選項libcurl將會在curl_easy_cleanup被調用的時候將cookie與入文件。如果沒有已經的cookie,會以-為文件名替換。他會還啟用此會話的cookie。所以如果你follow a location,它將會發送對應的Cookie
libcurl不會從cookie jar文件中讀取任何cookie。如果你想從 文件要讀取cookie請使用CURLOPT_COOKIEFILE。
如果cookie jar在curl_wasy_clean調用時候不能被創建或寫入,libcurl不會去報告這個錯誤。使用CURLOPT_VERBOSE或CURLOPT_DEBUGFUNCTION會有一個警告顯示。
自己7.43.0 cookie被Set-Cookie 格式並且沒有domain 時,將不會導出。
CURL *curl = curl_easy_init(); if(curl) { curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/foo.bin"); /*當調用cleanup的時候導出cookie到文件*/ curl_easy_setopt(curl, CURLOPT_COOKIEJAR, "/tmp/cookies.txt"); ret = curl_easy_perform(curl); /* 關閉curl, 寫入cookie! */ curl_easy_cleanup(curl); }