curl and libcurl 8.15.1

 Public curl releases:         270
 Command line options:         272
 curl_easy_setopt() options:   308
 Public functions in libcurl:  98
 Contributors:                 3490

This release includes the following changes:

 o build: bump minimum required mingw-w64 to v3.0 (from v1.0) [33]
 o curl: add --follow [129]
 o curl: add --out-null [101]
 o curl: add --parallel-max-host to limit concurrent connections per host [81]
 o curl: make --retry-delay and --retry-max-time accept decimal seconds [112]
 o hostip: cache negative name resolves [175]
 o ip happy eyeballing: keep attempts running [80]
 o mbedtls: bump minimum version required to 3.2.0 [180]
 o multi: add curl_multi_get_offt [56]
 o multi: add CURLMOPT_NETWORK_CHANGED to signal network changed [84]
 o netrc: use the NETRC environment variable (first) if set [70]
 o smtp: allow suffix behind a mail address for RFC 3461 [127]
 o tls: make default TLS version be minimum 1.2 [71]
 o tool_getparam: add support for `--longopt=value` [69]
 o vquic: drop msh3 [8]
 o websocket: support CURLOPT_READFUNCTION [193]
 o writeout: add %time{} [74]

This release includes the following bugfixes:

 o _PROTOCOLS.md: mention file:// is only for absolute paths [102]
 o alpn: query filter [104]
 o ares: destroy channel on shutdown [178]
 o BINDINGS.md: add LibQurl [156]
 o bufq: add integer overflow checks before chunk allocations [108]
 o build: allow libtests/clients to use libcurl dependencies directly [87]
 o build: disable `TCP_NODELAY` for emscripten [176]
 o build: enable _GNU_SOURCE on GNU/Hurd [27]
 o build: extend GNU C guards to clang where applicable, fix fallouts [61]
 o build: fix build errors/warnings in rare configurations [7]
 o build: fix disable-verbose [48]
 o build: fix mingw-w64 version guard for mingw32ce [124]
 o build: if no perl, fix to use the pre-built hugehelp, if present [144]
 o build: link to Apple frameworks required by static wolfSSL [40]
 o build: tidy up compiler definition for tests [37]
 o cf-https-connect: delete unused declaration [15]
 o cmake: capitalize 'Rustls' in the config summary
 o cmake: defer building `unitprotos.h` till a test target needs it [75]
 o cmake: define `WIN32_LEAN_AND_MEAN` for examples [159]
 o cmake: drop redundant unity mode for `curlinfo` [155]
 o cmake: enable `-Wall` for MSVC 1944 [128]
 o cmake: fix `ENABLE_UNIX_SOCKETS=OFF` with pre-fill enabled on unix
 o cmake: fix to disable Schannel and SSPI for non-Windows targets
 o cmake: fix to restrict `SystemConfiguration` to macOS [139]
 o cmake: improve error message for invalid HTTP/3 MultiSSL configs [187]
 o cmake: keep websockets disabled if HTTP is disabled
 o cmake: make `runtests` targets build the curl tool [32]
 o cmake: make the ExternalProject test work [183]
 o cmake: omit linking duplicate/unnecessary libs to tests & examples [45]
 o cmake: re-add simple test target, and name it `tests` [142]
 o cmake: set `CURL_DIRSUFFIX` automatically in multi-config builds [154]
 o CODE_STYLE: sync with recent `checksrc.pl` updates [49]
 o config-win32.h: do not use winsock2 `inet_ntop()`/`inet_pton()` [58]
 o configure: if no perl, disable unity and shell completion, related tidy ups [137]
 o connectdata: remove primary+secondary ip_quadruple [126]
 o connection: terminate after goaway [62]
 o contrithanks: fix for BSD `sed` tool [98]
 o cookie: don't treat the leading slash as trailing [185]
 o cookie: remove expired cookies before listing [158]
 o curl-config: remove X prefix use [138]
 o curl/system.h: fix for GCC 3.3.x and older [38]
 o curl: make the URL indexes 64 bit [117]
 o curl: tool_read_cb fix of segfault [18]
 o curl_addrinfo: drop workaround for old-mingw [14]
 o curl_easy_ssls_export: make the example more clear [78]
 o curl_fnmatch, servers: drop local macros in favour of `sizeof()` [21]
 o curl_mime_data_cb.md: mention what datasize is for [107]
 o curl_ossl: extend callback table for nghttp3 1.11.0 [46]
 o curl_setup.h: move UWP detection after `config-win32.h` (revert) [51]
 o curl_setup.h: move UWP detection after `config-win32.h` [23]
 o CURLOPT: bump `CURL_REDIR_*` macros to `long` [110]
 o CURLOPT: bump `CURL_SSLVERSION_*` macros to `long` [149]
 o CURLOPT: bump `CURLALTSVC_*` macros to `long` [96]
 o CURLOPT: bump `CURLFTP*` enums to `long`, drop casts [54]
 o CURLOPT: bump `CURLHEADER_*` macros to `long`, drop casts [94]
 o CURLOPT: bump `CURLPROTO_*` macros to `long` [148]
 o CURLOPT: bump `CURLPROXY_*` enums to `long`, drop casts [95]
 o CURLOPT: bump `CURLWS_NOAUTOPONG`, `CURLWS_RAW_MODE` macros to `long` [150]
 o CURLOPT: bump remaining macros to `long` [147]
 o CURLOPT: drop redundant `long` casts [55]
 o CURLOPT: replace `(long)` cast with `L` suffix for `CURLHSTS_*` macros
 o CURLOPT_HTTP_VERSION: mention new default value [179]
 o CURLOPT_SSL_CTX_*: replace the base64 with XXXX [171]
 o delta: fix warnings, fix for non-GNU `date` tool [99]
 o DEPRECATE.md: drop support for Windows XP/2003 [31]
 o DEPRECATE.md: remove leftover "nothing" [57]
 o DISTROS.md: add Haiku [39]
 o docs/cmdline-opts: the auth types are not mutually exclusive [103]
 o docs: add CURLOPT type change history, drop casts where present [143]
 o docs: fix name in curl_easy_ssls_export man page [12]
 o doh: rename symbols to avoid collision with mingw-w64 headers [66]
 o easy handle: check validity on external calls [28]
 o examples: drop long cast for `CURLALTSVC_*`
 o examples: remove base64 encoded chunks from examples [189]
 o examples: remove href_extractor.c [186]
 o gnutls: some small cleanups [41]
 o hmac: return error if init fails [2]
 o hostip: do DNS cache pruning in milliseconds [132]
 o http: const up readonly H2_NON_FIELD [10]
 o http: silence `-Warray-bounds` with gcc 13+ [44]
 o inet_pton, inet_ntop: drop declarations when unused [59]
 o lib1560: fix memory leak when run without UTF-8 support [17]
 o lib1560: replace an `int` with `bool` [97]
 o lib2700: use `testnum` [151]
 o lib517: use `LL` 64-bit literals & re-enable a test case (`time_t`) [100]
 o libcurl: reset rewind flag in curl_easy_reset() [184]
 o libssh: Use sftp_aio instead of sftp_async for sftp_recv [92]
 o libtests: update format strings to avoid casts, drop some macros [109]
 o libtests: use `FMT_SOCKET_T`, drop more casts [136]
 o managen: reset text mode at end of table marker [145]
 o mbedtls: check for feature macros instead of version [166]
 o memanalyze: fix warnings [22]
 o memory: make function overrides work reliably in unity builds [93]
 o multi event: remove only announced [25]
 o multi: don't insert a node into the splay tree twice [68]
 o multi: fix assert in multi_getsock() [53]
 o multi: fix bad splay management [133]
 o multi: process pending, one by one [90]
 o multi: replace remaining EXPIRE_RUN_NOW [67]
 o multissl: initialize when requesting a random number [30]
 o ngtcp2: extend callback tables for nghttp3 1.11.0 and ngtcp2 1.14.0 [47]
 o openssl: auto-pause on verify callback retry [167]
 o openssl: check SSL_write() length on retries [152]
 o openssl: clear errors after a failed `d2i_X509()` [161]
 o openssl: output unescaped utf8 x509 issuer/subject DNs [169]
 o openssl: save and restore OpenSSL error queue in two functions [172]
 o openssl: some small cleanups [42]
 o openssl: split cert_stuff into smaller sub functions [72]
 o parallel-max: bump the max value to 65535 [86]
 o processhelp.pm: fix to use the correct null device on Windows [164]
 o pytest: add SOCKS tests and scoring [9]
 o pytest: increase server KeepAliveTimeout [26]
 o pytest: relax error check on test_07_22 [16]
 o resolving: dns error tracing [196]
 o runtests: add `--ci` option, show `Env:` only when non-empty [134]
 o runtests: assume `Time::HiRes`, drop Perl Win32 dependency [163]
 o schannel: add an error message for client cert not found [165]
 o schannel: assume `CERT_CHAIN_REVOCATION_CHECK_CHAIN` [114]
 o schannel: drop fallbacks for 4 macros [121]
 o schannel: drop fallbacks for unused `BCRYPT_*` macros [122]
 o schannel: drop old-mingw special case [77]
 o schannel: fix recent update for mingw32ce [123]
 o schannel: not supported with UWP, drop redundant code [105]
 o schannel: use if(result) like the code style says [125]
 o scripts: enable strict warnings in Perl where missing, fix fallouts [63]
 o scripts: fix two Perl uninitialized value warnings [60]
 o sendf: getting less data than "max allowed" is okay [170]
 o servers: convert two macros to scoped static const strings [89]
 o setopt: refactor out the booleans from setopt_long to setopt_bool [83]
 o setopt: split out cookielist() and cookiefile() [130]
 o socks: do_SOCKS5: Fix invalid buffer content on short send [43]
 o spacecheck.pl: when detecting unicode, mention line number [85]
 o test1148: drop redundant `LC_NUMBER=` env setting [13]
 o test1560: set locale/codeset with `LC_ALL` (was: `LANG`), test in CI [19]
 o test1560: skip some URLs if UTF-8 is not supported [34]
 o test1: raise alloc limits [11]
 o test428: re-enable for Windows [5]
 o test436: fix running on Windows with `_curlrc` present [153]
 o tests/ech_tests.sh: indent, if/for style, inline ifs [131]
 o tests: constify command-line arguments [82]
 o tests: drop unused `CURL_FORCEHOST` envs [36]
 o tests: fix perl warnings in http2-server, http3-server [119]
 o tests: fix prechecks to call the bundle libtest tool [120]
 o tests: fix UTF-8 detection, per-test `LC_*` settings, CI coverage [6]
 o tests: merge clients into libtests, drop duplicate code [76]
 o tests: set `CURL_ENTROPY` per test, not globally [35]
 o tests: unset some envs instead of blanking them [4]
 o tidy-up: `Curl_thread_create()` callback return type [20]
 o tidy-up: move literal to the right side of comparisons [65]
 o tidy-up: prefer `ifdef`/`ifndef` for single checks [64]
 o tls: CURLINFO_TLS_SSL_PTR testing [79]
 o TODO: remove session export item [194]
 o tool_cb_wrt: stop alloc/free for every chunk windows console output [140]
 o tool_operate: avoid superfluous strdup'ing output [1]
 o tool_operate: use the correct config pointer [115]
 o tool_paramhlp: fix secs2ms() [116]
 o tool_parsecfg: use dynbuf for quoted arguments [162]
 o tool_urlglob: polish, cleanups, improvements [141]
 o unit-tests: build the unitprotos.h from here [73]
 o unit2604: avoid `UNCONST()` [135]
 o URL-SYNTAX.md: drop link to codepoints.net to pass linkcheck [190]
 o urlapi: allow more path characters "raw" when asked to URL encode [146]
 o urldata: reduce two long struct fields to unsigned short [174]
 o vquic-tls: fix SSL backend type for QUIC connections using gnutls [29]
 o vquic: use curl_getenv [168]
 o vtls: set seen http version on successful ALPN [160]
 o windows: assume `ADDRESS_FAMILY`, drop feature checks [88]
 o windows: document toolchain support for `CERT_NAME_SEARCH_ALL_NAMES_FLAG`
 o windows: document toolchain support for some macros (cont.) [111]
 o windows: document toolchain support for some macros [113]
 o windows: drop `CRYPT_E_*` macro fallbacks, limit one to mingw32ce [118]
 o windows: drop two interim, single-use macros [106]
 o windows: drop unused `curlx/version_win32.h` includes [52]
 o windows: fix `if_nametoindex()` detection with autotools, improve with cmake [24]
 o windows: include `wincrypt.h` before `iphlpapi.h` for mingw-w64 <6 [50]
 o windows: target version macro tidy-ups [3]
 o wolfssl: rename ML-KEM hybrids to match IETF draft [173]
 o ws: avoid NULL pointer deref in curl_ws_recv [91]

This release includes the following known bugs:

 See https://curl.se/docs/knownbugs.html

For all changes ever done in curl:

 See https://curl.se/changes.html

Planned upcoming removals include:

 o Supporting curl builds using VS2008
 o The winbuild build system
 o Windows CE support

 See https://curl.se/dev/deprecate.html

This release would not have looked like this without help, code, reports and
advice from friends like these:

  adamse on github, Ahmad Gani, Alice Lee Poetics, Ammar Faizi, Anthony Hu,
  Berthin Torres Callañaupa, Caolán McNamara, Cole Leavitt, d1r3ct0r,
  Dan Fandrich, Daniel Böhmer, Daniel Engberg, Daniel Stenberg, David Zhuang,
  devgs on github, Dominik Tomecki, Eshan Kelkar, Google Big Sleep,
  Harry Sintonen, IoannisGS on github, Jelle Raaijmakers, Jeroen Ooms,
  Kai Pastor, Karthik Das, kkmuffme on github, kupavcevdenis on github,
  letshack9707 on hackerone, lf- on github, LoRd_MuldeR, Michał Petryka,
  nevakrien on github, Oxan van Leeuwen, Paul Gilmartin, Petar Popovic,
  Philippe Antoine, Pino Toscano, Qriist, Qriist on github, Ray Satiro,
  renovate[bot], rm-rmonaghan on github, Roberto Hidalgo, Samuel Henrique,
  Schrijvers Luc, Sergio Durigan Junior, Stefan Eissing, Tal Regev,
  Todd Gamblin, Viktor Szakats, Waldemar Kornewald, xfangfang, yaoy6 on github,
  ウさん
  (53 contributors)

References to bug reports and discussions on issues:

 [1] = https://curl.se/bug/?i=17946
 [2] = https://curl.se/bug/?i=18008
 [3] = https://curl.se/bug/?i=17981
 [4] = https://curl.se/bug/?i=17994
 [5] = https://curl.se/bug/?i=17991
 [6] = https://curl.se/bug/?i=17988
 [7] = https://curl.se/bug/?i=17962
 [8] = https://curl.se/bug/?i=17729
 [9] = https://curl.se/bug/?i=17986
 [10] = https://curl.se/bug/?i=17996
 [11] = https://curl.se/bug/?i=18004
 [12] = https://curl.se/bug/?i=17995
 [13] = https://curl.se/bug/?i=17993
 [14] = https://curl.se/bug/?i=18038
 [15] = https://curl.se/bug/?i=18036
 [16] = https://curl.se/bug/?i=18050
 [17] = https://curl.se/bug/?i=17998
 [18] = https://curl.se/bug/?i=17978
 [19] = https://curl.se/bug/?i=17938
 [20] = https://curl.se/bug/?i=17889
 [21] = https://curl.se/bug/?i=17898
 [22] = https://curl.se/bug/?i=18049
 [23] = https://curl.se/bug/?i=17980
 [24] = https://curl.se/bug/?i=17982
 [25] = https://curl.se/bug/?i=17949
 [26] = https://curl.se/bug/?i=17968
 [27] = https://curl.se/bug/?i=17975
 [28] = https://curl.se/bug/?i=17958
 [29] = https://curl.se/bug/?i=17976
 [30] = https://curl.se/bug/?i=17963
 [31] = https://curl.se/bug/?i=18016
 [32] = https://curl.se/bug/?i=17967
 [33] = https://curl.se/bug/?i=17984
 [34] = https://curl.se/bug/?i=17933
 [35] = https://curl.se/bug/?i=17971
 [36] = https://curl.se/bug/?i=17972
 [37] = https://curl.se/bug/?i=17768
 [38] = https://curl.se/bug/?i=17951
 [39] = https://curl.se/bug/?i=17953
 [40] = https://github.com/microsoft/vcpkg/pull/46444#pullrequestreview-3026575393
 [41] = https://curl.se/bug/?i=17941
 [42] = https://curl.se/bug/?i=17940
 [43] = https://curl.se/bug/?i=17942
 [44] = https://curl.se/bug/?i=18030
 [45] = https://curl.se/bug/?i=17696
 [46] = https://curl.se/bug/?i=18026
 [47] = https://curl.se/bug/?i=18019
 [48] = https://curl.se/bug/?i=18053
 [49] = https://curl.se/bug/?i=18015
 [50] = https://curl.se/bug/?i=18012
 [51] = https://curl.se/bug/?i=18014
 [52] = https://curl.se/bug/?i=18011
 [53] = https://curl.se/bug/?i=18046
 [54] = https://curl.se/bug/?i=17797
 [55] = https://curl.se/bug/?i=17791
 [56] = https://curl.se/bug/?i=17992
 [57] = https://curl.se/bug/?i=18044
 [58] = https://curl.se/bug/?i=18045
 [59] = https://curl.se/bug/?i=18043
 [60] = https://curl.se/bug/?i=18047
 [61] = https://curl.se/bug/?i=17955
 [62] = https://curl.se/bug/?i=17884
 [63] = https://curl.se/bug/?i=17877
 [64] = https://curl.se/bug/?i=18018
 [65] = https://curl.se/bug/?i=17876
 [66] = https://curl.se/bug/?i=18041
 [67] = https://curl.se/bug/?i=17883
 [68] = https://curl.se/bug/?i=18005
 [69] = https://curl.se/bug/?i=17789
 [70] = https://curl.se/bug/?i=17712
 [71] = https://curl.se/bug/?i=17894
 [72] = https://curl.se/bug/?i=18081
 [73] = https://curl.se/bug/?i=18088
 [74] = https://curl.se/bug/?i=18119
 [75] = https://curl.se/bug/?i=18086
 [76] = https://curl.se/bug/?i=18079
 [77] = https://curl.se/bug/?i=18084
 [78] = https://curl.se/bug/?i=18117
 [79] = https://curl.se/bug/?i=18066
 [80] = https://curl.se/bug/?i=18105
 [81] = https://curl.se/bug/?i=18052
 [82] = https://curl.se/bug/?i=18076
 [83] = https://curl.se/bug/?i=17887
 [84] = https://curl.se/bug/?i=17225
 [85] = https://curl.se/bug/?i=18120
 [86] = https://curl.se/bug/?i=18068
 [87] = https://curl.se/bug/?i=18069
 [88] = https://curl.se/bug/?i=18057
 [89] = https://curl.se/bug/?i=18067
 [90] = https://curl.se/bug/?i=18017
 [91] = https://curl.se/bug/?i=18065
 [92] = https://curl.se/bug/?i=17440
 [93] = https://curl.se/bug/?i=17827
 [94] = https://curl.se/bug/?i=18055
 [95] = https://curl.se/bug/?i=18054
 [96] = https://curl.se/bug/?i=18063
 [97] = https://curl.se/bug/?i=18064
 [98] = https://curl.se/bug/?i=18062
 [99] = https://curl.se/bug/?i=18061
 [100] = https://curl.se/bug/?i=18032
 [101] = https://curl.se/bug/?i=17800
 [102] = https://curl.se/bug/?i=18060
 [103] = https://curl.se/bug/?i=18059
 [104] = https://curl.se/bug/?i=17947
 [105] = https://curl.se/bug/?i=18116
 [106] = https://curl.se/bug/?i=18114
 [107] = https://curl.se/bug/?i=18115
 [108] = https://curl.se/bug/?i=18112
 [109] = https://curl.se/bug/?i=18106
 [110] = https://curl.se/bug/?i=18110
 [111] = https://curl.se/bug/?i=18113
 [112] = https://curl.se/bug/?i=18109
 [113] = https://curl.se/bug/?i=18085
 [114] = https://curl.se/bug/?i=18108
 [115] = https://curl.se/bug/?i=18200
 [116] = https://curl.se/bug/?i=18167
 [117] = https://curl.se/bug/?i=18096
 [118] = https://curl.se/bug/?i=18092
 [119] = https://curl.se/bug/?i=18100
 [120] = https://curl.se/bug/?i=18099
 [121] = https://curl.se/bug/?i=18093
 [122] = https://curl.se/bug/?i=18091
 [123] = https://curl.se/bug/?i=18097
 [124] = https://curl.se/bug/?i=18095
 [125] = https://curl.se/bug/?i=18094
 [126] = https://curl.se/bug/?i=17960
 [127] = https://curl.se/bug/?i=16643
 [128] = https://curl.se/bug/?i=18165
 [129] = https://curl.se/bug/?i=16543
 [130] = https://curl.se/bug/?i=18162
 [131] = https://curl.se/bug/?i=18187
 [132] = https://curl.se/bug/?i=18160
 [133] = https://curl.se/bug/?i=18201
 [134] = https://curl.se/bug/?i=18147
 [135] = https://curl.se/bug/?i=18143
 [136] = https://curl.se/bug/?i=18142
 [137] = https://curl.se/bug/?i=18141
 [138] = https://curl.se/bug/?i=18158
 [139] = https://curl.se/bug/?i=18149
 [140] = https://curl.se/bug/?i=18233
 [141] = https://curl.se/bug/?i=18198
 [142] = https://curl.se/bug/?i=18145
 [143] = https://curl.se/bug/?i=18130
 [144] = https://curl.se/bug/?i=18118
 [145] = https://curl.se/bug/?i=18139
 [146] = https://curl.se/bug/?i=17977
 [147] = https://curl.se/bug/?i=18134
 [148] = https://curl.se/bug/?i=18136
 [149] = https://curl.se/bug/?i=18135
 [150] = https://curl.se/bug/?i=18137
 [151] = https://curl.se/bug/?i=18138
 [152] = https://curl.se/bug/?i=18121
 [153] = https://curl.se/bug/?i=18242
 [154] = https://curl.se/bug/?i=18241
 [155] = https://curl.se/bug/?i=18238
 [156] = https://curl.se/bug/?i=18195
 [158] = https://curl.se/bug/?i=18299
 [159] = https://curl.se/bug/?i=18232
 [160] = https://curl.se/bug/?i=18177
 [161] = https://curl.se/bug/?i=18190
 [162] = https://curl.se/bug/?i=18230
 [163] = https://curl.se/bug/?i=18287
 [164] = https://curl.se/bug/?i=18282
 [165] = https://curl.se/bug/?i=18124
 [166] = https://curl.se/bug/?i=18271
 [167] = https://curl.se/mail/lib-2025-08/0012.html
 [168] = https://curl.se/bug/?i=18170
 [169] = https://curl.se/bug/?i=18171
 [170] = https://curl.se/bug/?i=18283
 [171] = https://curl.se/bug/?i=18261
 [172] = https://curl.se/bug/?i=18190
 [173] = https://curl.se/bug/?i=18123
 [174] = https://curl.se/bug/?i=18173
 [175] = https://curl.se/bug/?i=18157
 [176] = https://curl.se/bug/?i=17974
 [178] = https://curl.se/bug/?i=18216
 [179] = https://curl.se/bug/?i=18272
 [180] = https://curl.se/bug/?i=18254
 [183] = https://curl.se/bug/?i=18208
 [184] = https://curl.se/bug/?i=18206
 [185] = https://curl.se/bug/?i=18266
 [186] = https://curl.se/bug/?i=18264
 [187] = https://curl.se/bug/?i=18246
 [189] = https://curl.se/bug/?i=18260
 [190] = https://curl.se/bug/?i=18259
 [193] = https://curl.se/bug/?i=17683
 [194] = https://curl.se/bug/?i=18243
 [196] = https://curl.se/bug/?i=18247
