]> git.ipfire.org Git - thirdparty/curl.git/log
thirdparty/curl.git
3 days agotests: address mutable class vars and naive datetime in Python code
Dan Fandrich [Sat, 25 Jul 2026 20:23:21 +0000 (13:23 -0700)] 
tests: address mutable class vars and naive datetime in Python code

Mark Python mutable class variables with ClassVar, to denote that the
danger this can cause has been considered.  Since any change made to
these in any object affects all other objects, this can cause locality
errors. However, as used in the test suite, they are are never modified
and so they are annotated as being intended.

Always set a timezone in datetime objects, as mixing naive and
timezone-aware object can cause errors.

These fix ruff rules DTZ005, RUF012.

3 days agotests: use simpler constructions in Python code
Dan Fandrich [Sat, 25 Jul 2026 21:05:01 +0000 (14:05 -0700)] 
tests: use simpler constructions in Python code

* call super() without arguments
* mark an unused variable as such
* simplify by using dict getter for default values
* use writelines() when possible
* use dedent to simplify some text formatting
* avoid items() on dict in a loop when unnecessary
* replace most Python format() calls with f-strings
* use capture_output in subprocess.run

This fixes ruff rules FLY002, FURB122, PERF102, RUF059, SIM401, UP008,
UP022, UP030.

3 days agotests: simplify by removing unneeded Python code
Dan Fandrich [Sat, 25 Jul 2026 20:49:29 +0000 (13:49 -0700)] 
tests: simplify by removing unneeded Python code

* combine separate if statements
* remove an unneeded encode() call
* remove unneeded returns
* simplify code when returning early

This fixes ruff rules SIM102, SIM114, UP012, PLR1711.

3 days agotests: change whitespace and comments in Python test code
Dan Fandrich [Sat, 25 Jul 2026 20:35:51 +0000 (13:35 -0700)] 
tests: change whitespace and comments in Python test code

* remove an unneeded ruff warning disable
* remove coding: utf-8 from Python code; PEP 3120 makes UTF-8 the
  default encoding
* remove unusable shebang lines from Python code
* remove empty print strings
* disable warnings when file objects are stored; these instances can't
  be handled with context managers
* use more consistent whitespace in Python code, fixing flake8 warnings
* set the executable bit on scorecard.py, making it easier to run

These fix ruff rules EXE001, FURB105, UP009, SIM115.

3 days agotests: improve exception handling in Python test code
Dan Fandrich [Sat, 25 Jul 2026 20:06:38 +0000 (13:06 -0700)] 
tests: improve exception handling in Python test code

* Explicitly set "check" in subprocess.run() to raise an exception
  automatically, where it was done manually before
* Use contextlib.suppress to ignore exceptions
* Use custom exceptions for test errors for clarity and flexibility.
* Replace IOError with OSError

This fixes ruff rules BLE001, PLW1510, S110, TRY201, TRY203, TRY002,
UP024.

3 days agotidy-up: use more `static`, `sizeof()`, `char[]`, double-const
Viktor Szakats [Wed, 22 Jul 2026 23:50:06 +0000 (01:50 +0200)] 
tidy-up: use more `static`, `sizeof()`, `char[]`, double-const

- make `const` data `static`, where missing and possible.
- replace `strlen()` on literal or const strings with `sizeof()`.
  While the latter is optimized by popular C compiler, e.g. MSVC only
  does it with `/O2`.
- replace magic numbers with `sizeof()`, where missing.
- introduce `CURL_CSTRLEN()` macro for `sizeof(char[]) - 1`.
- use `CURL_CSTRLEN()` macro.
- move `const` before integer types, where missing.
- replace `char *var` with `var[]`, where missing and possible.
- use double const, where missing.
  `static const char *` -> `static const char * const`.
- lib1514: constify pointers.
- unit3205: drop redundant cast, avoid another one.
- unit1666: map `OID()` macro to identical `STRCONST()`.

Closes #22406

3 days agourlapi: improved return codes
Daniel Stenberg [Mon, 27 Jul 2026 14:05:38 +0000 (16:05 +0200)] 
urlapi: improved return codes

- add CURLUE_BACKSLASH that can be returned when a backslash was used
  where a forward one probably was intended.

- make CURLUE_NO_HOST higher priority than port number errors for URLs
  without hostname. Like in "http://::1"

- shortened some URL parser error strings

Extend test 1560 to verify.

Reported-by: kit-ty-kate on github
Fixes #22337
Closes #22408

3 days agolib2405: adjust for non-threaded builds
Daniel Stenberg [Tue, 28 Jul 2026 09:53:42 +0000 (11:53 +0200)] 
lib2405: adjust for non-threaded builds

- Attempt to fix the flakiness set in 9726fc8259ad7ebf1682
- Reduce macro use

Closes #22414

3 days agoEXPERIMENTAL.md: We do not accept vuln reports for experimental features
Daniel Stenberg [Mon, 27 Jul 2026 21:56:44 +0000 (23:56 +0200)] 
EXPERIMENTAL.md: We do not accept vuln reports for experimental features

Closes #22411

3 days agospnego: block NTLM fallback in SPNEGO negotiation
Matthew John Cheetham [Mon, 13 Apr 2026 11:58:52 +0000 (12:58 +0100)] 
spnego: block NTLM fallback in SPNEGO negotiation

- Switch the Windows SSPI identity struct to SEC_WINNT_AUTH_IDENTITY_EX
  to use !ntlm in PackageList to prevent NTLM from being offered.

- For GSS filter out NTLMSSP OID, and restrict via gss_set_neg_mechs()
  to prevent NTLM from being offered.

- Extend the GSS-API debug stub layer to support the NTLM blocking logic
  without a real Kerberos environment.

- Update test 2057 to check that negotiate auth is silently skipped with
  no Authorization header when only NTLM stub credentials are available.

- Add SPNEGO NTLM blocking test 2093 which verifies that Kerberos
  credentials still succeed when NTLM is blocked within SPNEGO.

- Suppress tests valgrind leak for MIT krb5 gss_display_status, since
  the leak is in the library and not in curl.

To suppress the tests valgrind leak, the wildcard '...' bridges over an
anonymous frame inside libgssapi_krb5.so that valgrind reports as '???'.

Signed-off-by: Matthew John Cheetham <mjcheetham@outlook.com>
Aided-by: Johannes Schindelin
Closes https://github.com/curl/curl/pull/21315
Closes https://github.com/curl/curl/pull/22410

3 days agoconncache: conn upkeep/alive: move and enhance
Stefan Eissing [Mon, 27 Jul 2026 07:49:33 +0000 (09:49 +0200)] 
conncache: conn upkeep/alive: move and enhance

- move `Curl_conn_seems_dead()` into conncache.c
- move `Curl_conn_upkeep()` into conncache.c
- when upkeep gives an error on a connection not in use,
  terminate it

Closes #21806

4 days agotypecheck-gcc: allow passing `char[]` as callback data
Viktor Szakats [Mon, 27 Jul 2026 11:17:56 +0000 (13:17 +0200)] 
typecheck-gcc: allow passing `char[]` as callback data

E.g. `TEST_DATA_STRING` in test 655.

Cherry-picked from #22406

Closes #22409

4 days agovquic: use ngtcp2 v1.25.0 new close2 callback
Stefan Eissing [Mon, 20 Jul 2026 12:37:13 +0000 (14:37 +0200)] 
vquic: use ngtcp2 v1.25.0 new close2 callback

Forward only the app error code from the receiving side to the h3 layer.

This only takes effect when building against ngtcp2 v1.25.0 or higher.

Fixes #22270

Closes #22356

4 days agoGHA: update dependency ngtcp2/ngtcp2 to v1.25.0
renovate[bot] [Mon, 27 Jul 2026 08:20:01 +0000 (08:20 +0000)] 
GHA: update dependency ngtcp2/ngtcp2 to v1.25.0

Closes #22398

4 days agocf-ngtcp2-cmn: de-duplicate `ngtcp2_conn_client_new()` call code
Viktor Szakats [Sun, 26 Jul 2026 18:48:02 +0000 (20:48 +0200)] 
cf-ngtcp2-cmn: de-duplicate `ngtcp2_conn_client_new()` call code

Closes #22401

4 days agocmake: verify if options are listed in `INSTALL-CMAKE.md`
Viktor Szakats [Mon, 27 Jul 2026 00:42:09 +0000 (02:42 +0200)] 
cmake: verify if options are listed in `INSTALL-CMAKE.md`

Also:
- add one debug option to pass the test.

Ref: https://github.com/curl/curl/discussions/14885#discussioncomment-10632311

Closes #22404

4 days agopytest: update two H3 tests for nghttp3 1.18.0+
Viktor Szakats [Sun, 26 Jul 2026 19:15:33 +0000 (21:15 +0200)] 
pytest: update two H3 tests for nghttp3 1.18.0+

Fixing:
```
FAILED ../../tests/http/test_02_download.py::TestDownload::test_02_36_looong_urls[65536-h3] -
  AssertionError: expected exit code 0, got 56
FAILED ../../tests/http/test_14_auth.py::TestAuth::test_14_05_basic_large_pw[h3] -
  AssertionError: expected exit code 0, got 56
```
Ref: https://github.com/curl/curl/actions/runs/30207198835/job/89807247058?pr=22400

Refs:
https://github.com/ngtcp2/nghttp3/pull/539
https://github.com/ngtcp2/nghttp3/commit/a5872645446cdc07e897fea33b61a3c665563da9

Bug: https://github.com/curl/curl/pull/22397#issuecomment-5084927935

Closes #22402

4 days agovquic: silence `-Wmissing-field-initializers` for nghttp3/ngtcp2 callback tables
Viktor Szakats [Sun, 26 Jul 2026 14:57:51 +0000 (16:57 +0200)] 
vquic: silence `-Wmissing-field-initializers` for nghttp3/ngtcp2 callback tables

To avoid a breakage in CI and curl-for-win builds on upstream updates
extending the callback lists. Each such breakage needed patching curl,
rolling these patches into curl-for-win, and doing it in near real-time,
to keep CI and builds working (and still causing some red CI jobs).

Bring calmness here by suppressing the warnings and allowing time to
extend the callback tables as/if needed and at a convenient moment.

Closes #22400

4 days agoRELEASE-NOTES: synced
Daniel Stenberg [Mon, 27 Jul 2026 07:40:05 +0000 (09:40 +0200)] 
RELEASE-NOTES: synced

4 days agoGHA/windows: bump stunnel to 5.79
Viktor Szakats [Sun, 26 Jul 2026 23:41:07 +0000 (01:41 +0200)] 
GHA/windows: bump stunnel to 5.79

Closes #22403

4 days agoruntests: fix `mode="warn"` tests passing unconditionally, fix test 1752
Viktor Szakats [Sat, 25 Jul 2026 11:43:33 +0000 (13:43 +0200)] 
runtests: fix `mode="warn"` tests passing unconditionally, fix test 1752

Fix test 1712 to pass curl C by setting `COLUMNS` to the highest
accepted value, and adjust expected results. To avoid envs with varying
lengths of `LOGDIR` affect the outcome.

Apply the same fix to test 459, though it wasn't affected in curl CI.

Also sync up test 433 `COLUMNS` value with these two tests for
consistency.

Ref: #22381
Follow-up to 8e3a2a64d103a46508e17cde76595993de96ea6c #20666

Closes #22388

4 days agohttp: fix httpsig with auth-redir
Daniel Stenberg [Sat, 25 Jul 2026 21:48:07 +0000 (23:48 +0200)] 
http: fix httpsig with auth-redir

Do not let unrelated credentials from a redirected URL bypass the
cross-host auth boundary

Verified by test 5023 to 5025

Follow-up to a55731050e8c3dbea0

Closes #22395

5 days agoGHA/http3-linux: update dependency ngtcp2/nghttp3 to v1.18.0
renovate[bot] [Sun, 26 Jul 2026 10:13:55 +0000 (10:13 +0000)] 
GHA/http3-linux: update dependency ngtcp2/nghttp3 to v1.18.0

Closes #22397

5 days agovquic: initialize new callback slot for nghttp3 v1.18.0+
Viktor Szakats [Sun, 26 Jul 2026 14:27:34 +0000 (16:27 +0200)] 
vquic: initialize new callback slot for nghttp3 v1.18.0+

Closes #22399

5 days agoruntests: allow comments in `setenv` section, merge sections in test433
Viktor Szakats [Sat, 25 Jul 2026 12:18:07 +0000 (14:18 +0200)] 
runtests: allow comments in `setenv` section, merge sections in test433

Closes #22389

5 days agobuild: tidy up httpsig options
Viktor Szakats [Sat, 25 Jul 2026 14:58:54 +0000 (16:58 +0200)] 
build: tidy up httpsig options

- say 'experimental'.
- cmake: add to documentation.
- cmake: alpha-sort.

Follow-up to a55731050e8c3dbea0b96205cf916443118f6acb #22386

Closes #22391

5 days agotool_getparam: clear the --httpsig-key argument
Daniel Stenberg [Sat, 25 Jul 2026 21:06:29 +0000 (23:06 +0200)] 
tool_getparam: clear the --httpsig-key argument

To hide it somewhat from process listings.

Closes #22394

5 days agocd2nroff: fix backslashes for 4-space indent lines
Daniel Stenberg [Sat, 25 Jul 2026 20:22:21 +0000 (22:22 +0200)] 
cd2nroff: fix backslashes for 4-space indent lines

They were previously only properly escaped for ~~~ quotes. Spotted for
the CURLOPT_HTTPSIG_KEY man page.

Closes #22393

5 days agocurl: make --httpsig-key take a key OR a file name for key
Daniel Stenberg [Sat, 25 Jul 2026 15:03:22 +0000 (17:03 +0200)] 
curl: make --httpsig-key take a key OR a file name for key

Verified by test 5022

Closes #22392

6 days agohttpsig: add RFC 9421 HTTP Message Signatures support
Sameeh Jubran [Fri, 24 Jul 2026 20:49:52 +0000 (22:49 +0200)] 
httpsig: add RFC 9421 HTTP Message Signatures support

Add support for signing outgoing HTTP requests per RFC 9421 using
Ed25519 or HMAC-SHA256 algorithms.

New libcurl options:
 - CURLOPT_HTTPSIG: signing algorithm ("ed25519" or "hmac-sha256")
 - CURLOPT_HTTPSIG_KEY: path to hex-encoded key file
 - CURLOPT_HTTPSIG_KEYID: key identifier for Signature-Input
 - CURLOPT_HTTPSIG_HEADERS: space-separated components to sign

New CLI flags: --httpsig, --httpsig-key, --httpsig-keyid,
--httpsig-headers

The crypto layer follows the sha256.c multi-backend pattern with
implementations for OpenSSL (EVP_DigestSign) and wolfSSL
(wc_ed25519_sign_msg). HMAC-SHA256 uses the existing Curl_hmacit()
infrastructure which works on all backends.

Verified by test 5000 to 5021

Assisted-by: Daniel Stenberg
Signed-off-by: Sameeh Jubran <sameeh@wolfssl.com>
Closes #22386
Closes #21239

6 days agotidy-up: drop redundant includes
Viktor Szakats [Sun, 28 Jun 2026 11:10:38 +0000 (13:10 +0200)] 
tidy-up: drop redundant includes

`sys/types.h` and `sys/socket.h` (non-Win32). They are included via
`curl/curl.h` and `curl_setup.h`.

This drops `HAVE_SYS_TYPES_H` guards from the codebase. It's safe
because `sys/types.h` (POSIX) is already required unconditionally by
`curl/curl.h`. It remains used in feature checks by both autotools and
cmake; to be reviewed in a future step.

Closes #22374

6 days agospacecheck: cap number of lines per file
Viktor Szakats [Fri, 24 Jul 2026 18:26:01 +0000 (20:26 +0200)] 
spacecheck: cap number of lines per file

To prevent merging large text files by accident.

Set the cap at 10k lines. The current line number top list is:
```
    5577 configure.ac
    5561 lib/vtls/openssl.c
    5077 lib/http.c
    4517 lib/ftp.c
    4284 lib/multi.c
```

Closes #22387

6 days agoconnect: connection close tweaks
Stefan Eissing [Thu, 23 Jul 2026 12:17:13 +0000 (14:17 +0200)] 
connect: connection close tweaks

- connclose/streamclose/connkeep() remove description string that was
  never used anywhere. Add trace statements where reasons for closing
  were not already traced and maybe not obvious.
- multi_remove_handle: only lookup former connection in pool when
  transfer is set to connect only
- test1554: adapt expectations now that pool is less often locked

Closes #22379

6 days agohttpsrr: DoH with HTTPS, fix response handling
Stefan Eissing [Thu, 23 Jul 2026 09:20:19 +0000 (11:20 +0200)] 
httpsrr: DoH with HTTPS, fix response handling

Fix handling of DoH response that only asks for HTTPS records.

Add test 2117 for checking that a HTTPS-RR resolve is processed,
even though the actual answer is invalid.

Closes #22372

6 days agoapi-guard: check lock on session cache
Stefan Eissing [Wed, 22 Jul 2026 09:06:39 +0000 (11:06 +0200)] 
api-guard: check lock on session cache

Add a property to easy/multi API calls that prohibit calling
the function when the involved SSL session cache is under lock
by the current thread.

Checks are only in effect when pthreads/Windows threads are
available.

Closes #22367

7 days agoterminal: Enhance terminal size detection for multiple outputs 22276/head
AlanKingPL [Wed, 8 Jul 2026 11:13:40 +0000 (13:13 +0200)] 
terminal: Enhance terminal size detection for multiple outputs

- Get the terminal size from STDOUT or STDERR when the terminal size of
  STDIN is not available.

Closes https://github.com/curl/curl/pull/22276

7 days agohttp: fix non-tunneling proxy hostname use
Stefan Eissing [Fri, 24 Jul 2026 12:20:58 +0000 (14:20 +0200)] 
http: fix non-tunneling proxy hostname use

Make sure hostname used in URL to proxy is IDN decoded form, but keep
the original hostname in case it was ipv6.

Fixes #22382
Reported-by: RMMoreton on github
Closes #22385

7 days agotests: fix the FTP check for unexpected RST
Graham Campbell [Sun, 12 Jul 2026 17:47:32 +0000 (18:47 +0100)] 
tests: fix the FTP check for unexpected RST

- In vsftpd ignore unrelated RST by matching tcpdump RSTs to the data
  connection port pair.

Prior to this change an unrelated RST on a recycled ephemeral port
could cause test failure.

Closes https://github.com/curl/curl/pull/22305

7 days agoasyn-thrdd: retry link-local ipv6 if missing scope id
Stefan Eissing [Tue, 21 Jul 2026 11:28:59 +0000 (13:28 +0200)] 
asyn-thrdd: retry link-local ipv6 if missing scope id

When the threaded resolver gets AAAA results that carry a link-local
address without scope-id, it now re-queues a query with AF_UNSPEC and
strips ipv4 addresses from that result. Whatever the resulting addresses
and scope-ids are, this becomes the result of the resolve.

Fixes #22330
Reported-by: Bartel Sielski
Closes #22368

7 days agoctype: exclude control bytes from ISPRINT and ISGRAPH
Alhuda Khan [Thu, 23 Jul 2026 06:39:04 +0000 (12:09 +0530)] 
ctype: exclude control bytes from ISPRINT and ISGRAPH

Closes #22371

7 days agoconfigure: only check in the watt library if WATT_ROOT is set
Ross Burton [Thu, 23 Jul 2026 12:09:13 +0000 (13:09 +0100)] 
configure: only check in the watt library if WATT_ROOT is set

Only look for gethostbyname in libwatt in $WATT_ROOT/lib if WATT_ROOT
has actually been set. This avoids configure trying to search in /lib,
which won't every succeed and can cause problems in cross builds which
check that host paths are not being searched.

Closes #22380

8 days agotidy-up: miscellaneous
Viktor Szakats [Fri, 10 Jul 2026 22:44:25 +0000 (00:44 +0200)] 
tidy-up: miscellaneous

- CMake/CurlTests.c: sync indent with rest of file and most of code.
- cmake: sync term in `_CURL_PREFILL` description with rest of code.
- curl_setup.h: document function relying on `_CRT_SECURE_NO_WARNINGS`.
- tests/http/scorecard.py: typo in message.
- 'Quiche' -> 'quiche'.
- fix comment and formatting nits.

Closes #22378

8 days agomd5: replace magic numbers with `MD5_DIGEST_LEN`
Viktor Szakats [Sun, 28 Jun 2026 18:32:50 +0000 (20:32 +0200)] 
md5: replace magic numbers with `MD5_DIGEST_LEN`

Closes #22377

8 days agotidy-up: fix Perl syntax and formatting nits
Viktor Szakats [Mon, 29 Jun 2026 17:01:04 +0000 (19:01 +0200)] 
tidy-up: fix Perl syntax and formatting nits

Closes #22376

8 days agovms: fix symbol typo and missing closing quotes in `config_h.com`
Viktor Szakats [Mon, 29 Jun 2026 09:27:38 +0000 (11:27 +0200)] 
vms: fix symbol typo and missing closing quotes in `config_h.com`

Closes #22375

8 days agotidy-up: fix comment indentation
Viktor Szakats [Sun, 28 Jun 2026 20:38:51 +0000 (22:38 +0200)] 
tidy-up: fix comment indentation

Closes #22373

8 days agongtcp2: clean up after ngtcp2 in `curl_global_cleanup`
Pavel Sobolev [Tue, 21 Jul 2026 18:47:33 +0000 (21:47 +0300)] 
ngtcp2: clean up after ngtcp2 in `curl_global_cleanup`

Frees the memory allocated by `ngtcp2_crypto_ossl_init`, thus making
Valgrind happy. Works for versions of ngtcp2 >= 1.24.0.

Ref: https://github.com/ngtcp2/ngtcp2/issues/2207

Closes #22363

8 days agodnscache: avoid double unlock
Daniel Stenberg [Tue, 21 Jul 2026 22:05:27 +0000 (00:05 +0200)] 
dnscache: avoid double unlock

Follow-up to 7ad33fe56f25424fb51a1040

Pointed out by Zeropath

Closes #22364

9 days agoscripts: replace/extend `--` with `--end-of-options` in git commands
Viktor Szakats [Wed, 22 Jul 2026 10:22:18 +0000 (12:22 +0200)] 
scripts: replace/extend `--` with `--end-of-options` in git commands

It makes these scripts require Git 2.24.0+ (2019-11-04).

Refs:
https://git-scm.com/docs/gitcli
https://nesbitt.io/2026/07/21/end-of-options.html
https://github.com/git/git/commit/19e8789b236dfe33667747d5523d6689bb59b5ef

Closes #22369

9 days agotool_xattr: add support for Windows alternate data stream
Viktor Szakats [Mon, 20 Jul 2026 08:29:41 +0000 (10:29 +0200)] 
tool_xattr: add support for Windows alternate data stream

Requires a supported filesystem, i.e. NTFS.

Example:
```console
> curl.exe https://curl.se/index.html --output test.txt --xattr --referer https://curl.se/
> cat < test.txt:Zone.Identifier

[ZoneTransfer]
HostUrl=https://curl.se/index.html
ReferrerUrl=https://curl.se/
```

Where newlines are CLRF, `ReferrerUrl` is set when using `--referer`
option.

Also:
- test688: make it test `--referer`.
- document `user.xdg.referrer.url` in `--xattr` man page.

Refs:
https://en.wikipedia.org/wiki/Mark_of_the_Web
https://en.wikipedia.org/wiki/NTFS#Alternate_data_stream_(ADS)
https://learn.microsoft.com/en-us/windows/win32/fileio/file-streams
https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-fscc/c54dec26-1551-4d3a-a0ea-4fa40f848eb3

Ref: #22345

Closes #22354

9 days agotool_doswin: add stdin relay auth
11soda11 [Tue, 28 Apr 2026 22:13:15 +0000 (00:13 +0200)] 
tool_doswin: add stdin relay auth

Verify the peer with a random number in the background thread.

Closes #21467

9 days agoRELEASE-NOTES: synced
Daniel Stenberg [Tue, 21 Jul 2026 21:55:11 +0000 (23:55 +0200)] 
RELEASE-NOTES: synced

9 days agotest: adjust test_06_13 for 0100::/64 being blackholed
Stefan Eissing [Mon, 20 Jul 2026 11:50:34 +0000 (13:50 +0200)] 
test: adjust test_06_13 for 0100::/64 being blackholed

Fixes #22344
Reported-by: Carlos Henrique Lima Melara
Closes #22355

9 days agourlapi: preserve empty markers in relative URLs
Alb3e3 [Fri, 10 Jul 2026 21:22:11 +0000 (23:22 +0200)] 
urlapi: preserve empty markers in relative URLs

Verified in test 1560

Closes #22298

9 days agothrdpool: retry failed thread starts while items wait
Graham Campbell [Sun, 12 Jul 2026 02:58:19 +0000 (03:58 +0100)] 
thrdpool: retry failed thread starts while items wait

Verified in test 3306

Closes #22303

9 days agohardening: add API guards
Stefan Eissing [Mon, 6 Jul 2026 10:59:45 +0000 (12:59 +0200)] 
hardening: add API guards

Add call stacks to easy and multi instances. Record ongoing API calls
and callback invocations there to detect recursion and not allowed
invocations.

Define enums for easy, multi and callbacks in `api.h`. In `api.c` define
properties for these functions:

- can they recurse
- is the easy/multi handle destroyed during the call or should it be
  good afterwards
- is the call allowed when a multi event callback is ongoing
- is the call allowed when a notification callback is ongoing

Entering a guard
- checks that passed CURL*/CURLM* are GOOD on entering
- checks that easy handle's `mid` is correct and it is known
  for it in the multi.
- checks that call properties are obeyed (recursion, callback checks)
- checks that passed CURL*/CURLM* are GOOD on leaving, unless call is
  known to kill it

Checks for ongoing callbacks inspect the whole call stack and catches
nested invocations (which our current flags can not).

Call stacks in easy/multi handle are fixed size and will deny recursion
when the limit is reached. The current limits are 7 for easy and 15 for
multi now.

Removes:
- multi->in_callback, check is done via call stack
- multi->in_ntfy_cb, check is done via call stack

The overhead in my tests seems minimal, if noticeable at all.

Closes #22237

9 days agolib: reader/writer fixes
Stefan Eissing [Tue, 21 Jul 2026 08:30:42 +0000 (10:30 +0200)] 
lib: reader/writer fixes

- clear writer paused bit when destroying writer stack
- remove the reader paused bit that turned out not to be a good idea

follow-up to b41c28e70af47e1

Closes #22361

9 days agocf-dns: resolve on filter demand
Stefan Eissing [Wed, 15 Jul 2026 15:21:04 +0000 (17:21 +0200)] 
cf-dns: resolve on filter demand

Use separate dns cache entries for addresses (A+AAAA) and HTTPS-RR
results. That makes also "negative" results independent of each other.
Dns cache entries, once in use, can no longer be modified safely, as
concurrent use would require each access then to be done under lock. By
using separate entries, we can update a HTTPS entry without needing to
duplicate an existing address entry for the same host+port.

Connection filters can now ask for DNS resolves. This works at any time
during connection setup and while connect is going on.
`Curl_conn_dns_add_addr_resolve()` and
`Curl_conn_dns_add_https_resolve()` are used for that. They check if the
resolve is already ongoing, can be added to a resolve not started yet
or, as last resort, create a new filter instance and add it to the
connection (it's easier to add more filters than making the same filter
handle multiple resolves. Since DNS filters are removed once the
connection is established, there is no later penalty).

HTTPS-RR queries are added by the `HTTPS-CONNECT`, `SSL` and `QUIC`
filters. The latter will only do that when ECH is configured and
supported. That means we trigger HTTPS-RR queries only when the results
matter.

Add test_22_06 for ALPN influenced via HTTPS-RR when tunneling through a
proxy. This did not work before.

Adjust test2100 to use https: as the previous http: URL no longer
triggers HTTPS-RR resolves.

Closes #22216

10 days agouint-spbset: reused empty chunks
Stefan Eissing [Fri, 17 Jul 2026 12:10:03 +0000 (14:10 +0200)] 
uint-spbset: reused empty chunks

Fix chunk allocations by reusing existing empty chunks when a new offset
is needed. Before this fix, spbsets would only ever grow with added
numbers outside the range of existing chunks.

Closes #22340

10 days agohttp: stop dropping large custom headers
Graham Campbell [Thu, 16 Jul 2026 12:29:44 +0000 (13:29 +0100)] 
http: stop dropping large custom headers

Closes #22336

10 days agohttp: avoid length underflow in Curl_compareheader
Graham Campbell [Thu, 16 Jul 2026 15:30:19 +0000 (16:30 +0100)] 
http: avoid length underflow in Curl_compareheader

Closes #22338

10 days agolib: client writer tweaks
Stefan Eissing [Thu, 16 Jul 2026 09:26:33 +0000 (11:26 +0200)] 
lib: client writer tweaks

- keep pause state at request
- keep presense of content decoding writers at request
- only add cw-pause writer when content decoding happens
- define macro for passing data down the writer chain

scorecard: add option to test with h2o server

Closes #22335

10 days agocf-quiche.c: minor tidy-ups
Daniel Stenberg [Mon, 20 Jul 2026 21:44:38 +0000 (23:44 +0200)] 
cf-quiche.c: minor tidy-ups

Pointed out by the GitHub AI thing

Closes #22360

10 days agolib: add multi_wakeup_internal
Stefan Eissing [Wed, 8 Jul 2026 08:34:51 +0000 (10:34 +0200)] 
lib: add multi_wakeup_internal

For threaded resolving, added an additional socket/eventfd pair to the
multi handle for notifications from threads. The original "double use"
of the standard wakeup pair did lead to regressions for apps.

The API definition of curl_multi_poll/wait/wakeup is pretty tight
regarding what effects what and adding notifications on top of that
broke what apps perceived to be the contract.

Fixes #22272
Reported-by: Sergei Zimmerman
Closes #22274

11 days agovtls_scache: allocate absolute filename on heap (Windows)
Viktor Szakats [Mon, 20 Jul 2026 15:34:20 +0000 (17:34 +0200)] 
vtls_scache: allocate absolute filename on heap (Windows)

To allow any full path lengths, beyond the 260 characters allowed by
`_MAX_PATH`.

Follow-up to fa0ccd9f1fbbbd77bf50b26e3ba231ea6c729474 #15774

Closes #22357

11 days agotests: fix type promotion on 32-bit arches in http test code
Keng-Yu Lin [Sun, 28 Jun 2026 20:43:01 +0000 (17:43 -0300)] 
tests: fix type promotion on 32-bit arches in http test code

As reported in the bug:

> On a 32-bit architecture (i386):
> 1. `chunks * chunk_size` evaluates to `unsigned int` (32-bit
>    unsigned).
> 2. Due to Usual Arithmetic Conversions in C, the signed `-1` (int)
>    operand of the ternary operator is promoted to `unsigned int`,
>    yielding `4294967295` (0xFFFFFFFF).
> 3. The ternary operator returns `4294967295` as an `unsigned int`.
> 4. This unsigned value is then assigned to `r->clength` (apr_off_t,
>    64-bit signed). Since the source is unsigned, it is zero-extended,
>    resulting in `r->clength` becoming `+4294967295`.
> 5. The subsequently executed check `if(r->clength >= 0)` evaluates to
>    true.
> 6. Inside the block, `apr_ltoa(r->pool, (long)r->clength)` casts it to
>    a 32-bit signed `long` (on 32-bit platforms), which truncates it
>    back to `-1`, formatting it as "-1" and sending the
>    "Content-Length: -1" header.
>
> On a 64-bit architecture (amd64), `size_t` is 64-bit, and `-1` (32-bit
> int) is promoted to `unsigned long` (64-bit), yielding
> `18446744073709551615`. When assigned to `r->clength` (64-bit signed),
> it wraps back to `-1`, which correctly skips the Content-Length
> generation.
>
> This type promotion mismatch can be safely fixed by avoiding the
> signed/unsigned mixture in the ternary operator.

Origin: debian, https://bugs.debian.org/1140793
Bug-Debian: https://bugs.debian.org/1140793

These are standard Debian patches' trailers, I can get rid of then if you prefer.

I've tested the fix using [debusine on i386 runner](https://debusine.debian.net/debian/developers/artifact/4083252/raw/log):

> 782s tests/http/test_05_errors.py::TestErrors::test_05_04_unclean_tls_shutdown[http/1.0] PASSED [ 17%]
> 782s tests/http/test_05_errors.py::TestErrors::test_05_04_unclean_tls_shutdown[http/1.1] PASSED [ 18%]
> 782s tests/http/test_05_errors.py::TestErrors::test_05_04_unclean_tls_shutdown[h2] PASSED [ 18%]

Versus the [i386 run in Debian's infrastructure](https://debusine.debian.net/debian/developers/artifact/4084220/raw/log):

> 2690s tests/http/test_05_errors.py::TestErrors::test_05_04_unclean_tls_shutdown[http/1.0] FAILED [ 17%]
> 2690s tests/http/test_05_errors.py::TestErrors::test_05_04_unclean_tls_shutdown[http/1.1] PASSED [ 18%]
> 2690s tests/http/test_05_errors.py::TestErrors::test_05_04_unclean_tls_shutdown[h2] PASSED [ 18%]

Closes #22210

13 days agotimeval: rename timer frequency variable
Viktor Szakats [Sat, 18 Jul 2026 01:18:11 +0000 (03:18 +0200)] 
timeval: rename timer frequency variable

It's no longer a global variable.

Follow-up to 1027d07704836c8d642abbed34ab98535de47433 #22346

Closes #22347

13 days agotimeval: make `Curl_freq` variable static (Windows)
Viktor Szakats [Sat, 18 Jul 2026 00:42:39 +0000 (02:42 +0200)] 
timeval: make `Curl_freq` variable static (Windows)

Follow-up to 64d4f5c4b660be112a02be104e7314e8bf264caa #20852

Closes #22346

2 weeks agocfilters: fix event-based connection shutdown
Graham Campbell [Sun, 12 Jul 2026 16:52:16 +0000 (17:52 +0100)] 
cfilters: fix event-based connection shutdown

- Adjust pollset during connection shutdown.

- Separate the FIRSTSOCKET and SECONDSOCKET check so that one being in
  connect or shutdown no longer adds poll events for the other.

- Fix shutdown state evaluation (as detailed below).

- Add a unit test for Curl_conn_adjust_pollset.

- Add a client for event testing.

- Test that shutdown sockets stay with the socket callback until done.

The pollset predicate now reads the connection's own shutdown state
rather than going through data->conn, and the EXPIRE_SHUTDOWN arming in
cshutdn_perform() works again: next_expire_ms started at 0 and could
never be set, so a peer that never sends a close_notify would still park
its connection forever, timeout or not.

Reported-by: pszemus@users.noreply.github.com
Fixes https://github.com/curl/curl/issues/22282
Closes https://github.com/curl/curl/pull/22304

2 weeks agourlapi: allow URLs to not have userauth (hostname)
Daniel Stenberg [Mon, 13 Jul 2026 17:13:45 +0000 (19:13 +0200)] 
urlapi: allow URLs to not have userauth (hostname)

Verified in test 1560

Fixes #22279
Reported-by: Bill Mill
Closes #22313

2 weeks agotool_cb_prg: avoid integer overflows
Daniel Stenberg [Tue, 14 Jul 2026 20:49:38 +0000 (22:49 +0200)] 
tool_cb_prg: avoid integer overflows

Verify in test 2093

Fixes #22316
Reported-by: xmoezzz on github
Closes #22328

2 weeks agolib1560: test CURLU_DEFAULT_PORT more
Daniel Stenberg [Mon, 13 Jul 2026 19:52:53 +0000 (21:52 +0200)] 
lib1560: test CURLU_DEFAULT_PORT more

Closes #22314

2 weeks agoruntests: flush cached test parts when (re)loading a file
Graham Campbell [Tue, 14 Jul 2026 00:38:01 +0000 (01:38 +0100)] 
runtests: flush cached test parts when (re)loading a file

Force test file reload on client connect in ftpserver.

Closes #22319

2 weeks agossls: fix potential memory leak on import
Stefan Eissing [Tue, 14 Jul 2026 07:35:58 +0000 (09:35 +0200)] 
ssls: fix potential memory leak on import

Memory can be leaked when importing corrupted SSL session data that
carry the same data fields repeatedly.

Fixes #22323

Closes #22324

2 weeks agotest798: force IPv4 to avoid cross-runner port aliasing
Graham Campbell [Tue, 14 Jul 2026 00:37:51 +0000 (01:37 +0100)] 
test798: force IPv4 to avoid cross-runner port aliasing

`test798` is the only test fetching `http://localhost:%HTTPPORT` without
`-4`, since it needs the hostname for its folded `domain=localhost`
cookie. curl tries `::1` first, but the test HTTP server is IPv4-only.
On the BSDs, IPv4 and IPv6 have separate ephemeral port namespaces, so
with every test server binding port 0, another parallel runner's
IPv6-bound server can hold the same numeric port. curl then connects to
the wrong runner's server, which cannot open its own `log/N/test798` and
closes without a response, giving exit 52 and an empty `server.input`.

This PR fixes this flake by adding `-4` matches what tests 389 and 392
already do. Linux is immune because wildcard IPv6 binds occupy the IPv4
port too. Seen in
https://github.com/curl/curl/actions/runs/29229170329/job/86749470571.

Closes #22318

2 weeks agongtcp2: let verify failures win over expiry processing errors
Graham Campbell [Tue, 14 Jul 2026 00:37:41 +0000 (01:37 +0100)] 
ngtcp2: let verify failures win over expiry processing errors

A flaky CI failure of `test_17_05_bad_ip_addr[h3]` (GnuTLS, event-based)
had curl detect the certificate name mismatch yet exit with
`CURLE_RECV_ERROR` (56) instead of `CURLE_PEER_FAILED_VERIFICATION`
(60). `Curl_cf_ngtcp2_cmn_connect` calls `Curl_cf_ngtcp2_cmn_set_expiry`
after its `ctx->tls_vrfy_result` override and returns the error
unfiltered, so when the server's final handshake flight happens to be
processed by the ingress inside set_expiry, the verify failure surfaces
as a generic receive error.

This PR makes set_expiry prefer `ctx->tls_vrfy_result` over generic
progress errors, as the recv and send paths already do after calling it,
and also covers the `cf-ngtcp2-proxy.c` call sites that lack the
override. Completes #21712. Seen in
https://github.com/curl/curl/actions/runs/29243256619/job/86794119412.

Closes #22317

2 weeks agoGHA: update dependency cloudflare/quiche to v0.29.3
renovate[bot] [Tue, 14 Jul 2026 17:00:38 +0000 (17:00 +0000)] 
GHA: update dependency cloudflare/quiche to v0.29.3

Follow-up to f369c7ba437962591c8aa9d0519c7b256e7ea5bf #22331
Follow-up to 899e2edec95b3df01db63ad219d3c5547a3e3ae5 #22333

Closes #22325

2 weeks agoquiche: set the max field section size
Graham Campbell [Wed, 15 Jul 2026 11:52:21 +0000 (12:52 +0100)] 
quiche: set the max field section size

quiche 0.29.3 started enforcing a default
`SETTINGS_MAX_FIELD_SECTION_SIZE` of 32 KiB, so larger response headers
now shut down the whole connection with `CURLE_HTTP3`. curl accepts up
to 300 KiB of response headers with every other backend and HTTP
version. Tell quiche to allow what curl itself allows. This keeps
test_01_11 passing with quiche 0.29.3 and it also advertises our real
limit to servers, which the RFC encourages.

Ref: 899e2edec95b3df01db63ad219d3c5547a3e3ae5 #22333
Ref: #22329
Ref: #22325
Ref: https://github.com/cloudflare/quiche/commit/9be0e4fa18594a5cca00120f6ae392e217e837e5
Ref: https://github.com/cloudflare/quiche/releases/tag/0.29.3

Closes #22331

2 weeks agoINTERNALS.md: require quiche 0.20.0+
Viktor Szakats [Wed, 15 Jul 2026 15:02:21 +0000 (17:02 +0200)] 
INTERNALS.md: require quiche 0.20.0+

For function `quiche_h3_config_set_max_field_section_size()`.

Ref: #22331
Ref: https://github.com/curl/curl/pull/22331#issuecomment-4981647189
Ref: https://github.com/cloudflare/quiche/releases/tag/0.20.0

Closes #22333

2 weeks agotidy-up: `TEXT()` vs `_TEXT()` vs `_T()` use (Windows)
Viktor Szakats [Wed, 15 Jul 2026 12:08:18 +0000 (14:08 +0200)] 
tidy-up: `TEXT()` vs `_TEXT()` vs `_T()` use (Windows)

Use `_TEXT()` when interacting with CRT functions (also prefer over
synonym `_T()`), `TEXT()` for Win32 functions.

Within curl, they mean the same because CRT/Win32 Unicode mode are
always enabled in sync.

Ref: https://devblogs.microsoft.com/oldnewthing/20040212-00/?p=40643/

Closes #22334

2 weeks agoidn: restore `MultiByteToWideChar()` `MB_ERR_INVALID_CHARS` flag
Viktor Szakats [Tue, 14 Jul 2026 17:06:37 +0000 (19:06 +0200)] 
idn: restore `MultiByteToWideChar()` `MB_ERR_INVALID_CHARS` flag

Also:
- curlx: pass this flag to the actual conversion calls, for consistency
  and robustness. (It's not stricly necessary because the initial call
  to determine size, with this flag passed, fails already on bad input.)
- schannel: unfold `MultiByteToWideChar()` line (formatting).

Ref: https://learn.microsoft.com/windows/win32/api/stringapiset/nf-stringapiset-multibytetowidechar

Follow-up to 6694a42aa0e820a6fe1e59d85ff8597b6d768d8d #19798

Closes #22326

2 weeks agoGHA: update dependency codespell to v2.4.3
renovate[bot] [Wed, 15 Jul 2026 14:58:06 +0000 (14:58 +0000)] 
GHA: update dependency codespell to v2.4.3

Closes #22332

2 weeks agomime.c: avoid integer overflow in base64 size calculation
Daniel Stenberg [Tue, 14 Jul 2026 06:52:21 +0000 (08:52 +0200)] 
mime.c: avoid integer overflow in base64 size calculation

Reported-by: xmoezzz on github
Fixes #22320
Closes #22322

2 weeks agoGHA: update debian:bookworm-slim Docker digest to 7b140f3
renovate[bot] [Tue, 14 Jul 2026 05:24:37 +0000 (05:24 +0000)] 
GHA: update debian:bookworm-slim Docker digest to 7b140f3

Closes #22321

2 weeks agounit3214: fix to pass on systems with >=128-bit pointers
Collin Funk [Sat, 11 Jul 2026 07:47:16 +0000 (00:47 -0700)] 
unit3214: fix to pass on systems with >=128-bit pointers

E.g. on CHERI pointers are 128 bits [1]. This causes the unit3214 test
to fail, which was written with more traditional platforms in mind. Here
is the output of log/stderr3214:

```
URL: -
BAD: struct Curl_easy is 7984 bytes, allowed to be 5370: 2614 bytes too big
BAD: struct connectdata is 1408 bytes, allowed to be 1300: 108 bytes too big
BAD: struct Curl_multi is 1248 bytes, allowed to be 850: 398 bytes too big
BAD: struct curl_httppost is 224 bytes, allowed to be 112: 112 bytes too big
BAD: struct curl_slist is 32 bytes, allowed to be 16: 16 bytes too big
BAD: struct curl_khkey is 32 bytes, allowed to be 24: 8 bytes too big
BAD: struct curl_hstsentry is 48 bytes, allowed to be 40: 8 bytes too big
BAD: struct curl_mime is 144 bytes, allowed to be 96: 48 bytes too big
BAD: struct curl_mimepart is 592 bytes, allowed to be 440: 152 bytes too big
BAD: struct curl_certinfo is 32 bytes, allowed to be 16: 16 bytes too big
BAD: struct curl_tlssessioninfo is 32 bytes, allowed to be 16: 16 bytes too big
BAD: struct curl_blob is 32 bytes, allowed to be 24: 8 bytes too big
BAD: struct CURLMsg is 48 bytes, allowed to be 24: 24 bytes too big
BAD: struct curl_header is 80 bytes, allowed to be 48: 32 bytes too big
Test ended with result 14
```

Multiply the allowed size on systems with larger than 64-bit pointers.

[1] https://www.cl.cam.ac.uk/research/security/ctsrd/pdfs/20171017a-cheri-poster.pdf

Closes #22299

2 weeks agoGHA: update dependency google/boringssl to v0.20260713.0
renovate[bot] [Mon, 13 Jul 2026 18:56:23 +0000 (18:56 +0000)] 
GHA: update dependency google/boringssl to v0.20260713.0

Closes #22311

2 weeks agotest1560: allow to build and run without LDAP support
Daniel Stenberg [Mon, 13 Jul 2026 16:54:20 +0000 (18:54 +0200)] 
test1560: allow to build and run without LDAP support

Closes #22312

2 weeks agoRELEASE-NOTES: synced
Daniel Stenberg [Mon, 13 Jul 2026 10:34:23 +0000 (12:34 +0200)] 
RELEASE-NOTES: synced

And bump to 8.22.0 for the pending release

2 weeks agoscripts/contri*: find 'Thanks-to' references
Viktor Szakats [Fri, 10 Jul 2026 10:17:52 +0000 (12:17 +0200)] 
scripts/contri*: find 'Thanks-to' references

Also any other `<word>-to:` alternatives.

Co-authored-by: Daniel Stenberg
Closes #22293

2 weeks agolib: ratelimit timestamps
Stefan Eissing [Fri, 10 Jul 2026 09:47:48 +0000 (11:47 +0200)] 
lib: ratelimit timestamps

Remove the timestamp passed for ratelimit checks. Let the limit
calculation obtain a timestamp when it needs it. Most transfers run
without active ratelimits and getting a fresh timestamp is unnecessary.

Closes #22292

2 weeks agohostip: only cache negative resolves for authoritative answers
Graham Campbell [Sun, 12 Jul 2026 02:58:18 +0000 (03:58 +0100)] 
hostip: only cache negative resolves for authoritative answers

Closes #22302

2 weeks agoconfigure: set ldap lib to no by default for non-finds
Daniel Stenberg [Mon, 13 Jul 2026 07:02:43 +0000 (09:02 +0200)] 
configure: set ldap lib to no by default for non-finds

`ldap_lib_ok` is never actually set at the start, so a prior cached
autoconf result could lead to an incorrect value.

Pointed out by the GitHub AI

Closes #22308

2 weeks agoconfigure: remove double check for GnuTLS
Daniel Stenberg [Mon, 13 Jul 2026 06:57:52 +0000 (08:57 +0200)] 
configure: remove double check for GnuTLS

`GNUTLS_ENABLED` was checked twice in the HTTPS-proxy support block,
making the second check redundant.

- also fix the "or upper" phrasing which is hard to understand

Pointed out by the GitHub AI thing

Closes #22307

2 weeks agoftp: reject control bytes in ACCT and alternative-to-user
Alhuda Khan [Sun, 12 Jul 2026 12:01:44 +0000 (17:31 +0530)] 
ftp: reject control bytes in ACCT and alternative-to-user

A CR or LF in the CURLOPT_FTP_ACCOUNT or CURLOPT_FTP_ALTERNATIVE_TO_USER
string split the control-channel command line and smuggled a second FTP
command. Reject a byte below 0x20 in both values before the command is
built.

Closes #22301

2 weeks agomime: reject CR and LF in mail part name and filename
Alhuda Khan [Thu, 2 Jul 2026 10:53:36 +0000 (16:23 +0530)] 
mime: reject CR and LF in mail part name and filename

Closes #22247

2 weeks agoconncache: apply multi limits to transfers using a shared pool
Graham Campbell [Sat, 4 Jul 2026 19:45:31 +0000 (20:45 +0100)] 
conncache: apply multi limits to transfers using a shared pool

- Determine max host and total connection limits from the transfer's own
  multi handle and test that it works for shared connections.

Prior to this change, since df67269 (precedes 8.13.0),
Curl_cpool_check_limits() took the limits from the multi handle that
owns the pool. A share-owned pool is not owned by any multi, so the
limit check always passed.

Prior to df67269 the limits came from the transfer's own multi handle.

Fixes https://github.com/curl/curl/issues/22265
Closes https://github.com/curl/curl/pull/22266

2 weeks agoconfigure: fix misleading error messages
Emmanuel Ugwu [Sat, 11 Jul 2026 19:02:33 +0000 (20:02 +0100)] 
configure: fix misleading error messages

Reported-by: Bryan Henderson
URL: https://curl.se/mail/lib-2026-07/0010.html
Closes #22300
Signed-off-by: Emmanuel Ugwu <emmanuelugwu121@gmail.com>
2 weeks agoCURLOPT_HEADERFUNCTION.md: document folded header unfolding
itzTanos29 [Fri, 10 Jul 2026 16:57:41 +0000 (12:57 -0400)] 
CURLOPT_HEADERFUNCTION.md: document folded header unfolding

Fixes #22296
Closes #22297

2 weeks agows: pause/unpause write handling
Stefan Eissing [Thu, 9 Jul 2026 10:45:51 +0000 (12:45 +0200)] 
ws: pause/unpause write handling

Websocket frames need to be written individualy, so that applications
can access the frame meta data correctly. This worked until the write
function triggered a pause. Remaining frames accumulated in the "out"
writer's buffer and on unpaused were written in one chunk.

ws decode writer will now stop writing frames when the client writer
is paused. To handle the writing of buffered raw data after an unpause,
client writers have gotten a new "flush" method.

Add pytest test_20_12 with a new client to check handling of pauses
and websocket frames.

Reported-by: Hendrik Hübner
Fixes #22273
Closes #22283

2 weeks agotests: remove test1701
Stefan Eissing [Fri, 10 Jul 2026 07:58:08 +0000 (09:58 +0200)] 
tests: remove test1701

Test 1701 did a HTTP/2 Upgrade in a HTTP/1.1 POST request. This will no
longer be supported in the upcoming nghttp2 release for security reasons
(Upgrade requests with body a re messy, error prone and can easily lead
to connection confusion).

As no other server we have supports this, remove the test.

Reported-by: firexinghe on github
Fixes #22280
Closes #22291