From 4cfbb201c4f823ba31ba4b895044088fba6ae535 Mon Sep 17 00:00:00 2001 From: YAMADA Yasuharu Date: Tue, 17 Sep 2013 15:51:22 +0900 Subject: 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() --- lib/cookie.c | 37 ++++++++++++++++++++++++++ tests/data/Makefile.am | 2 +- tests/data/test1415 | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 110 insertions(+), 1 deletion(-) create mode 100644 tests/data/test1415 diff --git a/lib/cookie.c b/lib/cookie.c index b6790677f..9deeb1ac4 100644 --- a/lib/cookie.c +++ b/lib/cookie.c @@ -290,6 +290,34 @@ static void strstore(char **str, const char *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 the same domain and path as this */ + /* at first, remove expired cookies */ + remove_expired(c); + clist = c->cookies; replace_old = FALSE; while(clist) { @@ -931,6 +962,9 @@ struct Cookie *Curl_cookie_getlist(struct CookieInfo *c, if(!c || !c->cookies) return NULL; /* no cookie struct or no cookies in the struct */ + /* at first, remove expired cookies */ + remove_expired(c); + co = c->cookies; while(co) { @@ -1173,6 +1207,9 @@ static int cookie_output(struct CookieInfo *c, const char *dumphere) destination file */ return 0; + /* at first, remove expired cookies */ + remove_expired(c); + if(strequal("-", dumphere)) { /* use stdout */ out = stdout; diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am index d11ce61a3..edbdbf5e2 100644 --- a/tests/data/Makefile.am +++ b/tests/data/Makefile.am @@ -112,7 +112,7 @@ test1388 test1389 test1390 test1391 test1392 test1393 test1394 test1395 \ test1396 \ \ 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 \ test1508 test1509 test1510 test1511 test1512 \ diff --git a/tests/data/test1415 b/tests/data/test1415 new file mode 100644 index 000000000..cc6bd70e7 --- /dev/null +++ b/tests/data/test1415 @@ -0,0 +1,72 @@ + + + +HTTP +HTTP GET +cookies +cookiejar +delete expired cookie + + +# Server-side + + +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 + + + +# Client-side + + +http + + +Delete expired cookies + + +TZ=GMT + + +http://example.com/we/want/1415 -b none -c log/jar1415.txt -x %HOSTIP:%HTTPPORT + + +# Verify data after the test has been "shot" + + +^User-Agent:.* + + +GET http://example.com/we/want/1415 HTTP/1.1 +Host: example.com +Accept: */* +Proxy-Connection: Keep-Alive + + + + +# 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 + + + -- cgit v1.2.3