mirror of
https://github.com/moparisthebest/curl
synced 2024-11-13 13:05:03 -05:00
cookies: Support multiple -b parameters
Previously only a single -b cookie parameter was supported with the last one winning. This adds support for supplying multiple -b params to have them serialized semicolon separated. Both cookiefiles and cookies can be entered multiple times. Closes #6649 Reviewed-by: Daniel Stenberg <daniel@haxx.se>
This commit is contained in:
parent
1b2098c3c9
commit
82c583dcf0
@ -31,7 +31,7 @@ name then both will be sent on a future transfer to that server, likely not
|
|||||||
what you intended. To address these issues set a domain in Set-Cookie (doing
|
what you intended. To address these issues set a domain in Set-Cookie (doing
|
||||||
that will include sub domains) or use the Netscape format.
|
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
|
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
|
cookies back to a file, so using both --cookie and --cookie-jar in the same
|
||||||
|
@ -56,9 +56,9 @@ static void free_config_fields(struct OperationConfig *config)
|
|||||||
Curl_safefree(config->useragent);
|
Curl_safefree(config->useragent);
|
||||||
Curl_safefree(config->altsvc);
|
Curl_safefree(config->altsvc);
|
||||||
Curl_safefree(config->hsts);
|
Curl_safefree(config->hsts);
|
||||||
Curl_safefree(config->cookie);
|
curl_slist_free_all(config->cookies);
|
||||||
Curl_safefree(config->cookiejar);
|
Curl_safefree(config->cookiejar);
|
||||||
Curl_safefree(config->cookiefile);
|
curl_slist_free_all(config->cookiefiles);
|
||||||
|
|
||||||
Curl_safefree(config->postfields);
|
Curl_safefree(config->postfields);
|
||||||
Curl_safefree(config->referer);
|
Curl_safefree(config->referer);
|
||||||
|
@ -54,9 +54,9 @@ struct OperationConfig {
|
|||||||
char *random_file;
|
char *random_file;
|
||||||
char *egd_file;
|
char *egd_file;
|
||||||
char *useragent;
|
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 *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 *altsvc; /* alt-svc cache file name */
|
||||||
char *hsts; /* HSTS cache file name */
|
char *hsts; /* HSTS cache file name */
|
||||||
bool cookiesession; /* new session? */
|
bool cookiesession; /* new session? */
|
||||||
|
@ -1320,11 +1320,15 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
|
|||||||
}
|
}
|
||||||
else if(strchr(nextarg, '=')) {
|
else if(strchr(nextarg, '=')) {
|
||||||
/* A cookie string must have a =-letter */
|
/* A cookie string must have a =-letter */
|
||||||
GetStr(&config->cookie, nextarg);
|
err = add2list(&config->cookies, nextarg);
|
||||||
|
if(err)
|
||||||
|
return err;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/* We have a cookie file to read from! */
|
/* We have a cookie file to read from! */
|
||||||
GetStr(&config->cookiefile, nextarg);
|
err = add2list(&config->cookiefiles, nextarg);
|
||||||
|
if(err)
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'B':
|
case 'B':
|
||||||
|
@ -82,6 +82,7 @@
|
|||||||
#include "tool_help.h"
|
#include "tool_help.h"
|
||||||
#include "tool_hugehelp.h"
|
#include "tool_hugehelp.h"
|
||||||
#include "tool_progress.h"
|
#include "tool_progress.h"
|
||||||
|
#include "dynbuf.h"
|
||||||
|
|
||||||
#include "memdebug.h" /* keep this as LAST include */
|
#include "memdebug.h" /* keep this as LAST include */
|
||||||
|
|
||||||
@ -1765,11 +1766,35 @@ static CURLcode single_transfer(struct GlobalConfig *global,
|
|||||||
my_setopt_slist(curl, CURLOPT_POSTQUOTE, config->postquote);
|
my_setopt_slist(curl, CURLOPT_POSTQUOTE, config->postquote);
|
||||||
my_setopt_slist(curl, CURLOPT_PREQUOTE, config->prequote);
|
my_setopt_slist(curl, CURLOPT_PREQUOTE, config->prequote);
|
||||||
|
|
||||||
if(config->cookie)
|
if(config->cookies) {
|
||||||
my_setopt_str(curl, CURLOPT_COOKIE, config->cookie);
|
struct curlx_dynbuf cookies;
|
||||||
|
struct curl_slist *cl;
|
||||||
|
CURLcode ret;
|
||||||
|
|
||||||
if(config->cookiefile)
|
/* The maximum size needs to match MAX_NAME in cookie.h */
|
||||||
my_setopt_str(curl, CURLOPT_COOKIEFILE, config->cookiefile);
|
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 */
|
/* new in libcurl 7.9 */
|
||||||
if(config->cookiejar)
|
if(config->cookiejar)
|
||||||
|
@ -33,6 +33,9 @@ moo
|
|||||||
<file name="log/jar329.txt" mode="text">
|
<file name="log/jar329.txt" mode="text">
|
||||||
.host.foo.com TRUE /we/want/ FALSE 2147483647 test no
|
.host.foo.com TRUE /we/want/ FALSE 2147483647 test no
|
||||||
</file>
|
</file>
|
||||||
|
<file name="log/jar329-2.txt" mode="text">
|
||||||
|
.host.foo.com TRUE /we/want/ FALSE 2147483647 tester yes
|
||||||
|
</file>
|
||||||
<server>
|
<server>
|
||||||
http
|
http
|
||||||
</server>
|
</server>
|
||||||
@ -46,7 +49,7 @@ HTTP cookie with Max-Age=0
|
|||||||
TZ=GMT
|
TZ=GMT
|
||||||
</setenv>
|
</setenv>
|
||||||
<command>
|
<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>
|
</command>
|
||||||
</client>
|
</client>
|
||||||
|
|
||||||
@ -57,12 +60,13 @@ GET /we/want/329 HTTP/1.1
|
|||||||
Host: host.foo.com
|
Host: host.foo.com
|
||||||
User-Agent: curl/%VERSION
|
User-Agent: curl/%VERSION
|
||||||
Accept: */*
|
Accept: */*
|
||||||
Cookie: test=no
|
Cookie: tester=yes; test=no
|
||||||
|
|
||||||
GET /we/want/3290002 HTTP/1.1
|
GET /we/want/3290002 HTTP/1.1
|
||||||
Host: host.foo.com
|
Host: host.foo.com
|
||||||
User-Agent: curl/%VERSION
|
User-Agent: curl/%VERSION
|
||||||
Accept: */*
|
Accept: */*
|
||||||
|
Cookie: tester=yes
|
||||||
|
|
||||||
</protocol>
|
</protocol>
|
||||||
</verify>
|
</verify>
|
||||||
|
@ -29,7 +29,7 @@ http
|
|||||||
HTTP with simple cookie send
|
HTTP with simple cookie send
|
||||||
</name>
|
</name>
|
||||||
<command>
|
<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>
|
</command>
|
||||||
</client>
|
</client>
|
||||||
|
|
||||||
@ -40,7 +40,7 @@ GET /we/want/that/page/6 HTTP/1.1
|
|||||||
Host: %HOSTIP:%HTTPPORT
|
Host: %HOSTIP:%HTTPPORT
|
||||||
User-Agent: curl/%VERSION
|
User-Agent: curl/%VERSION
|
||||||
Accept: */*
|
Accept: */*
|
||||||
Cookie: name=contents;name2=content2
|
Cookie: name=contents;name2=content2;name3=content3
|
||||||
|
|
||||||
</protocol>
|
</protocol>
|
||||||
</verify>
|
</verify>
|
||||||
|
Loading…
Reference in New Issue
Block a user