diff --git a/docs/cmdline-opts/_OPTIONS.md b/docs/cmdline-opts/_OPTIONS.md index f1067377c8..2b7cb80f49 100644 --- a/docs/cmdline-opts/_OPTIONS.md +++ b/docs/cmdline-opts/_OPTIONS.md @@ -24,6 +24,9 @@ When --next is used, it resets the parser state and you start again with a clean option state, except for the options that are global. Global options retain their values and meaning even after --next. +If the long option name ends with an equals sign (`=`), the argument is the +text following on its right side. (Added in 8.16.0) + The first argument that is exactly two dashes (`--`), marks the end of options; any argument after the end of options is interpreted as a URL argument even if it starts with a dash. diff --git a/src/tool_getparam.c b/src/tool_getparam.c index 3a1cc57fdd..c78494f76d 100644 --- a/src/tool_getparam.c +++ b/src/tool_getparam.c @@ -2803,6 +2803,9 @@ static ParameterError opt_filestring(struct OperationConfig *config, return err; } +/* the longest command line option, excluding the leading -- */ +#define MAX_OPTION_LEN 26 + ParameterError getparameter(const char *flag, /* f or -long-flag */ const char *nextarg, /* NULL if unset */ bool *usedarg, /* set to TRUE if the arg @@ -2816,6 +2819,7 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */ bool toggle = TRUE; /* how to switch boolean options, on or off. Controlled by using --OPTION or --no-OPTION */ bool nextalloc = FALSE; /* if nextarg is allocated */ + bool consumearg = TRUE; /* the argument comes separate */ const struct LongShort *a = NULL; struct GlobalConfig *global = config->global; verbose_nopts = 0; /* options processed in `flag`*/ @@ -2827,6 +2831,8 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */ const char *word = ('-' == flag[0]) ? flag + 2 : flag; bool noflagged = FALSE; bool expand = FALSE; + const char *p; + struct Curl_str out; if(!strncmp(word, "no-", 3)) { /* disable this option but ignore the "no-" part when looking for it */ @@ -2840,7 +2846,21 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */ expand = TRUE; } - a = findlongopt(word); + p = word; + /* is there an '=' ? */ + if(!curlx_str_until(&p, &out, MAX_OPTION_LEN, '=') && + !curlx_str_single(&p, '=') ) { + /* there's an equal sign */ + char tempword[MAX_OPTION_LEN + 1]; + memcpy(tempword, curlx_str(&out), curlx_strlen(&out)); + tempword[curlx_strlen(&out)] = 0; + a = findlongopt(tempword); + nextarg = p; + consumearg = FALSE; /* it is not separate */ + } + else + a = findlongopt(word); + if(a) { longopt = TRUE; } @@ -2910,7 +2930,7 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */ break; } else { - *usedarg = TRUE; /* mark it as used */ + *usedarg = consumearg; /* mark it as used */ } if(a->desc & ARG_DEPR) { opt_depr(global, a); diff --git a/tests/data/test1333 b/tests/data/test1333 index e6dbb73a62..5a5dd63a2d 100644 --- a/tests/data/test1333 +++ b/tests/data/test1333 @@ -31,7 +31,7 @@ http HTTP POST zero length, chunked-encoded --d "" --header "Transfer-Encoding: chunked" http://%HOSTIP:%HTTPPORT/%TESTNUMBER +-d "" --header="Transfer-Encoding: chunked" http://%HOSTIP:%HTTPPORT/%TESTNUMBER diff --git a/tests/data/test1335 b/tests/data/test1335 index a0b3aae65e..146ff6d918 100644 --- a/tests/data/test1335 +++ b/tests/data/test1335 @@ -30,7 +30,7 @@ http HTTP GET with -O without Content-Disposition, -D stdout -http://%HOSTIP:%HTTPPORT/%TESTNUMBER -O -D - --output-dir %LOGDIR +http://%HOSTIP:%HTTPPORT/%TESTNUMBER -O -D - --output-dir="%LOGDIR" diff --git a/tests/data/test1442 b/tests/data/test1442 index 0825a1e028..2293fdf2f7 100644 --- a/tests/data/test1442 +++ b/tests/data/test1442 @@ -19,7 +19,7 @@ file Check --write-out with trailing \ -file://localhost/%FILE_PWD/%LOGDIR/non-existent-file.txt --write-out '\' +file://localhost/%FILE_PWD/%LOGDIR/non-existent-file.txt --write-out='\' diff --git a/tests/data/test206 b/tests/data/test206 index 99a9493023..2ff05075c7 100644 --- a/tests/data/test206 +++ b/tests/data/test206 @@ -80,7 +80,7 @@ digest HTTP proxy CONNECT auth Digest -http://test.remote.haxx.se.%TESTNUMBER:8990/path/%TESTNUMBER0002 --proxy http://%HOSTIP:%HTTPPORT --proxy-user silly:person --proxy-digest --proxytunnel +http://test.remote.haxx.se.%TESTNUMBER:8990/path/%TESTNUMBER0002 --proxy=http://%HOSTIP:%HTTPPORT --proxy-user=silly:person --proxy-digest --proxytunnel