diff options
author | Daniel Gustafsson <daniel@yesql.se> | 2021-02-25 18:12:28 +0100 |
---|---|---|
committer | Daniel Gustafsson <daniel@yesql.se> | 2021-02-25 18:12:28 +0100 |
commit | 82c583dcf009f038a9ceccc695f942f24015f9ab (patch) | |
tree | 8bf04adb2ee16faa8406b5b3cabd516f6b223dc5 /src/tool_operate.c | |
parent | 1b2098c3c9580c431cc9c4b110249abfd94792ed (diff) | |
download | curl-82c583dcf009f038a9ceccc695f942f24015f9ab.tar.gz |
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>
Diffstat (limited to 'src/tool_operate.c')
-rw-r--r-- | src/tool_operate.c | 33 |
1 files changed, 29 insertions, 4 deletions
diff --git a/src/tool_operate.c b/src/tool_operate.c index 2605a4cdf..e2b287269 100644 --- a/src/tool_operate.c +++ b/src/tool_operate.c @@ -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) |