Skip to content

Commit 10dc1df

Browse files
committed
Release v2025.11.04
1 parent f62eba6 commit 10dc1df

File tree

3 files changed

+122
-3
lines changed

3 files changed

+122
-3
lines changed

CHANGELOG.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@ SPDX-License-Identifier: curl
88

99
# Changelog
1010

11-
## [UNRELEASED]
12-
* Don't percent-decode `/` and `\` in output file name.
11+
## [v2025.11.04]
12+
* Fix CVE-2025-11563: Don't percent-decode `/` and `\` in output file name to
13+
avoid path traversal.
1314
* Fix typos reported by pyspelling.
1415
* Multiple improvements to GitHub Actions.
1516

wcurl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
# Stop on errors and on usage of unset variables.
3030
set -eu
3131

32-
VERSION="2025.09.27+dev"
32+
VERSION="2025.11.04"
3333

3434
PROGRAM_NAME="$(basename "$0")"
3535
readonly PROGRAM_NAME

wcurl.1

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
.\" generated by cd2nroff 0.1 from wcurl.md
2+
.TH wcurl 1 "2025-11-04" wcurl
3+
.SH NAME
4+
\fBwcurl\fP \- a simple wrapper around curl to easily download files.
5+
.SH SYNOPSIS
6+
\fBwcurl <URL>...\fP
7+
8+
\fBwcurl [\--curl\-options <CURL_OPTIONS>]... [\--dry\-run] [\--no\-decode\-filename] [\-o|\-O|\--output <PATH>] [\--] <URL>...\fP
9+
10+
\fBwcurl [\--curl\-options=<CURL_OPTIONS>]... [\--dry\-run] [\--no\-decode\-filename] [\--output=<PATH>] [\--] <URL>...\fP
11+
12+
\fBwcurl \-V|\--version\fP
13+
14+
\fBwcurl \-h|\--help\fP
15+
.SH DESCRIPTION
16+
\fBwcurl\fP is a simple curl wrapper which lets you use curl to download files
17+
without having to remember any parameters.
18+
19+
Simply call \fBwcurl\fP with a list of URLs you want to download and \fBwcurl\fP
20+
picks sane defaults.
21+
22+
If you need anything more complex, you can provide any of curl\(aqs supported
23+
parameters via the \fB\--curl\-options\fP option. Just beware that you likely
24+
should be using curl directly if your use case is not covered.
25+
26+
By default, \fBwcurl\fP does:
27+
.IP "* Percent-encode whitespace in URLs;"
28+
.IP "* Download multiple URLs in parallel"
29+
.nf
30+
if the installed curl's version is \>= 7.66.0 (--parallel);
31+
.fi
32+
.IP "* Use a total number of 5 parallel connections to the same protocol + hostname + port number target"
33+
.nf
34+
if the installed curl's version is \>= 8.16.0 (--parallel-max-host);
35+
.fi
36+
.IP "* Follow redirects;"
37+
.IP "* Automatically choose a filename as output;"
38+
.IP "* Avoid overwriting files"
39+
.nf
40+
if the installed curl's version is \>= 7.83.0 (--no-clobber);
41+
.fi
42+
.IP "* Perform retries;"
43+
.IP "* Set the downloaded file timestamp"
44+
.nf
45+
to the value provided by the server, if available;
46+
.fi
47+
.IP "* Default to https"
48+
.nf
49+
if the URL does not contain any scheme;
50+
.fi
51+
.IP "* Disable curl's URL globbing parser"
52+
.nf
53+
so {} and [] characters in URLs are not treated specially;
54+
.fi
55+
.IP "* Percent-decode the resulting filename;"
56+
.IP "* Use 'index.html' as the default filename"
57+
.nf
58+
if there is none in the URL.
59+
.fi
60+
.SH OPTIONS
61+
.IP "--curl-options, --curl-options=\<CURL_OPTIONS\>..."
62+
Specify extra options to be passed when invoking curl. May be specified more
63+
than once.
64+
.IP "-o, -O, --output, --output=\<PATH\>"
65+
Use the provided output path instead of getting it from the URL. If multiple
66+
URLs are provided, resulting files share the same name with a number appended to
67+
the end (curl >= 7.83.0). If this option is provided multiple times, only the
68+
last value is considered.
69+
.IP --no-decode-filename
70+
Don\(aqt percent\-decode the output filename, even if the percent\-encoding in the
71+
URL was done by \fBwcurl\fP, e.g.: The URL contained whitespace.
72+
.IP --dry-run
73+
Do not actually execute curl, just print what would be invoked.
74+
.IP "-V, \--version"
75+
Print version information.
76+
.IP "-h, \--help"
77+
Print help message.
78+
.SH CURL_OPTIONS
79+
Any option supported by curl can be set here. This is not used by \fBwcurl\fP; it
80+
is instead forwarded to the curl invocation.
81+
.SH URL
82+
URL to be downloaded. Anything that is not a parameter is considered
83+
an URL. Whitespace is percent\-encoded and the URL is passed to curl, which
84+
then performs the parsing. May be specified more than once.
85+
.SH EXAMPLES
86+
Download a single file:
87+
88+
\fBwcurl example.com/filename.txt\fP
89+
90+
Download two files in parallel:
91+
92+
\fBwcurl example.com/filename1.txt example.com/filename2.txt\fP
93+
94+
Download a file passing the \fB\--progress\-bar\fP and \fB\--http2\fP flags to curl:
95+
96+
\fBwcurl \--curl\-options="\--progress\-bar \--http2" example.com/filename.txt\fP
97+
98+
* Resume from an interrupted download. The options necessary to resume the download (\fI\--clobber \--continue\-at \-\fP) must be the \fBlast\fP options specified in \fI\--curl\-options\fP. Note that the only way to resume interrupted downloads is to allow wcurl to overwrite the destination file:
99+
100+
\fBwcurl \--curl\-options="\--clobber \--continue\-at \-" example.com/filename.txt\fP
101+
102+
Download multiple files without a limit of concurrent connections per host (the default limit is 5):
103+
104+
\fBwcurl \--curl\-options="\--parallel\-max\-host 0" example.com/filename1.txt example.com/filename2.txt\fP
105+
.SH AUTHORS
106+
.nf
107+
Samuel Henrique \<[email protected]\>
108+
Sergio Durigan Junior \<[email protected]\>
109+
and many contributors, see the AUTHORS file.
110+
.fi
111+
.SH REPORTING BUGS
112+
If you experience any problems with \fBwcurl\fP that you do not experience with
113+
curl, submit an issue on GitHub: https://github.com/curl/wcurl
114+
.SH COPYRIGHT
115+
\fBwcurl\fP is licensed under the curl license
116+
.SH SEE ALSO
117+
.BR curl (1),
118+
.BR trurl (1)

0 commit comments

Comments
 (0)