summaryrefslogtreecommitdiff
path: root/src/tool_operate.c
diff options
context:
space:
mode:
authorDaniel Gustafsson <daniel@yesql.se>2021-02-25 18:12:28 +0100
committerDaniel Gustafsson <daniel@yesql.se>2021-02-25 18:12:28 +0100
commit82c583dcf009f038a9ceccc695f942f24015f9ab (patch)
tree8bf04adb2ee16faa8406b5b3cabd516f6b223dc5 /src/tool_operate.c
parent1b2098c3c9580c431cc9c4b110249abfd94792ed (diff)
downloadcurl-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.c33
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)