Repository navigation
v0.2.2
EggFetch v0.2.2
EggFetch 0.2.2 publishes the M007 native transport failure classifier as the coordinated release. It is a patch release under the pre-1.0 compatibility policy: public Rust, Python, C, CLI, and HTTPX APIs, the feature graph and defaults, Rust MSRV (1.89), and dependency policy are unchanged apart from the additive Rust error-domain API below.
Added
-
eggfetch-core: native transport failure classification.Errorgains one additive method,transport_failure_kind(), returningOption<TransportFailureKind>for the new#[non_exhaustive]enumTransportFailureKind::{Connect, Tls, Protocol, Cancelled};Nonemeans the typed evidence does not prove a category.use eggfetch_core::error::{Error, TransportFailureKind}; match err.transport_failure_kind() { Some(TransportFailureKind::Tls) => { /* TLS config/handshake/verification */ } Some(TransportFailureKind::Connect) => { /* connection establishment */ } Some(TransportFailureKind::Protocol) => { /* HTTP framing / premature body */ } Some(TransportFailureKind::Cancelled) => { /* cancelled before completion */ } _ => { /* unknown, or a future variant */ } }
This is a Rust core surface only. The Python, CLI, FFI, and Node adapters did not gain an equivalent classifier API; use the existing per-adapter error surfaces there.
The
Errorenum itself is unchanged — no new variants, no#[non_exhaustive], unchangedkind()tokens andDisplay. The classifier is diagnostic only and does not imply retryability:RetryPolicy::is_error_retryable()is unchanged and never consults it.
Fixed
Correctness and security hardening from the internal audit that landed after 0.2.1, plus one build fix found by the release gate itself:
- Core — timeout arithmetic saturates instead of panicking on huge finite values; CONNECT target formatting rejects
/,?,#, and@in the authority; low-level transport retry is limited to connect-level failures plus stale-pool cancellations; proxy configuration fails closed on a missing host; an empty CA directory fails closed for theca_certificate(replace) variant; SOCKS deadline overflow is treated as an already-expiredTotaltimeout;Content-Lengthconflicts are rejected; cross-originReferer/Originstripping, proxy-auth conflict handling, redirectSNI/pinning retention, andTotal-wins-tie deadline breaking are enforced. - Redaction —
proxy_rejection_bodyredacts credential-looking text on token boundaries, the redact helper always truncates at?/#,TransportHintsDebuglogs target length only, and the HTTPX cookie__repr__redacts values. - Python —
ssl.SSLContexttranslation rejects security-semanticOP_UNSAFE_LEGACY_RENEGOTIATION,OP_LEGACY_SERVER_CONNECT,OP_NO_TICKET, andOP_NO_RENEGOTIATION; websocket failures raised by native eggfetch errors are translated toWebSocketNetworkError; async streaming iterators spawn on the client runtime handle like sync iterators; non-coroutine async trace callbacks are rejected withTypeErrorbefore dispatch. - CLI —
--no-follownow parses (overrides_withinstead ofconflicts_with); JSON and NDJSON redirect URLs are routed throughsafe_url_for_displayso userinfo, query, and fragment are stripped. - FFI — out-pointers are nulled on allocation failure, the tracking pointer is cleared before
Box::from_rawso a panic fallback cannot double-free, the builder is restored onErr, and the bounded C-string scan no longer uses the signed-onlycast_unsigned()conversion that madeeggfetch-ffifail to compile on targets wherec_charisu8(aarch64 Linux and other unsigned-c_chartargets). - Node — header and body FFI failures propagate as
napi::Errorinstead of a silent skip or empty body.
Packages
- eggfetch-core 0.2.2 on crates.io
- eggfetch-http-connect 0.2.2 on crates.io
- eggfetch-cli 0.2.2 on crates.io
- eggfetch-ffi 0.2.2 on crates.io
- eggfetch-python 0.2.2 on crates.io
- eggfetch-node 0.2.2 on crates.io
- eggfetch 0.2.2 on PyPI
The PyPI release contains 18 wheels for CPython 3.10–3.15 across Linux x86_64, macOS arm64, and Windows x86_64, plus one source distribution. Python 3.15 has no stable interpreter yet, so the 3.15 wheels were built against CPython 3.15.0-rc.2 on all three platforms; that matrix row will resolve a stable 3.15.x automatically once 3.15.0 final ships.
Verification
Released from signed tag v0.2.2 on commit 015a56d7ec3edf186eec8ebccff01cbf5584274e, with Tier 1, Tier 2 (including the Rust 1.89.0 MSRV matrix, the six-profile public API oracle, and 223 semver checks), Tier 3, and a live security preflight green on that exact candidate, plus a build-only 19-distribution wheel rehearsal on the same commit.
See the changelog for full detail.