diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/cookie.c | 44 | ||||
-rw-r--r-- | lib/cookie.h | 7 | ||||
-rw-r--r-- | lib/easy.c | 3 | ||||
-rw-r--r-- | lib/url.c | 25 | ||||
-rw-r--r-- | lib/urldata.h | 1 |
5 files changed, 61 insertions, 19 deletions
diff --git a/lib/cookie.c b/lib/cookie.c index 51155786b..2a90d0b8b 100644 --- a/lib/cookie.c +++ b/lib/cookie.c @@ -93,6 +93,21 @@ Example set of cookies: #include "memdebug.h" #endif +static void +free_cookiemess(struct Cookie *co) +{ + if(co->domain) + free(co->domain); + if(co->path) + free(co->path); + if(co->name) + free(co->name); + if(co->value) + free(co->value); + + free(co); +} + /**************************************************************************** * * Curl_cookie_add() @@ -326,22 +341,19 @@ Curl_cookie_add(struct CookieInfo *c, if(7 != fields) { /* we did not find the sufficient number of fields to recognize this as a valid line, abort and go home */ - - if(co->domain) - free(co->domain); - if(co->path) - free(co->path); - if(co->name) - free(co->name); - if(co->value) - free(co->value); - - free(co); + free_cookiemess(co); return NULL; } } + if(!c->running && /* read from a file */ + c->newsession && /* clean session cookies */ + !co->expires) { /* this is a session cookie since it doesn't expire! */ + free_cookiemess(co); + return NULL; + } + co->livecookie = c->running; /* now, we have parsed the incoming line, we must now check if this @@ -462,8 +474,12 @@ Curl_cookie_add(struct CookieInfo *c, * Inits a cookie struct to read data from a local file. This is always * called before any cookies are set. File may be NULL. * + * If 'newsession' is TRUE, discard all "session cookies" on read from file. + * ****************************************************************************/ -struct CookieInfo *Curl_cookie_init(char *file, struct CookieInfo *inc) +struct CookieInfo *Curl_cookie_init(char *file, + struct CookieInfo *inc, + bool newsession) { char line[MAX_COOKIE_LINE]; struct CookieInfo *c; @@ -491,6 +507,8 @@ struct CookieInfo *Curl_cookie_init(char *file, struct CookieInfo *inc) else fp = file?fopen(file, "r"):NULL; + c->newsession = newsession; /* new session? */ + if(fp) { char *lineptr; bool headerline; @@ -513,7 +531,7 @@ struct CookieInfo *Curl_cookie_init(char *file, struct CookieInfo *inc) fclose(fp); } - c->running = TRUE; /* now, we're running */ + c->running = TRUE; /* now, we're running */ return c; } diff --git a/lib/cookie.h b/lib/cookie.h index 7bdbf0c34..d9e1a0fe9 100644 --- a/lib/cookie.h +++ b/lib/cookie.h @@ -55,9 +55,10 @@ struct CookieInfo { /* linked list of cookies we know of */ struct Cookie *cookies; - char *filename; /* file we read from/write to */ - bool running; /* state info, for cookie adding information */ + char *filename; /* file we read from/write to */ + bool running; /* state info, for cookie adding information */ long numcookies; /* number of cookies in the "jar" */ + bool newsession; /* new session, discard session cookies on load */ }; /* This is the maximum line length we accept for a cookie line */ @@ -75,7 +76,7 @@ struct CookieInfo { struct Cookie *Curl_cookie_add(struct CookieInfo *, bool header, char *line, char *domain); -struct CookieInfo *Curl_cookie_init(char *, struct CookieInfo *); +struct CookieInfo *Curl_cookie_init(char *, struct CookieInfo *, bool); struct Cookie *Curl_cookie_getlist(struct CookieInfo *, char *, char *, bool); void Curl_cookie_freelist(struct Cookie *); void Curl_cookie_cleanup(struct CookieInfo *); diff --git a/lib/easy.c b/lib/easy.c index 401eeeddf..4ae607a8a 100644 --- a/lib/easy.c +++ b/lib/easy.c @@ -312,7 +312,8 @@ CURL *curl_easy_duphandle(CURL *incurl) /* If cookies are enabled in the parent handle, we enable them in the clone as well! */ outcurl->cookies = Curl_cookie_init(data->cookies->filename, - outcurl->cookies); + outcurl->cookies, + data->set.cookiesession); /* duplicate all values in 'change' */ if(data->change.url) { @@ -495,13 +495,33 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option, ...) data->set.ssl.version = va_arg(param, long); break; + case CURLOPT_COOKIESESSION: + /* + * Set this option to TRUE to start a new "cookie session". It will + * prevent the forthcoming read-cookies-from-file actions to accept + * cookies that are marked as being session cookies, as they belong to a + * previous session. + * + * In the original Netscape cookie spec, "session cookies" are cookies + * with no expire date set. RFC2109 describes the same action if no + * 'Max-Age' is set and RFC2965 includes the RFC2109 description and adds + * a 'Discard' action that can enforce the discard even for cookies that + * have a Max-Age. + * + * We run mostly with the original cookie spec, as hardly anyone implements + * anything else. + */ + data->set.cookiesession = (bool)va_arg(param, long); + break; + case CURLOPT_COOKIEFILE: /* * Set cookie file to read and parse. Can be used multiple times. */ cookiefile = (char *)va_arg(param, void *); if(cookiefile) - data->cookies = Curl_cookie_init(cookiefile, data->cookies); + data->cookies = Curl_cookie_init(cookiefile, data->cookies, + data->set.cookiesession); break; case CURLOPT_COOKIEJAR: @@ -514,7 +534,8 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option, ...) * Activate the cookie parser. This may or may not already * have been made. */ - data->cookies = Curl_cookie_init(NULL, data->cookies); + data->cookies = Curl_cookie_init(NULL, data->cookies, + data->set.cookiesession); break; case CURLOPT_WRITEHEADER: /* diff --git a/lib/urldata.h b/lib/urldata.h index 571ab3015..ff2a997a0 100644 --- a/lib/urldata.h +++ b/lib/urldata.h @@ -607,6 +607,7 @@ struct UserDefined { char *key_passwd; /* plain text private key password */ char *crypto_engine; /* name of the crypto engine to use */ char *cookiejar; /* dump all cookies to this file */ + bool cookiesession; /* new cookie session? */ bool crlf; /* convert crlf on ftp upload(?) */ struct curl_slist *quote; /* after connection is established */ struct curl_slist *postquote; /* after the transfer */ |