diff --git a/docs/tests/FILEFORMAT.md b/docs/tests/FILEFORMAT.md index 26dae3e23f..b946c7973c 100644 --- a/docs/tests/FILEFORMAT.md +++ b/docs/tests/FILEFORMAT.md @@ -712,12 +712,16 @@ server is used), if `nonewline` is set, we cut off the trailing newline of this given data before comparing with the one actually sent by the client The `` and `` rules are applied before comparisons are made. -### `` +### `` This verifies that this data was passed to stderr. Use the mode="text" attribute if the output is in text mode on platforms that have a text/binary difference. +Use the mode="warn" attribute for curl warning output, as it then makes the +check without newlines and the prefix to better handle that the lines may wrap +at different points depending on the lengths of the lines and terminal width. + `crlf=yes` forces the newlines to become CRLF even if not written so in the test. diff --git a/src/tool_getparam.h b/src/tool_getparam.h index 4d34541393..e3cbe5454a 100644 --- a/src/tool_getparam.h +++ b/src/tool_getparam.h @@ -336,6 +336,7 @@ struct LongShort { typedef enum { PARAM_OK = 0, PARAM_OPTION_UNKNOWN, + PARAM_CONFIG_OPTION_UNKNOWN, PARAM_REQUIRES_PARAMETER, PARAM_BAD_USE, PARAM_HELP_REQUESTED, diff --git a/src/tool_helpers.c b/src/tool_helpers.c index 2a84accf2c..a23c3a80e7 100644 --- a/src/tool_helpers.c +++ b/src/tool_helpers.c @@ -39,6 +39,8 @@ const char *param2text(ParameterError error) return "had unsupported trailing garbage"; case PARAM_OPTION_UNKNOWN: return "is unknown"; + case PARAM_CONFIG_OPTION_UNKNOWN: + return "found an unknown config option"; case PARAM_REQUIRES_PARAMETER: return "requires parameter"; case PARAM_BAD_USE: diff --git a/src/tool_parsecfg.c b/src/tool_parsecfg.c index 9cecaaa2f4..d5421136c4 100644 --- a/src/tool_parsecfg.c +++ b/src/tool_parsecfg.c @@ -172,6 +172,11 @@ ParameterError parseconfig(const char *filename, int max_recursive, param = curlx_dyn_len(&pbuf) ? curlx_dyn_ptr(&pbuf) : CURL_UNCONST(""); } else { + if(*line == '\'') { + warnf("%s:%d Option '%s' uses argument with leading single quote. " + "It is probably a mistake. Consider double quotes.", + filename, lineno, option); + } param = line; /* parameter starts here */ while(*line && !ISSPACE(*line)) /* stop also on CRLF */ line++; @@ -192,7 +197,7 @@ ParameterError parseconfig(const char *filename, int max_recursive, case '#': /* comment */ break; default: - warnf("%s:%d: warning: '%s' uses unquoted whitespace. " + warnf("%s:%d Option '%s' uses argument with unquoted whitespace. " "This may cause side-effects. Consider double quotes.", filename, lineno, option); } @@ -240,11 +245,11 @@ ParameterError parseconfig(const char *filename, int max_recursive, res != PARAM_VERSION_INFO_REQUESTED && res != PARAM_ENGINES_REQUESTED && res != PARAM_CA_EMBED_REQUESTED) { - /* only show error in the first level config call */ - if(max_recursive == CONFIG_MAX_LEVELS) { - const char *reason = param2text(res); - errorf("%s:%d: '%s' %s", filename, lineno, option, reason); - } + const char *reason = param2text(res); + errorf("%s:%d config file option '%s' %s", + filename, lineno, option, reason); + if(res == PARAM_OPTION_UNKNOWN) + res = PARAM_CONFIG_OPTION_UNKNOWN; err = res; } } diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am index ca44e3d2b0..ecbcc28fe9 100644 --- a/tests/data/Makefile.am +++ b/tests/data/Makefile.am @@ -229,7 +229,7 @@ test1670 test1671 \ test1680 test1681 test1682 test1683 \ \ test1700 test1701 test1702 test1703 test1704 test1705 test1706 test1707 \ -test1708 test1709 test1710 test1711 \ +test1708 test1709 test1710 test1711 test1712 \ \ test1800 test1801 test1802 test1847 test1848 \ \ diff --git a/tests/data/test1712 b/tests/data/test1712 new file mode 100644 index 0000000000..5cdc642d09 --- /dev/null +++ b/tests/data/test1712 @@ -0,0 +1,61 @@ + + + + +HTTP +--config + + + +# Server-side + + +HTTP/1.1 200 OK +Date: Tue, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT +ETag: "21025-dc7-39462498" +Accept-Ranges: bytes +Content-Length: 6 +Connection: close +Content-Type: text/html +Funny-head: yesyes + +-foo- + + + +# Client-side + + +http + + +config file with argument using single quotes + + +data = 'arg-with-quote' + + +http://%HOSTIP:%HTTPPORT/%TESTNUMBER --config %LOGDIR/config --silent + + + +# Verify data after the test has been "shot" + + +POST /%TESTNUMBER HTTP/1.1 +Host: %HOSTIP:%HTTPPORT +User-Agent: curl/%VERSION +Accept: */* +Content-Length: 16 +Content-Type: application/x-www-form-urlencoded + +'arg-with-quote' + + +Warning: %LOGDIR/config:1 Option 'data' uses argument with leading single quote.%SP +It is probably a mistake. Consider double quotes. + + + diff --git a/tests/data/test459 b/tests/data/test459 index 5d62307728..7a2e1db7b3 100644 --- a/tests/data/test459 +++ b/tests/data/test459 @@ -54,8 +54,8 @@ Content-Type: application/x-www-form-urlencoded arg -Warning: %LOGDIR/config:1: warning: 'data' uses unquoted whitespace. This may%SP -Warning: cause side-effects. Consider double quotes. +Warning: %LOGDIR/config:1 Option 'data' uses argument with unquoted whitespace.%SP +Warning: This may cause side-effects. Consider double quotes. diff --git a/tests/runtests.pl b/tests/runtests.pl index e0bc468f10..e8612d2756 100755 --- a/tests/runtests.pl +++ b/tests/runtests.pl @@ -1346,6 +1346,22 @@ sub singletest_check { normalize_text(\@validstderr); normalize_text(\@actual); } + if($filemode && ($filemode eq "warn")) { + for(@validstderr) { + s/Warning: //; + s/\r//; + s/\n/ /; + } + for(@actual) { + s/Warning: //; + s/\r//; + s/\n/ /; + } + my $v = join(@validstderr, ""); + my $a = join(@actual, ""); + @validstderr = $v; + @actual = $a; + } if($hash{'nonewline'}) { # Yes, we must cut off the final newline from the final line