Skip to content

Commit 69baf3e

Browse files
authored
chore(release): prepare v0.4.0 (#136)
## Release v0.4.0 Breaking minor release: pluggable HTTP transport abstraction (#135). ### Why 0.4.0 (not 0.3.1) `FetchOptions` gained a public `transport` field and it is an exhaustive pub struct — formally breaking for exhaustive struct-literal construction. Cargo auto-upgrades within `^0.3`, so the breaking change must move out of the 0.3.x range. ### Changelog excerpt **Highlights** - Pluggable HTTP transport: hosts route fetchkit HTTP through their own egress boundary (`FetchOptions::transport` / `ToolBuilder::transport`); fetchkit keeps URL validation, DNS pinning, redirect following, signing, body caps. Default unchanged (`ReqwestTransport`). - Hardening: YouTube/HackerNews API hosts DNS-pinned; Wikipedia/registry/arXiv/HackerNews redirects per-hop validated; specialized-fetcher JSON reads capped at `max_body_size`. - Local file saver symlink handling hardened. **Breaking Changes** - `FetchOptions` new public `transport` field — add it or use `..Default::default()`. - `FetchOptions`/`Tool`/`ToolBuilder` Debug impls are now manual. ### Verification - `cargo fmt --all -- --check` ✓ - `cargo clippy --workspace --all-targets -- -D warnings` ✓ - `cargo test --workspace` ✓ (all suites) - `RUSTDOCFLAGS="-D warnings" cargo doc --workspace --no-deps` ✓ - `cargo build --workspace --exclude fetchkit-python --release` ✓ After merge, release.yml creates the GitHub Release `v0.4.0` and dispatches publish.yml (fetchkit → fetchkit-cli, in order).
1 parent 3717d95 commit 69baf3e

4 files changed

Lines changed: 25 additions & 8 deletions

File tree

CHANGELOG.md

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,25 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10-
### Added
10+
## [0.4.0] - 2026-06-12
1111

12-
- Pluggable HTTP transport abstraction (`HttpTransport`, `TransportRequest`, `TransportResponse`, `TransportError`, `ReqwestTransport`). A host application can route fetchkit's outbound HTTP through its own egress boundary via `FetchOptions::transport`, while fetchkit retains URL validation, DNS policy (resolve-then-check, pinned addrs), manual redirect following, bot-auth signing, and body-size/timeout caps. Default behavior is unchanged (`ReqwestTransport`).
12+
### Highlights
13+
14+
- Pluggable HTTP transport: host applications can route all of fetchkit's outbound HTTP through their own egress boundary via `FetchOptions::transport` or `ToolBuilder::transport`, while fetchkit retains URL validation, DNS policy (resolve-then-check with pinned addresses), manual redirect following, bot-auth signing, and body-size/timeout caps. Default behavior is unchanged (`ReqwestTransport`).
15+
- Policy hardening alongside the transport refactor: YouTube and HackerNews API hosts are now DNS-pinned, Wikipedia/package-registry/arXiv/HackerNews redirects are validated per hop instead of delegated to reqwest, and specialized-fetcher JSON reads are capped at `max_body_size`.
16+
- Local file saver symlink handling hardened.
17+
18+
### Breaking Changes
19+
20+
- `FetchOptions` gained a public `transport` field. Code constructing `FetchOptions` with an exhaustive struct literal must add the field or switch to `..Default::default()`. No behavior change when `transport` is `None`.
21+
- `FetchOptions`, `Tool`, and `ToolBuilder` now have manual `Debug` impls (the transport renders as `"<custom>"` or `"None"`); derived-`Debug` output formats changed accordingly.
22+
23+
### What's Changed
24+
25+
* feat(transport): pluggable HttpTransport abstraction ([#135](https://github.com/everruns/fetchkit/pull/135))
26+
* fix(fetchkit): harden local file saver symlink handling ([f857737](https://github.com/everruns/fetchkit/commit/f857737))
27+
28+
**Full Changelog**: https://github.com/everruns/fetchkit/compare/v0.3.0...v0.4.0
1329

1430
## [0.3.0] - 2026-05-18
1531

@@ -198,7 +214,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
198214

199215
**Full Changelog**: https://github.com/everruns/fetchkit/commits/v0.1.0
200216

201-
[Unreleased]: https://github.com/everruns/fetchkit/compare/v0.3.0...HEAD
217+
[Unreleased]: https://github.com/everruns/fetchkit/compare/v0.4.0...HEAD
218+
[0.4.0]: https://github.com/everruns/fetchkit/compare/v0.3.0...v0.4.0
202219
[0.3.0]: https://github.com/everruns/fetchkit/compare/v0.2.0...v0.3.0
203220
[0.2.0]: https://github.com/everruns/fetchkit/compare/v0.1.3...v0.2.0
204221
[0.1.3]: https://github.com/everruns/fetchkit/compare/v0.1.2...v0.1.3

Cargo.lock

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ resolver = "2"
33
members = ["crates/*"]
44

55
[workspace.package]
6-
version = "0.3.0"
6+
version = "0.4.0"
77
edition = "2021"
88
license = "MIT"
99
authors = ["Everruns"]

crates/fetchkit-cli/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ default = []
2121
bot-auth = ["fetchkit/bot-auth"]
2222

2323
[dependencies]
24-
fetchkit = { path = "../fetchkit", version = "0.3.0" }
24+
fetchkit = { path = "../fetchkit", version = "0.4.0" }
2525
tokio = { workspace = true }
2626
clap = { workspace = true }
2727
serde = { workspace = true }

0 commit comments

Comments
 (0)