Skip to content

chore(client/legacy): remove disabled client_happy_eyeballs test - #336

Merged
cratelyn merged 1 commit into
masterfrom
kate/happy-eyeballs-disabled
Sep 30, 2026
Merged

cratelyn merged 1 commit into
masterfrom
kate/happy-eyeballs-disabled

Conversation

@cratelyn

@cratelyn cratelyn commented Sep 30, 2026 •

Copy link
Copy Markdown
Member

this test was completely disabled in #65. because this test is always
disabled, this can be removed.

fixes the following warning:

; cargo test --features full
   Compiling hyper-util v0.1.21 (/hyper-util)
warning: unused attribute
    --> src/client/legacy/connect/http.rs:1189:66
     |
1189 |     #[cfg_attr(not(feature = "__internal_happy_eyeballs_tests"), ignore)]
     |                                                                  ^^^^^^ help: remove this attribute
     |
note: attribute also specified here
    --> src/client/legacy/connect/http.rs:1188:5
     |
1188 |     #[ignore] // TODO
     |     ^^^^^^^^^
     = note: `#[warn(unused_attributes)]` (part of `#[warn(unused)]`) on by default

this test was completely disabled in #65. because this test is always
disabled, this can be removed.

fixes the following warning:

```
; cargo test --features full
   Compiling hyper-util v0.1.21 (/hyper-util)
warning: unused attribute
    --> src/client/legacy/connect/http.rs:1189:66
     |
1189 |     #[cfg_attr(not(feature = "__internal_happy_eyeballs_tests"), ignore)]
     |                                                                  ^^^^^^ help: remove this attribute
     |
note: attribute also specified here
    --> src/client/legacy/connect/http.rs:1188:5
     |
1188 |     #[ignore] // TODO
     |     ^^^^^^^^^
     = note: `#[warn(unused_attributes)]` (part of `#[warn(unused)]`) on by default
```

Signed-off-by: katelyn martin <git@katelyn.world>
@cratelyn
cratelyn marked this pull request as ready for review September 30, 2026 22:26
@cratelyn cratelyn self-assigned this Sep 30, 2026
@cratelyn cratelyn added C-chore Category: chore. a general chore or maintenance task. A-legacy-client Area: legacy client. labels Sep 30, 2026
Comment on lines -1187 to -1190
#[test]
#[ignore] // TODO
#[cfg_attr(not(feature = "__internal_happy_eyeballs_tests"), ignore)]
fn client_happy_eyeballs() {

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i note the TODO here, so we could alternatively comment out the cfg_attr line instead. this has been inactive for almost 3 years now however, so deleting seemed like the pragmatic choice to me.

@cratelyn
cratelyn merged commit fb070b2 into master Sep 30, 2026
18 checks passed
@cratelyn
cratelyn deleted the kate/happy-eyeballs-disabled branch September 30, 2026 22:44
cratelyn added a commit that referenced this pull request Oct 9, 2026
 ### background

`hyper-util` exposes a broad feature set, to permit dependents to opt in
to only the particular components that they need. this improves build
times, and otherwise helps users maintain a slim dependency tree.

conditional compilation across a fine-grained feature set incurs some
complexity cost however. this had left parts of the library in a state
such that various dead code warnings when this crate was built with
particular combinations of features.

this further impedes efforts like
hyperium/hyper#3842, because it is often very
difficult to work on support for multiple compilation targets (e.g.
wasm) when unrelated warnings appear when certain limited feature sets
are enabled.

 ## notable changes

 ### `common` module
 
a number of these dead code warnings were connected to the `common`
submodule. purportedly, this should contain "common" facilities reused
by both the client and server halves of the library. upon investigation
however, it turned out that most of these were only used by the legacy
client, and all were only used in a single place.

this was the cause of nearly all of the dead code lints, because it
introduced a brittle coupling in how we gated parts of the legacy client
to how we gated the `common` components behind feature flags.

this branch decomposes `common`, and moves each of the things contained
therein (an executor, a timer, a future middleware) alongside the code
that uses them.

 ### feature tests, crate-level unused linting

to help avoid regressing back into this state, this branch introduces a
crate-level enforcement of the `unused` lint group.

in combination with this, we break the `cargo hack` testing in CI into
two passes. this exercises the combinations of our client and server
features more efficiently. a justfile is introduced to provide an
ergonomic way to run these checks locally.

 ### unused feature

this commit removes the `__internal_happy_eyeballs_tests` from the
package manifest. this feature flag was only used by a test that was
previously removed in #336
(cratelyn@fb070b2).

Signed-off-by: katelyn martin <git@katelyn.world>
m277m277 pushed a commit to m277m277/rama that referenced this pull request Oct 13, 2026
from hyperium/hyper-util@66afc93
to hyperium/hyper-util@7539356

hyper-util@1c8f7c6df6cae299b39fb563942febbfba59865c
Author: Sean McArthur <sean@seanmonstar.com>

    docs: replace auto_doc_cfg (hyper-util#_237)

hyper-util@72bbd22cad4a77b57aadafd311e01a9f393e835c
Author: 0x676e67 <gngppz@gmail.com>

    perf(client): avoid redundant memory copies of Host header (hyper-util#_235)

hyper-util@3c8dbe45c6fb7bb6ab3d4a37360c8fc83c8ec2c4
Author: Vaiz <vaizerd@gmail.com>

    chore: bump windows-registry to 0.6 (hyper-util#_236)

    Co-authored-by: Sean McArthur <sean@seanmonstar.com>

hyper-util@d4f5706c4ca6a68b4d1fd7560e9f3da641548a64
Author: tottoto <tottotodev@gmail.com>

    ci: fix msrv on windows and macos target (hyper-util#_239)

hyper-util@b9dc3d221fdc2ef575d90a790c59b1f33ecbca4d
Author: tottoto <tottotodev@gmail.com>

    chore(ci): update to actions/checkout@v5 (hyper-util#_240)

hyper-util@dde14d372f7091f5dee26267ab59ca05c678f77e
Author: karanabe <152078880+karanabe@users.noreply.github.com>

    fix(client): Proxy Matcher to handle proxy auth without password (hyper-util#_241)

hyper-util@d91ea8efe6f3b09cc2fd6cc9e303566bd887a3ea
Author: Ariel Ben-Yehuda <ariel.byd@gmail.com>

    fix(rt): support fake time in legacy client and TokioTimer (hyper-util#_238)

    This avoids bad behavior like being stuck on a busy loop when tokio
    paused clock is used.

    Requires hyper 1.8.0 for hyper#_3965

    Co-authored-by: Ariel Ben-Yehuda <arielby@amazon.com>

hyper-util@203c9563a0ed51666e1829a5be3fbb33d79a3ba2
Author: Sean McArthur <sean@seanmonstar.com>

    v0.1.18

hyper-util@eed21e7bdf6a1414098487a5c4445c315521c3e8
Author: Sean McArthur <sean@seanmonstar.com>

    chore(ci): check docs links with full features (hyper-util#_245)

hyper-util@71ef2fc3309829a5fbdbbdc86c97cc2384bec521
Author: Joseph Dye <jpzh.dye@gmail.com>

    docs: fix spelling mistakes. improve RFC non-compliant behaviour with user/auth (hyper-util#_246)

hyper-util@9b1008d96bbc37546cca7ee4bd7e1701328f75e2
Author: Sean McArthur <sean@seanmonstar.com>

    feat(pool): add a Singleton pool type (hyper-util#_226)

    This creates a `Singleton` pool service which wraps an inner make-service, and queues up all calls while waiting for the one instance to be created, and then hands out clones. This pattern fits HTTP/2 well.

    The current implementation mirrors much of how the legacy pool handles connecting with HTTP/2 prior knowledge.

    Closes hyperium/hyper#3953

hyper-util@c4cf24da0d44fa04e93f7cc852fe37f5e4f4bbb2
Author: Sean McArthur <sean@seanmonstar.com>

    feat(pool): add a Cache pooling service (hyper-util#_227)

    This creates a new `Cache` type that acts as a pool over an inner make-service. Asking the Cache to produce a service will either return a cached one, or create a new one with the inner maker. The returned service is `Cached<S>`, which knows to return the service to the cache upon Drop.

    Closes hyperium/hyper#3954

hyper-util@567db01f104fd7659444e7611608a06533dc34b3
Author: Sean McArthur <sean@seanmonstar.com>

    feat(pool): add a Negotiate pooling service (hyper-util#_228)

    Creates a `Negotiate` type that uses an inner make-service, inspects the result, and then either returns an upgraded service, or fallback, depending on the negotiated. This is somewhat like a `Router`, but instead of routing on the request, it's routing on the response. It's an advanced form of an `Either`. The original use case is that of a connector that can sends ALPN to a destination, and can either comeback with HTTP/2 negotiated, or fallback to HTTP/1.

    Closes hyperium/hyper#3955

hyper-util@765bc9828d02f775d3d04c634ae3a9e512ef2b7a
Author: Sean McArthur <sean@seanmonstar.com>

    feat(pool): add a Map pool service type (hyper-util#_247)

    The `map` pool isn't a typical Service like the other pools, but rather is a stand-alone type that maps requests to keys and connectors. As a kind of router, and it cannot determine which inner service to check for backpressure until the request is made. The map implementation allows customization of extracting a key, and how to construct a connector for that key.

    Closes hyperium/hyper#3979

hyper-util@818748fbd3a223a82870e91d2b78c0590c0d66d1
Author: Sean McArthur <sean@seanmonstar.com>

    docs(pool): add module level docs for pools (hyper-util#_248)

hyper-util@d5740116a55cbf7af13d1142b365c56b1d684f3a
Author: Sean McArthur <sean@seanmonstar.com>

    v0.1.19

hyper-util@1b3fa96b1bc9057cbff49b52847c85dd79845b73
Author: Chen Hongzhi <chz@chenhongzhi.com>

    fix(matcher): improve domain matching case insensitivity (hyper-util#_251)

    Make NO_PROXY domain matching case-insensitive

hyper-util@8c4f4a0b4b0cf83ae6b7d86705f002f4efc13869
Author: 0x676e67 <gngppz@gmail.com>

    fix(matcher): improve subdomain matching case insensitivity (hyper-util#_252)

hyper-util@d5503b2b476b1274f8faf18f99217068359ec5c4
Author: Yusuke Tanaka <wing0920@gmail.com>

    docs(client): correct malformed reference link in set_interface (hyper-util#_254)

hyper-util@ad6a63da3e868ff64771df9482c5f43be9f3fd77
Author: tottoto <tottotodev@gmail.com>

    chore(ci): update to actions/checkout@v6 (hyper-util#_261)

hyper-util@af1965639fff1f79c33f692fc3e4d2da674bf727
Author: Brian Schroeder <bts@gmail.com>

    chore(client): remove unused mac imports in system proxy (hyper-util#_260)

hyper-util@d841f5d7d4ad89d61ba952c98a44313089a9465a
Author: Sean McArthur <sean@seanmonstar.com>

    bump MSRV to 1.64 (hyper-util#_258)

    Needed to update system-configuration, among other things.

    reqwest is already depending on 1.64, so we don't affect them.

hyper-util@b43aeabab2126c5724da67c179587a99c5afbb83
Author: Bugen Zhao <i@bugenzhao.com>

    chore: bump `system-configuration` to 0.7 (hyper-util#_256)

    Signed-off-by: Bugen Zhao <i@bugenzhao.com>

hyper-util@ffa53913bef060b65cf0f52cc69382c72d6fb7fd
Author: tottoto <tottotodev@gmail.com>

    chore: use standard library api (hyper-util#_263)

hyper-util@b23a13e2b7ee73e15ba008cd9b19dcd2d3861957
Author: Sean McArthur <sean@seanmonstar.com>

    v0.1.20

hyper-util@72523930fd579d038dd2f313bd5919781c6101ac
Author: Evgenii <vaizerd@gmail.com>

    perf(client): avoid redundant URI construction for pooled connections (hyper-util#_265)

    Co-authored-by: Evgenii Shutov (from Dev Box) <eshutov@microsoft.com>

hyper-util@4595a086e360fca82be2c0d7f484483a8768d450
Author: Erick Tryzelaar <erick.tryzelaar@gmail.com>

    tests: fix `cargo test ...` for a variety of features (hyper-util#_266)

    This patch fixes a number of test combinations that were failing before:

    * `cargo test`
    * `cargo test --features client-legacy`
    * `cargo test --features client-legacy,http1`
    * `cargo test --features client-legacy,http2`
    * `cargo test --features client-legacy,http1,http2`

    I would have expected this to have been caught by `cargo hack` but I'm
    guessing it wasn't testing at this depth.

hyper-util@6b3d2e830203a6b72b17043e3f0fa6fa51c82bbd
Author: Alexander Kjäll <alexander.kjall@gmail.com>

    ensure that tests work when only server-auto feature is enabled (hyper-util#_271)

    These two commands:
    cargo test --no-default-features --features server-auto --features tokio
    cargo test --no-default-features --features server-auto

hyper-util@8ae9e8b1e338a5b7d35155a0dc3708cfd94bcae2
Author: Jindřich Bär <jindrichbar@gmail.com>

    feat(client): add `http2_header_table_size` and `http2_max_concurrent_streams` methods to legacy client (hyper-util#_274)

    Adds `http2_header_table_size` and `http2_max_concurrent_streams` methods to the client legacy `Builder`.

    Co-authored-by: barjin <61918049+barjin@users.noreply.github.com>

hyper-util@e1c5a6c89bfaed11fb34bd483fe9ba616f403791
Author: Toshit Chawda <45221816+r58Playz@users.noreply.github.com>

    move `tokio/net` feature to `client-legacy` (hyper-util#_276)

    `client-pool` never actually uses `tokio/net`, only `tokio/sync`. This
    allows usage of `client-pool` unchanged on WASM.

hyper-util@0cd560f3db194eabdfce95709f0c33e3926fd51b
Author: Örjan Fors <o@42mm.org>

    feat(client): add `http2_max_local_error_reset_streams` method to legacy client (hyper-util#_277)

    Expose the h2 `max_local_error_reset_streams` setting on the legacy
    client builder, allowing users to configure the maximum number of
    local resets due to protocol errors.

    Requires hyper 1.9.0 for hyper#_4021

hyper-util@56ed22c64074bc29fb477d8c2731ac01c6322bc6
Author: Sean McArthur <sean@seanmonstar.com>

    chore(lib): bump MSRV to 1.85 and set to edition 2024 (hyper-util#_281)

    This is required to update to a newer socket2.

hyper-util@72e73147053028e347644d92fba03a9bc80bb70a
Author: Sean McArthur <sean@seanmonstar.com>

    chore(dependencies): bump socket2 to 0.6 (hyper-util#_282)

hyper-util@911d0f256342fa6740721104418c6102dc7d1d0b
Author: tottoto <tottotodev@gmail.com>

    chore: switch futures_util::pin_mut to standard library api (hyper-util#_284)

hyper-util@b88c77480141443395a8261ae404d5a9775e415c
Author: Aaron Todd <aajtodd@users.noreply.github.com>

    fix(pool): wake `Cache` waiters in FIFO order (hyper-util#_298)

    `Shared::put` handed a returned connection to the most recently parked
    waiter (`Vec::pop`), so under sustained load where checkouts outpace
    available connections the oldest waiters were never served. They waited
    until the load subsided, producing unbounded tail latency while newer
    checkouts completed promptly.

    Store waiters in a `VecDeque` and wake from the front, so a returned
    connection goes to the longest-waiting checkout. Service order is now
    arrival order; a waiter's worst-case wait is bounded by the number of
    waiters ahead of it rather than by the duration of the load.

hyper-util@ca6fdbdbeb61c9b3c7390581310a5d5f63bea436
Author: Sean McArthur <sean@seanmonstar.com>

    fix(pool): shared Singleton errors with all waiters (hyper-util#_296)

    Closes hyper#_4119

hyper-util@288dc0fac7e0c79646261a640a25c327cf1ba769
Author: Sean McArthur <sean@seanmonstar.com>

    fix(pool): Singleton shared calls pass baton if one cancels (hyper-util#_299)

hyper-util@56cdd317d51591d863af0f74e529b74ba610811e
Author: Sean McArthur <sean@seanmonstar.com>

    fix(pool): preserve Cache readiness with clones (hyper-util#_297)

hyper-util@d48450dc4ef1b2bfdd93ca2bfcae3655047ca80a
Author: Paolo Barbolini <paolo.barbolini@m4ss.net>

    chore(deps): bump base64 to 0.23 (hyper-util#_304)

hyper-util@28f0c9fc2ea4d6de1bc27ac107a019702f7d15b4
Author: Luke Parker <lukeparker5132@gmail.com>

    Update to `tracing 0.1.36` (hyper-util#_305)

    * Update to `tracing 0.1.36`

    `tracing 0.1.35` pulls in `tracing-core 0.1.27` which adopted `once_cell` over `lazy_static`, fixing some macro issues I had when I tried to compile with minimal dependencies.

    `tracing 0.1.36` is explicitly guaranteed to compile with `-Zminimal-versions`. `hyper-util` explicitly does not compile against the minimal version of `tracing 0.1` as it uses misc features added between `0.1 and 0.x`. `0.1.36` is within `hyper-util`'s MSRV bound.

    This version of `tracing` is sufficient for all my experiments I did with `-Zminimal-versions`, hence why I PR it here, but I can't confirm this is sufficient for all environments, the exact latest version of `hyper-util`, and in the future, a workflow confirming `hyper-util` compiles with `-Zminimal-versions` would be valuable. I also encountered issues with how `tower 0.4` wouldn't compile against `tower-layer 0.3` (solely `tower-layer 0.3.1`), but `tower` is no longer an explicit dependency of `hyper-util`.

    * `tokio 1.13`

    https://github.com/tokio-rs/tokio/blob/master/tokio/CHANGELOG.md#1130-october-29-2021 added `watch::Sender::send_replace`, as used in `src/client/legacy/connect/capture.rs`.

hyper-util@191b1acf0a6b18e807e4abf5a6d4a7c47979ecd6
Author: Frank Taylor <FrankTaylorLieder@users.noreply.github.com>

    fix(connect): handle IPv6 hosts as SOCKS destination (hyper-util#_302)

    This change fixes an issue when accessing IPv6 services through the SOCKS proxy using their IP address rather than hostname:
    - The IP address is passed over to the SOCKS proxy as type ATYP=0x03 (Domain name) instead of ATYP=0x04 (Address).
    - The remote end therefore tries to DNS resolve the address, which fails.

    The root cause is:
    - The target URI is of the form `http://[2001:db8::1]:8080`.
    - The proxy extracts the host part of the URI and gets back `[2001:db8::1]`. (`src/client/legacy/connect/proxy/socks/v4/mod.rs:133`)
    - It attempts to parse this as an address and fails, so assumes its a domain name. Incorrect.
    - This is not a valid IPv6 address due to the square brackets (they are part of the URI encoding of IPv6 addresses). These need to be stripped to make a valid IPv6 address.

    Fix:
    - Strip any square brackets from the host part of the URI.
    - There will never be square brackets in valid domain names or IPv4 addresses.

    Closes hyperium/hyper#4136

    Co-authored-by: Frank Taylor <ftaylor@evroc.com>

hyper-util@acd4fa6f534d305ef83afc98868c1a32acfa1716
Author: Sean McArthur <sean@seanmonstar.com>

    refactor: put ipv6 bracket parsing in a single function (hyper-util#_306)

hyper-util@6b451a1d3a17f0575f759ca04443c5217b08a09b
Author: Joseph Dye <jpzh.dye@gmail.com>

    fix(proxy): SOCKS split message parsing fix (hyper-util#_308)

    * grammar fix in comments

    * tests for message parsing (currently failing)
    - test for "incomplete" message parsing
    - test for Address::Domain parsing bug

    * port failing tests to new API + make them pass:
    - incomplete message tests fixed by parsing through a view
    - domain parsing fixed by consuming domain length

hyper-util@b31e983c2261c27aa67d0216f97cacc01511241b
Author: Almaz <hsyqixco@protonmail.com>

    fix(client): write a single NULL after USERID in SOCKS4 requests (hyper-util#_307)

    `Request::write_to_buf` emitted two NULL bytes after DSTIP, labelled
    `USERID` and `NULL`. Per SOCKS4 ("SOCKS: A protocol for TCP proxy across
    firewalls", Ying-Da Lee, https://www.openssh.com/txt/socks4.protocol),
    a CONNECT request is

        VN(1) CD(1) DSTPORT(2) DSTIP(4) USERID(variable) NULL(1)

    where USERID is a variable-length field terminated by a single NULL.
    This connector never sends a user ID, so USERID is zero bytes long and
    only its terminator belongs on the wire: 9 bytes, not 10.

    The extra byte breaks SOCKS4a ("SOCKS 4A: A Simple Extension to SOCKS 4
    Protocol", https://www.openssh.com/txt/socks4a.protocol), which appends
    a NULL-terminated hostname after the USERID terminator. A server reads
    USERID up to the first NULL (correctly empty), then reads the hostname
    up to the next NULL -- the stray byte -- so the destination arrives as
    an empty string. The request fails, and the real hostname plus its
    terminator remain in the server's receive buffer, to be relayed into the
    tunnel as the first bytes of application data.

    Plain SOCKS4 requests still parse, since the destination is carried in
    DSTIP, but the trailing byte is likewise left over and reaches the
    target as a stray leading NULL of the tunneled stream.

    The bug dates back to the connectors' introduction in hyper-util#_187, and the
    domain path had no test coverage, so a SOCKS4a test is added alongside.
    Two stale comments on the touched lines are corrected as well:
    `put_u16(*port)` was labelled `IP`, and the layout diagram read
    "only do IP is 0.0.0.X".

hyper-util@eaed54f912466ff08a99a11a7570f30e6e22a6a4
Author: Joseph Dye <jpzh.dye@gmail.com>

    fix(proxy): stop SOCKS5 optimistic sending deadlock  (hyper-util#_310)

    When using the "optimistic sending" mode, if all of the servers responses are received in a single `read` call, `read_message()` will hang waiting for more bytes that will never arrive. I've not yet found a server that does this, but best to be safe.

    Solution is to try to parse from the existing buffer of bytes before trying to read more from the network. We can add an `if !buf.is_empty()` gate to prevent calling `try_from` with an empty buffer, but I don't think it's necessary.

hyper-util@37928eec556d31306e58d64ed73a266e78effee5
Author: subotac <73706465+subotac@users.noreply.github.com>

    fix(proxy): handle WinINET IP wildcards (hyper-util#_309)

    Normalize IPv4 wildcard patterns returned by WinINET, such as 127.* and 192.168.*, into equivalent CIDR ranges before matching system proxy exclusions.

    Fixes hyper#_4128

hyper-util@4684c71db4ca392bb20583202afef777df3b3aa7
Author: subotac <73706465+subotac@users.noreply.github.com>

    fix(proxy): handle WinINET IP wildcards (hyper-util#_309)

    Normalize IPv4 wildcard patterns returned by WinINET, such as 127.* and 192.168.*, into equivalent CIDR ranges before matching system proxy exclusions.

    Fixes hyper#_4128

hyper-util@551e7bb9cb90e76bb68a637d45352df29b9742cd
Author: Laurence Rowe <l@lrowe.co.uk>

    fix(client): cancel idle interval when legacy pool empties (hyper-util#_292)

hyper-util@689dc29c98943ed687842c916d73f602b5f8307f
Author: tottoto <tottotodev@gmail.com>

    chore(lib): remove redundant import (hyper-util#_314)

hyper-util@07345689c815e115e616ce78a6a02c5df6c7081f
Author: tottoto <tottotodev@gmail.com>

    chore(ci): update to actions/checkout@v7 (hyper-util#_316)

hyper-util@7e0958bb537fb8b7901bae60d43a322c8f9a8a63
Author: tottoto <tottotodev@gmail.com>

    chore(ci): simplify msrv check (hyper-util#_317)

hyper-util@d480d9f802c7062cb0aeece9ee0020ecce840521
Author: Aashish Thapa <158542252+aashish-thapa@users.noreply.github.com>

    fix(client): parse proxy CONNECT response with httparse (hyper-util#_315)

    The CONNECT tunnel validated the proxy's response by pattern-matching the buffer instead of parsing it, which caused two problems:

    - **Malformed responses were accepted.** `starts_with(b"HTTP/1.1 200")` only checks a prefix, so a status like `HTTP/1.1 2000 OK` was treated as a successful tunnel.
    - **Server-speaks-first responses broke.** Success required the whole buffer to end with `\r\n\r\n`. When the destination's first bytes arrive in the same read (`HTTP/1.1 200 OK\r\n\r\n<data>`), that check fails, so the loop keeps reading for a response that already came and stalls until EOF.

    This parses the response with `httparse` (the parser hyper already uses). The status line is validated properly, and `Status::Complete` locates the end of the headers even when data trails them, so the tunnel establishes correctly.

    Closes hyper#_4095.

hyper-util@4dbd4945f566e2b2a40d247c4281164258bbe1a5
Author: Sean McArthur <sean@seanmonstar.com>

    feat(rt): change `TokioExecutor` to not trace, add rt-tracing-exec-force feature (hyper-util#_322)

hyper-util@f2da9150f081a6a74e40bd82b0b51f91216fa23b
Author: Florian Uekermann <florian@uekermann.me>

    feat(client): add HttpConnector::set_mark for SO_MARK (hyper-util#_303)

    This sets the `SO_MARK` option on the socket (see [`man 7 socket`] for
    details). The mark can be matched by policy routing rules and packet
    filters.

    Setting the mark requires the binary to either have `CAP_NET_ADMIN` or
    to be run as root.

hyper-util@d6b7d7e6a0fc568a1485a8199254305be50dde26
Author: katelyn martin <git@katelyn.world>

    feat(rt/tracing): introduce tracing executors (hyper-util#_323)

     ### background

    see hyperium/hyper-util#322 for more
    information.

    in hyper-util#_166, `hyper_util::rt::TokioExecutor<E>` began propagating the
    currently active `tracing::Span` to spawned tasks when
    `hyper::rt::Executor::execute()` is called.

    hyper#_3904 reports how this has since caused some issues, in
    part because some observability systems do not export spans until they
    are closed. in hyper-util#_322, we removed this behavior from
    `hyper_util::rt::TokioExecutor<E>`, with a temporary feature flag that
    can be used to preserve the previous behavior.

     ### `rt::tracing`

    this branch introduces a new submodule, `hyper_util::rt::tracing`. this
    submodule contains a collection of `Execute` wrappers to allow tracing
    spans to be propagated according to a few different common strategies.

    * `WithSpanExecutor<E>` instruments background tasks with a provided
      span.
    * `CurrentSpanExecutor<E>` instruments background tasks with the current
      span when `execute()` is called.
    * `MkSpanExecutor<E, F>` instruments background tasks with a span
      created by a provided callback.

    this submodule is gated by the `#[cfg(tracing)]` feature flag.

     ### Example

    this branch adds an example similar to `client.rs` that makes use of the
    tracing functionality in `rt::tracing`. this example uses the current
    span executor, and runs the client in an info-level span to demonstrate
    the functionality.

    the `fmt` feature is added to our development dependency upon
    `tracing_subscriber`.

    when run against the server example, the logs look like the following:

    ```
    ; cargo run --example client_tracing --features 'client client-legacy http1 tokio tracing' -- http://127.0.0.1:8000

    2026-09-21T18:12:10.840038Z  INFO client_tracing: tracing subscriber initialized
    2026-09-21T18:12:10.840072Z  INFO client_tracing: parsed URL url=http://127.0.0.1:8000/
    2026-09-21T18:12:10.840137Z TRACE sending request{url=http://127.0.0.1:8000/}: hyper_util::client::legacy::pool: checkout waiting for idle connection: ("http", 127.0.0.1:8000)
    2026-09-21T18:12:10.840181Z TRACE sending request{url=http://127.0.0.1:8000/}: hyper_util::client::legacy::connect::http: Http::connect; scheme=Some("http"), host=Some("127.0.0.1"), port=Some(Port(8000))
    2026-09-21T18:12:10.840199Z DEBUG sending request{url=http://127.0.0.1:8000/}: hyper_util::client::legacy::connect::http: connecting to 127.0.0.1:8000
    2026-09-21T18:12:10.840335Z DEBUG sending request{url=http://127.0.0.1:8000/}: hyper_util::client::legacy::connect::http: connected to 127.0.0.1:8000
    2026-09-21T18:12:10.840369Z TRACE sending request{url=http://127.0.0.1:8000/}: hyper_util::client::legacy::client: http1 handshake complete, spawning background dispatcher task
    2026-09-21T18:12:10.840386Z TRACE sending request{url=http://127.0.0.1:8000/}: hyper_util::client::legacy::client: waiting for connection to be ready
    2026-09-21T18:12:10.840422Z TRACE sending request{url=http://127.0.0.1:8000/}: hyper_util::client::legacy::client: connection is ready
    2026-09-21T18:12:10.840432Z TRACE sending request{url=http://127.0.0.1:8000/}: hyper_util::client::legacy::pool: checkout dropped for ("http", 127.0.0.1:8000)
    2026-09-21T18:12:10.840666Z TRACE sending request{url=http://127.0.0.1:8000/}: hyper_util::client::legacy::pool: put; add idle connection for ("http", 127.0.0.1:8000)
    2026-09-21T18:12:10.840689Z DEBUG sending request{url=http://127.0.0.1:8000/}: hyper_util::client::legacy::pool: pooling idle connection for ("http", 127.0.0.1:8000)
    2026-09-21T18:12:10.840709Z  INFO client_tracing: received response resp.version=HTTP/1.1 resp.status=200 OK resp.body=Hello, world!
    ```

    this demonstrates the informative context (the destination url in this
    case) that is attached to background tasks spawned by the client.

hyper-util@b9ee45111645900e0557aecd9f19cfb5fd01d77f
Author: katelyn martin <git@katelyn.world>

    docs(lib): add crate-level documentation (hyper-util#_327)

    This commit introduces crate-level documentation outlining the feature
    flags exposed by this library.

    in hyper-util#_322 (and the related hyper-util#_323), we
    made some changes to the behavior of `TokioExecutor<I>` when the
    `tracing` feature flag is enabled, and introduced a temporary opt-in
    flag to facilitate upgrading when these changes are released.

    this should help make this discoverable and friendly for dependents, and
    documentation for the other feature flags is helpful to have as well.

hyper-util@13b61105d417524c2c5b4738d6907a7534dda858
Author: katelyn martin <git@katelyn.world>

    chore(error): remove disabled `hyper_util::error` submodule (hyper-util#_325)

    since hyper-util#_19 (hyper-util@91d8b0a) the contents of `src/error.rs`
    have been commented out. this submodule can be safely removed.

    Signed-off-by: katelyn martin <git@katelyn.world>

hyper-util@cdb2346fed0af8283d5358d1d3fd5f5064db41d7
Author: katelyn martin <git@katelyn.world>

    doc(client/pool): add `broken_intra_doc_links` allowance (hyper-util#_326)

    the `Builder<D, K, S>` type is not exported publicly by design.

    however, to help keep this type's methods discoverable while remaining
    unnamable within typical code, we export it when the `docsrs` cfg flag
    is set (using the nightly toolchain).

    "fixing" this link for other typical builds would mean that the builder
    interface would no longer be visible in documentation hosted on docs.rs.

    this commit silences this warning when a command like
    `cargo doc --features full`, since we are knowingly including a link
    that might sometimes be broken.

    Signed-off-by: katelyn martin <git@katelyn.world>

hyper-util@23a868965964c1d6bb1b94f30ba4c420a4bebe7c
Author: katelyn martin <git@katelyn.world>

    v0.1.21

    Signed-off-by: katelyn martin <git@katelyn.world>

hyper-util@a7bf164bef0f8e2ef5e06f24b21285205ed4ace4
Author: dswij <dswijj@gmail.com>

    fix(client-proxy): support Windows wininet format (hyper-util#_329)

    Closes hyper#_4067.

    This PR adds support for parsing multiple proxy configuration in
    windows.

    Previously, any string value in
    HKCU\Software\Microsoft\Windows\CurrentVersion\Internet
    Settings\ProxyServer is parsed verbatim. After the change, these formats
    are now supported in Windows:

    1. destination (assumes http scheme, applied to all)
    2. scheme=destination
    3. scheme1=destination1;scheme2=destination2

    Also some minor restructuring of the proxy module.

hyper-util@756e7cf9ae85dfcaceae92dfcd98ddca5e72a843
Author: dswij <dswijj@gmail.com>

    chore(ci): remove rustdoc-preview action (hyper-util#_334)

hyper-util@5dd670ab5c786c9359093d4bfb2948572fb8af69
Author: katelyn martin <git@katelyn.world>

    feat(rt/tokio): introduce `TokioLocalExecutor` (hyper-util#_330)

    this commit contains two squashed changes:

    ---------

    * refactor(rt/tokio): move `TokioExecutor` into submodule

    this commit moves `rt::tokio::TokioExecutor` down a level into a new
    private `rt::tokio::executor` submodule. a `pub use` statement is
    placed into `rt::tokio` so that this retains an identical public
    interface.

    ---------

    * feat(rt/tokio): introduce `TokioLocalExecutor`

    the `rt::tokio::TokioExecutor` type allows for hyper clients and servers
    to be run within a tokio runtime, and generally satisfies for most
    common use cases.

    however, `tokio::spawn()` has a trait bound that is not satisfiable in
    some cases: it mandates that spawned futures be `Send`. some
    asynchronous applications are not designed to permit work-stealing
    between threads, and expect that a spawned future be polled to
    completion on the same thread that spawned it.

    in order to facilitate such uses, this commit proposes the introduction
    of another `Executor` implementation. this commit introduces
    `TokioLocalExecutor`, which makes use of `tokio::task::spawn_local()`
    rather than `tokio::task::spawn()` to spawn background tasks.

    two test cases showing that this can run a future that interacts with
    single-threaded reference counting storage (`Rc<T>`) is included to
    confirm that this works as expected, with both `LocalSet` and
    `LocalRuntime`.

    ---------

    Signed-off-by: katelyn martin <git@katelyn.world>

hyper-util@fb070b2a81ad8d6ae4f7137ecaed94b09dc46d13
Author: katelyn martin <git@katelyn.world>

    chore(client/legacy): remove disabled `client_happy_eyeballs` test (hyper-util#_336)

    this test was completely disabled in hyper-util#_65. because this test is always
    disabled, this can be removed.

    fixes the following warning:

    ```
    ; cargo test --features full
       Compiling hyper-util v0.1.21 (/hyper-util)
    warning: unused attribute
        --> src/client/legacy/connect/http.rs:1189:66
         |
    1189 |     #[cfg_attr(not(feature = "__internal_happy_eyeballs_tests"), ignore)]
         |                                                                  ^^^^^^ help: remove this attribute
         |
    note: attribute also specified here
        --> src/client/legacy/connect/http.rs:1188:5
         |
    1188 |     #[ignore] // TODO
         |     ^^^^^^^^^
         = note: `#[warn(unused_attributes)]` (part of `#[warn(unused)]`) on by default
    ```

    Signed-off-by: katelyn martin <git@katelyn.world>

hyper-util@a515398823f66e87a89619ecd2b4669cb9eb0a8f
Author: katelyn martin <git@katelyn.world>

    refactor(client): replace SyncWrapper with sync_wrapper crate (hyper-util#_335)

    the `common::sync` module contains a type called `SyncWrapper`, which
    provides an interface that permits for safely treating a `T` that is not
    `Sync`, as `Sync`.

    this exists as a public crate, `sync_wrapper` that we can use instead.
    this crate is used by `reqwest`, `tower`, `axum`, `tonic`, and other
    popular crates.

    Co-authored-by: tottoto <tottotodev@gmail.com>

hyper-util@3d99e03eec9c174bb549bf90fe103d5a8a8f76d6
Author: katelyn martin <git@katelyn.world>

    feat(rt/tokio): introduce `TokioHandleExecutor` (hyper-util#_331)

    this commit introduces an `hyper::rt::Executor` implementation,
    `HandleExecutor`. this executor is used to run tasks on a tokio runtime,
    but spawns tasks onto a particular runtime using a provided
    `tokio::runtime::Handle` rather than by calling `tokio::spawn()`

    this is useful for situations in which you wish to run tasks on a
    *separate* runtime, for example. this may be applicable to those
    configuring hyper clients and servers in applications running on NUMA
    (Non-Uniform Memory Awareneses) systems, or those that wish to manage
    provision separate resources for background tasks. see the
    [`tokio::runtime`] documentation for more information about choosing the
    correct runtime for an application.

    a unit test is included which demonstrates that `HandleExecutor` can be
    used to spawn background tasks onto a separate tokio runtime.

    this branch includes an update to the tokio dependency, bumping the
    verion from 1.13 to 1.49.

    see: https://github.com/tokio-rs/tokio/blob/master/tokio/CHANGELOG.md#1490-january-3rd-2026

    this does not break hyper-util's MSRV, this tokio release supports 1.71
    and newer. this release includes the stabilization of
    `tokio::runtime::Handle::id()`, which permit us to write unit tests that
    inspect which runtime a spawned future is being run on.

    [`tokio::runtime`]: https://docs.rs/tokio/latest/tokio/runtime/index.html#numa-awareness

    Signed-off-by: katelyn martin <git@katelyn.world>

hyper-util@9af06900bc22e06321c1006d7beee5fc282471dd
Author: Seungtaek Oh <taekop@naver.com>

    docs(client): fix broken links in legacy `Builder` docs (hyper-util#_339)

    `Builder::timer` linked to `h2::client::Builder::timer`, which does not
    exist. Point it at `hyper::client::conn::http2::Builder::timer`, which
    is what the method configures.

    Also fix the `h2::client::Builder::max_concurrent_reset_streams` link,
    whose URL was missing the `latest/h2` path segments.

    Closes hyper#_4221

hyper-util@7539356138b918bbb033f52d81703131cd7bf587
Author: katelyn martin <git@katelyn.world>

    chore: address warnings for all feature combinations (hyper-util#_340)

     ### background

    `hyper-util` exposes a broad feature set, to permit dependents to opt in
    to only the particular components that they need. this improves build
    times, and otherwise helps users maintain a slim dependency tree.

    conditional compilation across a fine-grained feature set incurs some
    complexity cost however. this had left parts of the library in a state
    such that various dead code warnings when this crate was built with
    particular combinations of features.

    this further impedes efforts like
    hyperium/hyper#3842, because it is often very
    difficult to work on support for multiple compilation targets (e.g.
    wasm) when unrelated warnings appear when certain limited feature sets
    are enabled.

     ## notable changes

     ### `common` module

    a number of these dead code warnings were connected to the `common`
    submodule. purportedly, this should contain "common" facilities reused
    by both the client and server halves of the library. upon investigation
    however, it turned out that most of these were only used by the legacy
    client, and all were only used in a single place.

    this was the cause of nearly all of the dead code lints, because it
    introduced a brittle coupling in how we gated parts of the legacy client
    to how we gated the `common` components behind feature flags.

    this branch decomposes `common`, and moves each of the things contained
    therein (an executor, a timer, a future middleware) alongside the code
    that uses them.

     ### feature tests, crate-level unused linting

    to help avoid regressing back into this state, this branch introduces a
    crate-level enforcement of the `unused` lint group.

    in combination with this, we break the `cargo hack` testing in CI into
    two passes. this exercises the combinations of our client and server
    features more efficiently. a justfile is introduced to provide an
    ergonomic way to run these checks locally.

     ### unused feature

    this commit removes the `__internal_happy_eyeballs_tests` from the
    package manifest. this feature flag was only used by a test that was
    previously removed in hyperium/hyper-util#336
    (cratelyn/hyper-util@fb070b2).

    Signed-off-by: katelyn martin <git@katelyn.world>

Co-authored-by: Sean McArthur <sean@seanmonstar.com>
Co-authored-by: 0x676e67 <gngppz@gmail.com>
Co-authored-by: Vaiz <vaizerd@gmail.com>
Co-authored-by: tottoto <tottotodev@gmail.com>
Co-authored-by: karanabe <152078880+karanabe@users.noreply.github.com>
Co-authored-by: Ariel Ben-Yehuda <ariel.byd@gmail.com>
Co-authored-by: Joseph Dye <jpzh.dye@gmail.com>
Co-authored-by: Chen Hongzhi <chz@chenhongzhi.com>
Co-authored-by: Yusuke Tanaka <wing0920@gmail.com>
Co-authored-by: Brian Schroeder <bts@gmail.com>
Co-authored-by: Bugen Zhao <i@bugenzhao.com>
Co-authored-by: Evgenii Shutov (from Dev Box) <eshutov@microsoft.com>
Co-authored-by: Erick Tryzelaar <erick.tryzelaar@gmail.com>
Co-authored-by: Alexander Kjäll <alexander.kjall@gmail.com>
Co-authored-by: Jindřich Bär <jindrichbar@gmail.com>
Co-authored-by: barjin <61918049+barjin@users.noreply.github.com>
Co-authored-by: Toshit Chawda <45221816+r58Playz@users.noreply.github.com>
Co-authored-by: Örjan Fors <o@42mm.org>
Co-authored-by: Aaron Todd <aajtodd@users.noreply.github.com>
Co-authored-by: Paolo Barbolini <paolo.barbolini@m4ss.net>
Co-authored-by: Luke Parker <lukeparker5132@gmail.com>
Co-authored-by: Frank Taylor <FrankTaylorLieder@users.noreply.github.com>
Co-authored-by: Almaz <hsyqixco@protonmail.com>
Co-authored-by: subotac <73706465+subotac@users.noreply.github.com>
Co-authored-by: Laurence Rowe <l@lrowe.co.uk>
Co-authored-by: Aashish Thapa <158542252+aashish-thapa@users.noreply.github.com>
Co-authored-by: Florian Uekermann <florian@uekermann.me>
Co-authored-by: katelyn martin <git@katelyn.world>
Co-authored-by: dswij <dswijj@gmail.com>
Co-authored-by: Seungtaek Oh <taekop@naver.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-legacy-client Area: legacy client. C-chore Category: chore. a general chore or maintenance task.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants