Skip to content

Commit

Permalink
cookies: Support multiple -b parameters
Browse files Browse the repository at this point in the history
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 #xxxx
  • Loading branch information
danielgustafsson committed Feb 23, 2021
1 parent f65d788 commit 4bb4049
Show file tree
Hide file tree
Showing 6 changed files with 47 additions and 14 deletions.
4 changes: 2 additions & 2 deletions src/tool_cfgable.c
Expand Up @@ -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);
Expand Down
4 changes: 2 additions & 2 deletions src/tool_cfgable.h
Expand Up @@ -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? */
Expand Down
8 changes: 6 additions & 2 deletions src/tool_getparam.c
Expand Up @@ -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':
Expand Down
33 changes: 29 additions & 4 deletions src/tool_operate.c
Expand Up @@ -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 */

Expand Down Expand Up @@ -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)
Expand Down
8 changes: 6 additions & 2 deletions tests/data/test329
Expand Up @@ -33,6 +33,9 @@ moo
<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>
Expand All @@ -46,7 +49,7 @@ HTTP cookie with Max-Age=0
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>

Expand All @@ -57,12 +60,13 @@ GET /we/want/329 HTTP/1.1
Host: host.foo.com
User-Agent: curl/%VERSION
Accept: */*
Cookie: test=no
Cookie: tester=yes; test=no

GET /we/want/3290002 HTTP/1.1
Host: host.foo.com
User-Agent: curl/%VERSION
Accept: */*
Cookie: tester=yes

</protocol>
</verify>
Expand Down
4 changes: 2 additions & 2 deletions tests/data/test6
Expand Up @@ -29,7 +29,7 @@ http
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>

Expand All @@ -40,7 +40,7 @@ GET /we/want/that/page/6 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
User-Agent: curl/%VERSION
Accept: */*
Cookie: name=contents;name2=content2
Cookie: name=contents;name2=content2;name3=content3

</protocol>
</verify>
Expand Down

0 comments on commit 4bb4049

Please sign in to comment.