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:
Daniel Gustafsson 2021-02-25 18:12:28 +01:00
parent 1b2098c3c9
commit 82c583dcf0
7 changed files with 48 additions and 15 deletions

View file

@ -56,9 +56,9 @@ static void free_config_fields(struct OperationConfig *config)
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);

View file

@ -54,9 +54,9 @@ struct OperationConfig {
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? */

View file

@ -1320,11 +1320,15 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
}
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':

View file

@ -82,6 +82,7 @@
#include "tool_help.h"
#include "tool_hugehelp.h"
#include "tool_progress.h"
#include "dynbuf.h"
#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_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)