cookies: add expiration

Implement: Expired Cookies These following situation, curl removes
cookie(s) from struct CookieInfo if the cookie expired.
 - Curl_cookie_add()
 - Curl_cookie_getlist()
 - cookie_output()
This commit is contained in:
YAMADA Yasuharu 2013-09-17 15:51:22 +09:00 committed by Daniel Stenberg
parent dc016567ce
commit 4cfbb201c4
3 changed files with 110 additions and 1 deletions

View File

@ -290,6 +290,34 @@ static void strstore(char **str, const char *newstr)
*str = strdup(newstr); *str = strdup(newstr);
} }
/*
* remove_expired() removes expired cookies.
*/
static void remove_expired(struct CookieInfo *cookies)
{
struct Cookie *co, *nx, *pv;
curl_off_t now = (curl_off_t)time(NULL);
co = cookies->cookies;
pv = NULL;
while(co) {
nx = co->next;
if((co->expirestr || co->maxage) && co->expires < now) {
if(co == cookies->cookies) {
cookies->cookies = co->next;
}
else {
pv->next = co->next;
}
cookies->numcookies--;
freecookie(co);
}
else {
pv = co;
}
co = nx;
}
}
/**************************************************************************** /****************************************************************************
* *
@ -700,6 +728,9 @@ Curl_cookie_add(struct SessionHandle *data,
superceeds an already existing cookie, which it may if the previous have superceeds an already existing cookie, which it may if the previous have
the same domain and path as this */ the same domain and path as this */
/* at first, remove expired cookies */
remove_expired(c);
clist = c->cookies; clist = c->cookies;
replace_old = FALSE; replace_old = FALSE;
while(clist) { while(clist) {
@ -931,6 +962,9 @@ struct Cookie *Curl_cookie_getlist(struct CookieInfo *c,
if(!c || !c->cookies) if(!c || !c->cookies)
return NULL; /* no cookie struct or no cookies in the struct */ return NULL; /* no cookie struct or no cookies in the struct */
/* at first, remove expired cookies */
remove_expired(c);
co = c->cookies; co = c->cookies;
while(co) { while(co) {
@ -1173,6 +1207,9 @@ static int cookie_output(struct CookieInfo *c, const char *dumphere)
destination file */ destination file */
return 0; return 0;
/* at first, remove expired cookies */
remove_expired(c);
if(strequal("-", dumphere)) { if(strequal("-", dumphere)) {
/* use stdout */ /* use stdout */
out = stdout; out = stdout;

View File

@ -112,7 +112,7 @@ test1388 test1389 test1390 test1391 test1392 test1393 test1394 test1395 \
test1396 \ test1396 \
\ \
test1400 test1401 test1402 test1403 test1404 test1405 test1406 test1407 \ test1400 test1401 test1402 test1403 test1404 test1405 test1406 test1407 \
test1408 test1409 test1410 test1412 test1413 test1414 \ test1408 test1409 test1410 test1412 test1413 test1414 test1415 \
\ \
test1500 test1501 test1502 test1503 test1504 test1505 test1506 test1507 \ test1500 test1501 test1502 test1503 test1504 test1505 test1506 test1507 \
test1508 test1509 test1510 test1511 test1512 \ test1508 test1509 test1510 test1511 test1512 \

72
tests/data/test1415 Normal file
View File

@ -0,0 +1,72 @@
<testcase>
<info>
<keywords>
HTTP
HTTP GET
cookies
cookiejar
delete expired cookie
</keywords>
</info>
# Server-side
<reply>
<data>
HTTP/1.1 200 OK
Date: Thu, 09 Nov 2010 14:49:00 GMT
Server: test-server/fake
Content-Length: 4
Content-Type: text/html
Funny-head: yesyes
Set-Cookie: test1value=test1; domain=example.com; path=/;
Set-Cookie: test2value=test2; expires=Friday, 01-Jan-2038 00:00:00 GMT; domain=example.com; path=/;
Set-Cookie: test3value=test3; expires=Monday, 13-Jun-1988 03:04:55 GMT; domain=example.com; path=/;
Set-Cookie: test4value=test4; expires=Friday, 01-Jan-2038 00:00:00 GMT; domain=example.com; path=/;
Set-Cookie: test5value=test5; expires=Monday, 13-Jun-1988 03:04:55 GMT; domain=example.com; path=/;
Set-Cookie: test6value=test6; expires=Monday, 13-Jun-1988 03:04:55 GMT; domain=example.com; path=/;
Set-Cookie: test7value=test7; expires=Friday, 01-Jan-2038 00:00:00 GMT; domain=example.com; path=/;
Set-Cookie: test8value=test8; expires=Monday, 13-Jun-1988 03:04:55 GMT; domain=example.com; path=/;
boo
</data>
</reply>
# Client-side
<client>
<server>
http
</server>
<name>
Delete expired cookies
</name>
<setenv>
TZ=GMT
</setenv>
<command>
http://example.com/we/want/1415 -b none -c log/jar1415.txt -x %HOSTIP:%HTTPPORT
</command>
# Verify data after the test has been "shot"
<verify>
<strip>
^User-Agent:.*
</strip>
<protocol>
GET http://example.com/we/want/1415 HTTP/1.1
Host: example.com
Accept: */*
Proxy-Connection: Keep-Alive
</protocol>
<file name="log/jar1415.txt" mode="text">
# Netscape HTTP Cookie File
# http://curl.haxx.se/docs/http-cookies.html
# This file was generated by libcurl! Edit at your own risk.
.example.com TRUE / FALSE 0 test1value test1
.example.com TRUE / FALSE 2145916800 test2value test2
.example.com TRUE / FALSE 2145916800 test4value test4
.example.com TRUE / FALSE 2145916800 test7value test7
</file>
</verify>
</testcase>