diff --git a/.github/scripts/spacecheck.pl b/.github/scripts/spacecheck.pl
index fbd064db3b..fc1bf8f76c 100755
--- a/.github/scripts/spacecheck.pl
+++ b/.github/scripts/spacecheck.pl
@@ -42,10 +42,6 @@ my @need_crlf = (
"\\.(bat|sln)\$",
);
-my @space_at_eol = (
- "^tests/data/test",
-);
-
my @non_ascii_allowed = (
'\xC3\xB6', # UTF-8 for https://codepoints.net/U+00F6 LATIN SMALL LETTER O WITH DIAERESIS
);
@@ -129,8 +125,7 @@ while(my $filename = <$git_ls_files>) {
push @err, "content: must use LF EOL for this file type";
}
- if(!fn_match($filename, @space_at_eol) &&
- $content =~ /[ \t]\n/) {
+ if($content =~ /[ \t]\n/) {
my $line;
for my $l (split(/\n/, $content)) {
$line++;
diff --git a/docs/tests/FILEFORMAT.md b/docs/tests/FILEFORMAT.md
index 91aa9a5870..cbc9221056 100644
--- a/docs/tests/FILEFORMAT.md
+++ b/docs/tests/FILEFORMAT.md
@@ -76,6 +76,14 @@ For example, to insert the word hello 100 times:
%repeat[100 x hello]%
+## Whitespace
+
+To add significant whitespace characters at the end of the line, or to empty
+lines:
+
+ %spc%
+ %tab%
+
## Insert capped epoch days
Mostly to test capped cookie expire dates: `%days[NUM]` inserts the number of
diff --git a/tests/data/test1029 b/tests/data/test1029
index f37146a747..d019bff7b1 100644
--- a/tests/data/test1029
+++ b/tests/data/test1029
@@ -50,7 +50,7 @@ Content-Length: 62
Connection: close
This server reply is for testing a simple Location: following
-http://%HOSTIP:%HTTPPORT/we/want/our/data/%TESTNUMBER0002.txt?coolsite=yes http://%HOSTIP:%HTTPPORT/we/want/our/%TESTNUMBER 0
+http://%HOSTIP:%HTTPPORT/we/want/our/data/%TESTNUMBER0002.txt?coolsite=yes http://%HOSTIP:%HTTPPORT/we/want/our/%TESTNUMBER 0%spc%
diff --git a/tests/data/test1070 b/tests/data/test1070
index 7f2b4fb09b..f199e71d4b 100644
--- a/tests/data/test1070
+++ b/tests/data/test1070
@@ -57,7 +57,7 @@ Expect: 100-continue
Content-Length: 2313
Content-Type: application/x-www-form-urlencoded
-This creates
+This creates%spc%
diff --git a/tests/data/test1185 b/tests/data/test1185
index 7323c59a0d..c00e982301 100644
--- a/tests/data/test1185
+++ b/tests/data/test1185
@@ -91,7 +91,7 @@ void startfunc(int a, int b) {
./%LOGDIR/code1185.c:4:82: warning: Longer than 79 columns (LONGLINE)
int hello; /*------------------------------------------------------------------*/
./%LOGDIR/code1185.c:5:4: error: Contains TAB character (TABS)
- int tab;
+ int%tab%tab;
^
./%LOGDIR/code1185.c:7:13: warning: func with space (SPACEBEFOREPAREN)
int a = func ();
@@ -118,7 +118,7 @@ void startfunc(int a, int b) {
} else {
^
./%LOGDIR/code1185.c:24:11: warning: missing space after close paren (PARENBRACE)
- if(a == 2){
+ if(a == 2){%spc%%spc%
^
./%LOGDIR/code1185.c:28:14: warning: no space before semicolon (SPACESEMICOLON)
func_return() ;
@@ -205,10 +205,10 @@ void startfunc(int a, int b) {
// CPP comment ?
^
./%LOGDIR/code1185.c:1:1: error: Missing copyright statement (COPYRIGHT)
-
+%spc%
^
./%LOGDIR/code1185.c:1:1: error: Missing closing comment (OPENCOMMENT)
-
+%spc%
^
checksrc: 0 errors and 41 warnings
diff --git a/tests/data/test136 b/tests/data/test136
index 949ae2ebb2..70537719cc 100644
--- a/tests/data/test136
+++ b/tests/data/test136
@@ -30,7 +30,7 @@ FTP with user and no password
USER user
-PASS
+PASS%spc%
PWD
EPSV
TYPE I
diff --git a/tests/data/test1461 b/tests/data/test1461
index 79b370bc18..71de31772d 100644
--- a/tests/data/test1461
+++ b/tests/data/test1461
@@ -47,8 +47,8 @@ Usage: curl [options...]
This is not the full help; this menu is split into categories.
Use "--help category" to get an overview of all categories, which are:
-auth, connection, curl, deprecated, dns, file, ftp, global, http, imap, ldap,
-output, pop3, post, proxy, scp, sftp, smtp, ssh, telnet, tftp, timeout, tls,
+auth, connection, curl, deprecated, dns, file, ftp, global, http, imap, ldap,%spc%
+output, pop3, post, proxy, scp, sftp, smtp, ssh, telnet, tftp, timeout, tls,%spc%
upload, verbose.
Use "--help all" to list all options
Use "--help [option]" to view documentation for a given option
diff --git a/tests/data/test1654 b/tests/data/test1654
index 5659277ce3..3b88236441 100644
--- a/tests/data/test1654
+++ b/tests/data/test1654
@@ -27,7 +27,7 @@ h2 example.com 443 h3 shiny.example.com 8443 "20191231 00:00:00" 0 0
# a comment
h2 foo.example.com 443 h3 shiny.example.com 8443 "20291231 23:30:00" 0 0
h1 example.com 443 h3 shiny.example.com 8443 "20121231 00:00:01" 0 0
- h3 example.com 443 h3 shiny.example.com 8443 "20131231 00:00:00" 0 0
+%tab%h3 example.com 443 h3 shiny.example.com 8443 "20131231 00:00:00" 0 0
# also a comment
bad example.com 443 h3 shiny.example.com 8443 "20191231 00:00:00" 0 0
rubbish
diff --git a/tests/data/test1664 b/tests/data/test1664
index b36ef3597d..ea126a3be7 100644
--- a/tests/data/test1664
+++ b/tests/data/test1664
@@ -68,7 +68,7 @@ curlx_str_singlespace
3: ("b") 5, line 0
4: ("\") 5, line 0
5: (" ") 0, line 1
-6: (" ") 5, line 0
+6: ("%tab%") 5, line 0
7: ("
") 5, line 0
8: ("") 5, line 0
diff --git a/tests/data/test17 b/tests/data/test17
index 97a37d85cf..c8c0a19b77 100644
--- a/tests/data/test17
+++ b/tests/data/test17
@@ -46,7 +46,7 @@ request MOOO
MOOO /that.site.com/%TESTNUMBER HTTP/1.1
Host: %HOSTIP:%HTTPPORT
-User-Agent: agent007 license to drill
+User-Agent: agent007 license to drill%tab%
Accept: */*
diff --git a/tests/data/test188 b/tests/data/test188
index 43fa70e726..2fca251129 100644
--- a/tests/data/test188
+++ b/tests/data/test188
@@ -19,7 +19,7 @@ Content-Length: 3
OK
-HTTP/1.1 200 OK
+HTTP/1.1 200 OK%spc%
Connection: close
Content-Length: 15
Content-Range: bytes 50-
@@ -32,7 +32,7 @@ HTTP/1.1 301 OK swsbounce
Location: /%TESTNUMBER
Content-Length: 3
-HTTP/1.1 200 OK
+HTTP/1.1 200 OK%spc%
Connection: close
Content-Length: 15
Content-Range: bytes 50-
diff --git a/tests/data/test189 b/tests/data/test189
index 6ca4b66e17..d3cd0f2b2c 100644
--- a/tests/data/test189
+++ b/tests/data/test189
@@ -16,7 +16,7 @@ Content-Length: 3
OK
-HTTP/1.1 200 OK
+HTTP/1.1 200 OK%spc%
Connection: close
Content-Length: 15
@@ -28,7 +28,7 @@ HTTP/1.1 301 OK swsbounce
Location: /%TESTNUMBER
Content-Length: 3
-HTTP/1.1 200 OK
+HTTP/1.1 200 OK%spc%
Connection: close
Content-Length: 15
diff --git a/tests/data/test1940 b/tests/data/test1940
index f4c6dd1a1a..d15bf1d5b6 100644
--- a/tests/data/test1940
+++ b/tests/data/test1940
@@ -10,10 +10,10 @@ curl_easy_header
HTTP/1.1 200 OK
Date: Thu, 09 Nov 2010 14:49:00 GMT
-Server: test with trailing space
+Server: test with trailing space%repeat[5 x ]%
Content-Type: text/html
Fold: is
- folding a
+ folding a%repeat[5 x ]%
line
Content-Length: 0
Set-Cookie: onecookie=data;
@@ -59,8 +59,8 @@ http://%HOSTIP:%HTTPPORT/%TESTNUMBER
- Set-Cookie == secondcookie=2data; (1/3)
- Set-Cookie == cookie3=data3; (2/3)
Fold == is folding a line
- Blank ==
- Blank2 ==
+ Blank ==%spc%
+ Blank2 ==%spc%
diff --git a/tests/data/test1941 b/tests/data/test1941
index fe3f1de391..9ef4b3b1e4 100644
--- a/tests/data/test1941
+++ b/tests/data/test1941
@@ -11,7 +11,7 @@ CONNECT
HTTP/1.1 200 OK
Date: Thu, 09 Nov 2010 14:49:00 GMT
-Server: test with trailing space
+Server: test with trailing space%repeat[5 x ]%
Content-Type: text/html
Content-Length: 0
Set-Cookie: onecookie=data;
diff --git a/tests/data/test1942 b/tests/data/test1942
index 9079800990..7729ff80e6 100644
--- a/tests/data/test1942
+++ b/tests/data/test1942
@@ -15,7 +15,7 @@ Server: maybe different
HTTP/1.1 200 OK
Date: Thu, 09 Nov 2010 14:49:00 GMT
-Server: test with trailing space
+Server: test with trailing space%repeat[5 x ]%
Content-Type: text/html
Content-Length: 0
Set-Cookie: onecookie=data;
diff --git a/tests/data/test1944 b/tests/data/test1944
index ad0920d4ae..a5c1673c79 100644
--- a/tests/data/test1944
+++ b/tests/data/test1944
@@ -10,7 +10,7 @@ curl_easy_header
HTTP/1.1 302 OK
Date: Thu, 01 Nov 2001 14:49:00 GMT
-Server: test with trailing space
+Server: test with trailing space%repeat[5 x ]%
Content-Type: text/html
Content-Length: 0
Set-Cookie: onecookie=data;
diff --git a/tests/data/test1945 b/tests/data/test1945
index 86fa147adc..1b30965f60 100644
--- a/tests/data/test1945
+++ b/tests/data/test1945
@@ -11,7 +11,7 @@ CONNECT
HTTP/1.1 200 OK
Date: Thu, 09 Nov 2010 14:49:00 GMT
-Server: test with trailing space
+Server: test with trailing space%repeat[5 x ]%
Content-Type: text/html
Content-Length: 0
Set-Cookie: onecookie=data;
diff --git a/tests/data/test1946 b/tests/data/test1946
index 20854e16ba..35ca1672bd 100644
--- a/tests/data/test1946
+++ b/tests/data/test1946
@@ -10,7 +10,7 @@ curl_easy_header
HTTP/1.1 302 OK
Date: Thu, 01 Nov 2001 14:49:00 GMT
-Server: test with trailing space
+Server: test with trailing space%repeat[5 x ]%
Content-Type: text/html
Content-Length: 0
Set-Cookie: onecookie=data;
diff --git a/tests/data/test1947 b/tests/data/test1947
index f159e4d51c..49e28c14aa 100644
--- a/tests/data/test1947
+++ b/tests/data/test1947
@@ -10,7 +10,7 @@ curl_easy_nextheader
HTTP/1.1 302 OK
Date: Thu, 01 Nov 2001 14:49:00 GMT
-Server: test with trailing space
+Server: test with trailing space%repeat[5 x ]%
Content-Type: text/html
Content-Length: 0
Set-Cookie: onecookie=data;
diff --git a/tests/data/test1955 b/tests/data/test1955
index 2266529bbe..be23a9d628 100644
--- a/tests/data/test1955
+++ b/tests/data/test1955
@@ -66,7 +66,7 @@ Authorization: XXX4-HMAC-SHA256 Credential=xxx/19700101/ple/exam/xxx4_request, S
X-Xxx-Date: 19700101T000000Z
test3: 1234
test2:
-test_space: t s m end
+test_space: t%tab%s m%tab% end%repeat[4 x ]%
tesMixCase: MixCase
diff --git a/tests/data/test1958 b/tests/data/test1958
index 239a11eccb..23aa849444 100644
--- a/tests/data/test1958
+++ b/tests/data/test1958
@@ -64,7 +64,7 @@ GET /aws_sigv4/testapi/test HTTP/1.1
Host: exam.ple.com:9000
Authorization: XXX4-HMAC-SHA256 Credential=xxx/19700101/ple/exam/xxx4_request, SignedHeaders=content-type;host;x-xxx-content-sha256;x-xxx-date, Signature=25b4cac711ea8f65010c485d3778885f5f3870d0b8ff0b3ab58a8d7eeab991ff
X-Xxx-Date: 19700101T000000Z
-X-Xxx-Content-Sha256: arbitrary
+X-Xxx-Content-Sha256: %tab%arbitrary%spc%
diff --git a/tests/data/test2302 b/tests/data/test2302
index 117b5a7ebf..0b3a7d524e 100644
--- a/tests/data/test2302
+++ b/tests/data/test2302
@@ -66,7 +66,7 @@ Connection: Upgrade
%hex[%8a%808321]hex%
-68 65 6c 6c 6f
+68 65 6c 6c 6f%spc%
RECFLAGS: 1
diff --git a/tests/data/test2306 b/tests/data/test2306
index 0f7bd541df..c6bbdb0f2b 100644
--- a/tests/data/test2306
+++ b/tests/data/test2306
@@ -24,7 +24,7 @@ Funny-head: yesyes
HTTP/1.1 200 OK swsclose
- Access-Control-Allow-Origin: *
+%tab%Access-Control-Allow-Origin: *
Connection: Keep-Alive
Content-Type: text/html; charset=utf-8
Date: Wed, 10 May 2023 14:58:08 GMT
diff --git a/tests/data/test2400 b/tests/data/test2400
index 9d53f68b96..cb68a11e21 100644
--- a/tests/data/test2400
+++ b/tests/data/test2400
@@ -50,7 +50,7 @@ HTTP/2 GET over HTTPS
# Verify data after the test has been "shot"
-HTTP/2 200
+HTTP/2 200%spc%
date: Tue, 09 Nov 2010 14:49:00 GMT
content-length: 6
content-type: text/html
diff --git a/tests/data/test2403 b/tests/data/test2403
index 5901866265..dec03cd51c 100644
--- a/tests/data/test2403
+++ b/tests/data/test2403
@@ -51,7 +51,7 @@ HTTP/2 GET using %{header_json}
# Verify data after the test has been "shot"
-HTTP/2 200
+HTTP/2 200%spc%
date: Tue, 09 Nov 2010 14:49:00 GMT
content-length: 6
content-type: text/html
diff --git a/tests/data/test2406 b/tests/data/test2406
index bc6cc41ad2..a6db9233ef 100644
--- a/tests/data/test2406
+++ b/tests/data/test2406
@@ -49,7 +49,7 @@ HTTP/2 over HTTPS with -f
# Verify data after the test has been "shot"
-HTTP/2 404
+HTTP/2 404%spc%
date: Tue, 09 Nov 2010 14:49:00 GMT
content-length: 6
content-type: text/html
diff --git a/tests/data/test2500 b/tests/data/test2500
index 8bcb5e0c62..ad6f0b7e1a 100644
--- a/tests/data/test2500
+++ b/tests/data/test2500
@@ -58,7 +58,7 @@ Accept: */*
-HTTP/3 200
+HTTP/3 200%spc%
date: Tue, 09 Nov 2010 14:49:00 GMT
last-modified: Tue, 13 Jun 2000 12:10:00 GMT
etag: "21025-dc7-39462498"
diff --git a/tests/data/test2503 b/tests/data/test2503
index f95486ce0f..28a1f973b5 100644
--- a/tests/data/test2503
+++ b/tests/data/test2503
@@ -50,7 +50,7 @@ HTTP/3 header-api
# Verify data after the test has been "shot"
-HTTP/3 200
+HTTP/3 200%spc%
date: Tue, 09 Nov 2010 14:49:00 GMT
content-length: 6
content-type: text/html
diff --git a/tests/data/test378 b/tests/data/test378
index 9777b878b9..e15e97e6e0 100644
--- a/tests/data/test378
+++ b/tests/data/test378
@@ -29,7 +29,7 @@ Reject using -T and -d at once
2
-Warning: You can only select one HTTP request method! You asked for both PUT
+Warning: You can only select one HTTP request method! You asked for both PUT%spc%
Warning: (-T, --upload-file) and POST (-d, --data).
diff --git a/tests/data/test4 b/tests/data/test4
index 06012cca86..4f57f8dd62 100644
--- a/tests/data/test4
+++ b/tests/data/test4
@@ -44,7 +44,7 @@ User-Agent: curl/%VERSION
extra-header: here
Accept: replaced
X-Custom-Header:
-X-Test: foo;
+X-Test: foo;%spc%
X-Test2: foo;
GET /%TESTNUMBER HTTP/1.1
@@ -53,7 +53,7 @@ User-Agent: curl/%VERSION
extra-header: here
Accept: replaced
X-Custom-Header:
-X-Test: foo;
+X-Test: foo;%spc%
X-Test2: foo;
diff --git a/tests/data/test421 b/tests/data/test421
index 2c79c1f8f1..b9483e6ba0 100644
--- a/tests/data/test421
+++ b/tests/data/test421
@@ -21,7 +21,7 @@ referrer-policy: strict-origin-when-cross-origin
access-control-allow-methods: GET, POST, PUT, DELETE, OPTIONS
access-control-max-age: 1728000
access-control-allow-headers: Authorization, Content-Type, AuthorizationOauth, X-EARLY-ACCESS
-access-control-expose-headers:
+access-control-expose-headers:%spc%
vary: Accept
etag: W/"2678f9ab2ba550d164e7cc014aefd31e"
cache-control: max-age=0, private, must-revalidate
diff --git a/tests/data/test459 b/tests/data/test459
index 198e67d2a3..d1f1ba261c 100644
--- a/tests/data/test459
+++ b/tests/data/test459
@@ -56,7 +56,7 @@ Content-Type: application/x-www-form-urlencoded
arg
-Warning: %LOGDIR/config:1: warning: 'data' uses unquoted whitespace. This may
+Warning: %LOGDIR/config:1: warning: 'data' uses unquoted whitespace. This may%spc%
Warning: cause side-effects. Consider double quotes.
diff --git a/tests/data/test46 b/tests/data/test46
index 30d88b973d..d426503fe7 100644
--- a/tests/data/test46
+++ b/tests/data/test46
@@ -65,7 +65,7 @@ www.loser.com FALSE / FALSE 2139150993 UID 99
domain..tld FALSE / FALSE 2139150993 mooo indeed
#HttpOnly_domain..tld FALSE /want FALSE 2139150993 mooo2 indeed2
%endif
-domain..tld FALSE /want FALSE 0 empty
+domain..tld FALSE /want FALSE 0 empty%tab%
cookies
@@ -88,18 +88,18 @@ Cookie: empty=; mooo2=indeed2; mooo=indeed
# This file was generated by libcurl! Edit at your own risk.
domain..tld FALSE /want/ FALSE 0 simplyhuge %repeat[3998 x z]%
-domain..tld FALSE / FALSE 0 justaname
+domain..tld FALSE / FALSE 0 justaname%tab%
domain..tld FALSE / FALSE 0 ASPSESSIONIDQGGQQSJJ GKNBDIFAAOFDPDAIEAKDIBKE
domain..tld FALSE / FALSE 0 ckySession temporary
domain..tld FALSE / FALSE %days[400] ckyPersistent permanent
%if large-time
-domain..tld FALSE /want FALSE 0 empty
+domain..tld FALSE /want FALSE 0 empty%tab%
#HttpOnly_domain..tld FALSE /want FALSE 22139150993 mooo2 indeed2
domain..tld FALSE / FALSE 22139150993 mooo indeed
www.loser.com FALSE / FALSE 22139150993 UID 99
www.fake.come FALSE / FALSE 22147483647 cookiecliente si
%else
-domain..tld FALSE /want FALSE 0 empty
+domain..tld FALSE /want FALSE 0 empty%tab%
#HttpOnly_domain..tld FALSE /want FALSE 2139150993 mooo2 indeed2
domain..tld FALSE / FALSE 2139150993 mooo indeed
www.loser.com FALSE / FALSE 2139150993 UID 99
diff --git a/tests/data/test54 b/tests/data/test54
index 478e52a32c..c0be2d624e 100644
--- a/tests/data/test54
+++ b/tests/data/test54
@@ -11,7 +11,7 @@ followlocation
HTTP/1.1 302 This is a weirdo text message swsclose
Connection: close
-Location:
+Location:%spc%
This server reply is for testing
diff --git a/tests/data/test57 b/tests/data/test57
index d3360096b9..a28d6321e2 100644
--- a/tests/data/test57
+++ b/tests/data/test57
@@ -12,7 +12,7 @@ HTTP GET
HTTP/1.1 200 OK swsclose
Funny-head: yesyes
-Content-Type: text/html; charset=ISO-8859-4
+Content-Type: text/html; charset=ISO-8859-4%repeat[3 x ]%
diff --git a/tests/data/test59 b/tests/data/test59
index 6ccb1ce37f..4211b4e6d2 100644
--- a/tests/data/test59
+++ b/tests/data/test59
@@ -13,7 +13,7 @@ HTTP/1.0 200 OK swsclose
Date: Tue, 09 Nov 2010 14:49:00 GMT
Server: test-server/fake
-hej
+hej
diff --git a/tests/data/test689 b/tests/data/test689
index 61e57fce4a..141e92a9e6 100644
--- a/tests/data/test689
+++ b/tests/data/test689
@@ -11,9 +11,9 @@ OPTIONS
# Server-side
-RTSP/1.0 786
+RTSP/1.0 786%repeat[10 x ]%
-RTSP/
+RTSP/%repeat[10 x ]%
diff --git a/tests/data/test769 b/tests/data/test769
index 773d741e3f..189bf95d81 100644
--- a/tests/data/test769
+++ b/tests/data/test769
@@ -16,7 +16,7 @@ Server: test-server/fake
Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT
ETag: "21025-dc7-39462498"
Accept-Ranges: bytes
-Content-Length: 6
+Content-Length: 6%repeat[5 x ]%
Connection: close
Content-Type: text/html
Funny-head: yesyes
diff --git a/tests/data/test792 b/tests/data/test792
index a7656e4781..b3630b5058 100644
--- a/tests/data/test792
+++ b/tests/data/test792
@@ -36,7 +36,7 @@ machine %HOSTIP login username password%hex[%00]hex% hello
USER username
-PASS
+PASS%spc%
PWD
EPSV
TYPE I
diff --git a/tests/data/test793 b/tests/data/test793
index ad68a0f4e1..3a3e16e087 100644
--- a/tests/data/test793
+++ b/tests/data/test793
@@ -36,7 +36,7 @@ machine %HOSTIP login username "password"%hex[%00]hex% hello
USER username
-PASS
+PASS%spc%
PWD
EPSV
TYPE I
diff --git a/tests/testutil.pm b/tests/testutil.pm
index 3477d5bb57..92f031ded3 100644
--- a/tests/testutil.pm
+++ b/tests/testutil.pm
@@ -147,6 +147,9 @@ sub subbase64 {
$$thing =~ s/%%DAYS%%/%alternatives[$d,$d2]/;
}
+ $$thing =~ s/%spc%/ /g; # space
+ $$thing =~ s/%tab%/\t/g; # horizontal tab
+
# include a file
$$thing =~ s/%include ([^%]*)%[\n\r]+/includefile($1)/ge;
}