what you intended. To address these issues set a domain in Set-Cookie (doing
that will include sub domains) or use the Netscape format.
-If this option is used several times, the last one will be used.
+This option can be used multiple times.
Users very often want to both read cookies from a file and write updated
cookies back to a file, so using both --cookie and --cookie-jar in the same
Curl_safefree(config->useragent);
Curl_safefree(config->altsvc);
Curl_safefree(config->hsts);
- Curl_safefree(config->cookie);
+ curl_slist_free_all(config->cookies);
Curl_safefree(config->cookiejar);
- Curl_safefree(config->cookiefile);
+ curl_slist_free_all(config->cookiefiles);
Curl_safefree(config->postfields);
Curl_safefree(config->referer);
char *random_file;
char *egd_file;
char *useragent;
- char *cookie; /* single line with specified cookies */
+ struct curl_slist *cookies; /* cookies to serialize into a single line */
char *cookiejar; /* write to this file */
- char *cookiefile; /* read from this file */
+ struct curl_slist *cookiefiles; /* file(s) to load cookies from */
char *altsvc; /* alt-svc cache file name */
char *hsts; /* HSTS cache file name */
bool cookiesession; /* new session? */
}
else if(strchr(nextarg, '=')) {
/* A cookie string must have a =-letter */
- GetStr(&config->cookie, nextarg);
+ err = add2list(&config->cookies, nextarg);
+ if(err)
+ return err;
break;
}
/* We have a cookie file to read from! */
- GetStr(&config->cookiefile, nextarg);
+ err = add2list(&config->cookiefiles, nextarg);
+ if(err)
+ return err;
}
break;
case 'B':
#include "tool_help.h"
#include "tool_hugehelp.h"
#include "tool_progress.h"
+#include "dynbuf.h"
#include "memdebug.h" /* keep this as LAST include */
my_setopt_slist(curl, CURLOPT_POSTQUOTE, config->postquote);
my_setopt_slist(curl, CURLOPT_PREQUOTE, config->prequote);
- if(config->cookie)
- my_setopt_str(curl, CURLOPT_COOKIE, config->cookie);
+ if(config->cookies) {
+ struct curlx_dynbuf cookies;
+ struct curl_slist *cl;
+ CURLcode ret;
- if(config->cookiefile)
- my_setopt_str(curl, CURLOPT_COOKIEFILE, config->cookiefile);
+ /* The maximum size needs to match MAX_NAME in cookie.h */
+ curlx_dyn_init(&cookies, 4096);
+ for(cl = config->cookies; cl; cl = cl->next) {
+ if(cl == config->cookies)
+ ret = curlx_dyn_addf(&cookies, "%s", cl->data);
+ else
+ ret = curlx_dyn_addf(&cookies, ";%s", cl->data);
+
+ if(ret) {
+ result = CURLE_OUT_OF_MEMORY;
+ break;
+ }
+ }
+
+ my_setopt_str(curl, CURLOPT_COOKIE, curlx_dyn_ptr(&cookies));
+ curlx_dyn_free(&cookies);
+ }
+
+ if(config->cookiefiles) {
+ struct curl_slist *cfl;
+
+ for(cfl = config->cookiefiles; cfl; cfl = cfl->next)
+ my_setopt_str(curl, CURLOPT_COOKIEFILE, cfl->data);
+ }
/* new in libcurl 7.9 */
if(config->cookiejar)
<file name="log/jar329.txt" mode="text">
.host.foo.com TRUE /we/want/ FALSE 2147483647 test no
</file>
+<file name="log/jar329-2.txt" mode="text">
+.host.foo.com TRUE /we/want/ FALSE 2147483647 tester yes
+</file>
<server>
http
</server>
TZ=GMT
</setenv>
<command>
-http://%HOSTIP:%HTTPPORT/we/want/329 -b log/jar329.txt -H "Host: host.foo.com" http://%HOSTIP:%HTTPPORT/we/want/3290002
+http://%HOSTIP:%HTTPPORT/we/want/329 -b log/jar329.txt -b log/jar329-2.txt -H "Host: host.foo.com" http://%HOSTIP:%HTTPPORT/we/want/3290002
</command>
</client>
Host: host.foo.com\r
User-Agent: curl/%VERSION\r
Accept: */*\r
-Cookie: test=no\r
+Cookie: tester=yes; test=no\r
\r
GET /we/want/3290002 HTTP/1.1\r
Host: host.foo.com\r
User-Agent: curl/%VERSION\r
Accept: */*\r
+Cookie: tester=yes\r
\r
</protocol>
</verify>
HTTP with simple cookie send
</name>
<command>
-http://%HOSTIP:%HTTPPORT/we/want/that/page/6 -b "name=contents;name2=content2"
+http://%HOSTIP:%HTTPPORT/we/want/that/page/6 -b "name=contents;name2=content2" -b name3=content3
</command>
</client>
Host: %HOSTIP:%HTTPPORT\r
User-Agent: curl/%VERSION\r
Accept: */*\r
-Cookie: name=contents;name2=content2\r
+Cookie: name=contents;name2=content2;name3=content3\r
\r
</protocol>
</verify>