← Commit list

8e3a2a64d1

Daniel Stenberg
Daniel Stenberg
2026-02-22
SUCCESS Duration: 336s

Subject

tool: improve config error messaging

Binary

No binary (build failed)

Architecture & Compiler Flags

Architecture: x86_64-linux-gnu Compiler: gcc (Ubuntu 11.4.0-1ubuntu1~22.04.3) 11.4.0

—

Build Log

(log yok)

Commit Diff GitHub →

docs/tests/FILEFORMAT.md+5 -1
@@ -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
`<strip>` and `<strippart>` rules are applied before comparisons are made.
-### `<stderr [mode="text"] [nonewline="yes"] [crlf="yes|headers"]>`
+### `<stderr [mode="text/warn"] [nonewline="yes"] [crlf="yes|headers"]>`
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.
src/tool_getparam.h+1 -0
@@ -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,
src/tool_helpers.c+2 -0
@@ -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:
src/tool_parsecfg.c+11 -6
@@ -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;
}
}
tests/data/Makefile.am+1 -1
@@ -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 \
\
tests/data/test1712+61 -0
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="US-ASCII"?>
+<testcase>
+<info>
+<keywords>
+HTTP
+--config
+</keywords>
+</info>
+
+# Server-side
+<reply>
+<data crlf="headers">
+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-
+</data>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+<name>
+config file with argument using single quotes
+</name>
+<file name="%LOGDIR/config">
+data = 'arg-with-quote'
+</file>
+<command>
+http://%HOSTIP:%HTTPPORT/%TESTNUMBER --config %LOGDIR/config --silent
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<protocol crlf="yes" nonewline="yes">
+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'
+</protocol>
+<stderr mode="warn">
+Warning: %LOGDIR/config:1 Option 'data' uses argument with leading single quote.%SP
+It is probably a mistake. Consider double quotes.
+</stderr>
+</verify>
+</testcase>
tests/data/test459+2 -2
@@ -54,8 +54,8 @@ Content-Type: application/x-www-form-urlencoded
arg
</protocol>
<stderr mode="text">
-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.
</stderr>
</verify>
</testcase>
tests/runtests.pl+16 -0
@@ -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