]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
wcurl: import v2026.01.05
authorSamuel Henrique <samueloph@debian.org>
Tue, 6 Jan 2026 05:48:10 +0000 (21:48 -0800)
committerDaniel Stenberg <daniel@haxx.se>
Tue, 6 Jan 2026 09:12:31 +0000 (10:12 +0100)
Closes #20194

docs/wcurl.md
scripts/wcurl

index ab5c3aaa972288ca0c185a0dfbe4715fc9d20ad3..6b214e7e39567607ca5eb25825b42cdd0bed30d7 100644 (file)
@@ -53,7 +53,7 @@ By default, **wcurl** does:
 ## * Automatically choose a filename as output;
 
 ## * Avoid overwriting files
-     if the installed curl's version is \>= 7.83.0 (--no-clobber);
+    if the installed curl's version is \>= 7.83.0 (--no-clobber);
 
 ## * Perform retries;
 
index cbdbb327e4e988feaa14d85ea4ee7d2d51d1d34e..c39806cf946db5ad98d16a56bb5927f8e0e43255 100755 (executable)
@@ -29,7 +29,7 @@
 # Stop on errors and on usage of unset variables.
 set -eu
 
-VERSION="2025.11.09"
+VERSION="2026.01.05"
 
 PROGRAM_NAME="$(basename "$0")"
 readonly PROGRAM_NAME
@@ -64,10 +64,10 @@ Options:
                            number appended to the end (curl >= 7.83.0). If this option is provided
                            multiple times, only the last value is considered.
 
-  --no-decode-filename: Don't percent-decode the output filename, even if the percent-encoding in
+  --no-decode-filename: Do not percent-decode the output filename, even if the percent-encoding in
                         the URL was done by wcurl, e.g.: The URL contained whitespace.
 
-  --dry-run: Don't actually execute curl, just print what would be invoked.
+  --dry-run: Do not actually execute curl, just print what would be invoked.
 
   -V, --version: Print version information.
 
@@ -118,7 +118,8 @@ readonly PER_URL_PARAMETERS="\
 # characters.
 # 2F = /
 # 5C = \
-readonly UNSAFE_PERCENT_ENCODE="%2F %5C"
+# 3A = :
+readonly UNSAFE_PERCENT_ENCODE="%2F %5C %3A"
 
 # Whether to invoke curl or not.
 DRY_RUN="false"
@@ -167,7 +168,7 @@ percent_decode()
         # If character is a "%", read the next character as decode_hex1.
         if [ "${decode_out}" = % ] && IFS= read -r decode_hex1; then
             decode_out="${decode_out}${decode_hex1}"
-            # If there's one more character, read it as decode_hex2.
+            # If there is one more character, read it as decode_hex2.
             if IFS= read -r decode_hex2; then
                 decode_out="${decode_out}${decode_hex2}"
                 # Skip decoding if this is a control character (00-1F).
@@ -190,10 +191,11 @@ get_url_filename()
 {
     # Remove protocol and query string if present.
     hostname_and_path="$(printf %s "${1}" | sed -e 's,^[^/]*//,,' -e 's,?.*$,,')"
-    # If what remains contains a slash, there's a path; return it percent-decoded.
+    # If what remains contains a slash, there is a path; return it percent-decoded.
     case "${hostname_and_path}" in
         # sed to remove everything preceding the last '/', e.g.: "example/something" becomes "something"
-        */*) percent_decode "$(printf %s "${hostname_and_path}" | sed -e 's,^.*/,,')" ;;
+        # sed to also replace ':' with the percent_encoded %3A
+        */*) percent_decode "$(printf %s "${hostname_and_path}" | sed -e 's,^.*/,,' -e 's,:,%3A,g')" ;;
     esac
     # No slash means there was just a hostname and no path; return empty string.
 }
@@ -210,37 +212,39 @@ exec_curl()
 
     CURL_NO_CLOBBER=""
     CURL_PARALLEL=""
-    # --no-clobber is only supported since 7.83.0.
-    # --parallel is only supported since 7.66.0.
-    # --parallel-max-host is only supported since 8.16.0.
+
     if [ "${curl_version_major}" -ge 8 ]; then
         CURL_NO_CLOBBER="--no-clobber"
-        CURL_PARALLEL="--parallel"
-        if [ "${curl_version_minor}" -ge 16 ]; then
-            CURL_PARALLEL="--parallel --parallel-max-host 5"
+        CURL_PARALLEL="--parallel --parallel-max-host 5"
+
+        # --parallel-max-host is only supported since 8.16.0.
+        if [ "${curl_version_major}" -eq 8 ] && [ "${curl_version_minor}" -lt 16 ]; then
+            CURL_PARALLEL="--parallel"
         fi
     elif [ "${curl_version_major}" -eq 7 ]; then
+        # --no-clobber is only supported since 7.83.0.
         if [ "${curl_version_minor}" -ge 83 ]; then
             CURL_NO_CLOBBER="--no-clobber"
         fi
+        # --parallel is only supported since 7.66.0.
         if [ "${curl_version_minor}" -ge 66 ]; then
             CURL_PARALLEL="--parallel"
         fi
     fi
 
-    # Detecting whether we need --parallel. It's easier to rely on
+    # Detecting whether we need --parallel. It is easier to rely on
     # the shell's argument parsing.
     # shellcheck disable=SC2086
     set -- $URLS
 
-    # If there are less than two URLs, don't set the parallel flag.
+    # If there are less than two URLs, do not set the parallel flag.
     if [ "$#" -lt 2 ]; then
         CURL_PARALLEL=""
     fi
 
     # Start assembling the command.
     #
-    # We use 'set --' here (again) because (a) we don't have arrays on
+    # We use 'set --' here (again) because (a) we do not have arrays on
     # POSIX shell, and (b) we need better control over the way we
     # split arguments.
     #