Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,9 @@ jobs:
# Old opentelemetry features group to improve performance
- name: test
run: cargo hack test --feature-powerset -p reqwest-tracing --exclude-features opentelemetry_0_20 --group-features opentelemetry_0_21,opentelemetry_0_22,opentelemetry_0_23,opentelemetry_0_24,opentelemetry_0_25,opentelemetry_0_26,opentelemetry_0_27

env:
CARGO_PROFILE_DEV_DEBUG: "line-tables-only"

rustfmt:
name: Rustfmt
runs-on: ubuntu-latest
Expand Down
51 changes: 51 additions & 0 deletions .github/workflows/release-plz.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
name: Release-plz

on:
push:
branches:
- main

jobs:
release-plz-release:
name: Release-plz release
runs-on: ubuntu-latest
if: ${{ github.repository_owner == 'TrueLayer' }}
permissions:
contents: write
id-token: write
steps:
- &checkout
name: Checkout repository
uses: actions/checkout@v6
with:
fetch-depth: 0
persist-credentials: true
- &install-rust
name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
- name: Run release-plz
uses: release-plz/action@v0.5
with:
command: release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

release-plz-pr:
name: Release-plz PR
runs-on: ubuntu-latest
if: ${{ github.repository_owner == 'TrueLayer' }}
permissions:
pull-requests: write
contents: write
concurrency:
group: release-plz-${{ github.ref }}
cancel-in-progress: false
steps:
- *checkout
- *install-rust
- name: Run release-plz
uses: release-plz/action@v0.5
with:
command: release-pr
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,10 @@ The `reqwest-middleware` client exposes the same interface as a plain `reqwest`
# Cargo.toml
# ...
[dependencies]
reqwest = { version = "0.12", features = ["rustls-tls"] }
reqwest-middleware = "0.4"
reqwest-retry = "0.7"
reqwest-tracing = "0.5"
reqwest = "0.13"
reqwest-middleware = "0.5"
reqwest-retry = "0.9"
reqwest-tracing = "0.6"
tokio = { version = "1.0", features = ["macros", "rt-multi-thread"] }
```

Expand Down
10 changes: 9 additions & 1 deletion reqwest-middleware/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,19 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased]
## [0.5.0] - 2026-01-07

### Changed

- Updated `thiserror` to `2.0`
- Updated `reqwest` to `0.13`
- Renamed `rustls-tls` feature to `rustls` to match reqwest's feature naming
- Added `form` feature, enables `reqwest/form`
- Added `query` feature, enables `reqwest/query`
- Made `serde` an optional dependency, enabled by `json`, `form`, or `query`

### Removed
- Remove deprecated `fetch_mode_no_cors`

## [0.4.2] - 2025-04-08

Expand Down
14 changes: 8 additions & 6 deletions reqwest-middleware/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "reqwest-middleware"
version = "0.4.2"
version = "0.5.0"
authors = ["Rodrigo Gryzinski <rodrigo.gryzinski@truelayer.com>"]
edition = "2018"
description = "Wrapper around reqwest to allow for client middleware chains."
Expand All @@ -12,22 +12,24 @@ readme = "../README.md"

[features]
multipart = ["reqwest/multipart"]
json = ["reqwest/json"]
json = ["reqwest/json", "dep:serde"]
charset = ["reqwest/charset"]
http2 = ["reqwest/http2"]
rustls-tls = ["reqwest/rustls-tls"]
rustls = ["reqwest/rustls"]
query = ["reqwest/query", "dep:serde"]
form = ["reqwest/form", "dep:serde"]

[dependencies]
anyhow = "1.0.0"
async-trait = "0.1.51"
http = "1.0.0"
reqwest = { version = "0.12.0", default-features = false }
serde = "1.0.106"
reqwest = { version = "0.13.1", default-features = false }
serde = { version = "1.0.106", optional = true }
thiserror = "2.0"
tower-service = "0.3.0"

[dev-dependencies]
reqwest = { version = "0.12.0", features = ["rustls-tls"] }
reqwest = { version = "0.13.1", features = ["rustls"] }
reqwest-retry = { path = "../reqwest-retry" }
reqwest-tracing = { path = "../reqwest-tracing" }
tokio = { version = "1.0.0", features = ["macros", "rt-multi-thread"] }
Expand Down
26 changes: 5 additions & 21 deletions reqwest-middleware/src/client.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
use http::Extensions;
use reqwest::header::{HeaderMap, HeaderName, HeaderValue};
use reqwest::{Body, Client, IntoUrl, Method, Request, Response};
use serde::Serialize;
use std::convert::TryFrom;
use std::fmt::{self, Display};
use std::sync::Arc;
Expand Down Expand Up @@ -440,6 +439,7 @@ impl RequestBuilder {
}
}

#[cfg(feature = "query")]
/// Modify the query string of the URL.
///
/// Modifies the URL of this request, adding the parameters provided.
Expand All @@ -458,13 +458,14 @@ impl RequestBuilder {
/// # Errors
/// This method will fail if the object you provide cannot be serialized
/// into a query string.
pub fn query<T: Serialize + ?Sized>(self, query: &T) -> Self {
pub fn query<T: serde::Serialize + ?Sized>(self, query: &T) -> Self {
RequestBuilder {
inner: self.inner.query(query),
..self
}
}

#[cfg(feature = "form")]
/// Send a form body.
///
/// Sets the body to the url encoded serialization of the passed value,
Expand Down Expand Up @@ -492,7 +493,7 @@ impl RequestBuilder {
///
/// This method fails if the passed value cannot be serialized into
/// url encoded format
pub fn form<T: Serialize + ?Sized>(self, form: &T) -> Self {
pub fn form<T: serde::Serialize + ?Sized>(self, form: &T) -> Self {
RequestBuilder {
inner: self.inner.form(form),
..self
Expand All @@ -511,30 +512,13 @@ impl RequestBuilder {
/// fail, or if `T` contains a map with non-string keys.
#[cfg(feature = "json")]
#[cfg_attr(docsrs, doc(cfg(feature = "json")))]
pub fn json<T: Serialize + ?Sized>(self, json: &T) -> Self {
pub fn json<T: serde::Serialize + ?Sized>(self, json: &T) -> Self {
RequestBuilder {
inner: self.inner.json(json),
..self
}
}

/// Disable CORS on fetching the request.
///
/// # WASM
///
/// This option is only effective with WebAssembly target.
///
/// The [request mode][mdn] will be set to 'no-cors'.
///
/// [mdn]: https://developer.mozilla.org/en-US/docs/Web/API/Request/mode
#[deprecated(note = "Deprecated Upstream")]
pub fn fetch_mode_no_cors(self) -> Self {
RequestBuilder {
inner: self.inner.fetch_mode_no_cors(),
..self
}
}

/// Build a `Request`, which can be inspected, modified and executed with
/// `ClientWithMiddleware::execute()`.
pub fn build(self) -> reqwest::Result<Request> {
Expand Down
6 changes: 5 additions & 1 deletion reqwest-retry/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,11 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased]
## [0.9.0] - 2026-01-07

### Changed

- Updated `reqwest` to `0.13`

## [0.8.0] - 2025-11-26

Expand Down
6 changes: 3 additions & 3 deletions reqwest-retry/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "reqwest-retry"
version = "0.8.0"
version = "0.9.0"
authors = ["Rodrigo Gryzinski <rodrigo.gryzinski@truelayer.com>"]
edition = "2018"
description = "Retry middleware for reqwest."
Expand All @@ -14,13 +14,13 @@ default = ["tracing"]
tracing = ["dep:tracing"]

[dependencies]
reqwest-middleware = { version = ">0.3.0, <0.5.0", path = "../reqwest-middleware" }
reqwest-middleware = { version = "0.5", path = "../reqwest-middleware" }

anyhow = "1.0.0"
async-trait = "0.1.51"
futures = "0.3.0"
http = "1.0"
reqwest = { version = "0.12.0", default-features = false }
reqwest = { version = "0.13.1", default-features = false }
retry-policies = "0.5"
thiserror = "2.0"
tracing = { version = "0.1.26", optional = true }
Expand Down
6 changes: 6 additions & 0 deletions reqwest-tracing/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0


## [Unreleased]
- Added support for OpenTelemetry `0.31` ([#249](https://github.com/TrueLayer/reqwest-middleware/pull/249))

## [0.6.0] - 2026-01-07

### Changed
- Updated `reqwest` to `0.13`

## [0.5.8] - 2025-06-16

Expand Down
12 changes: 8 additions & 4 deletions reqwest-tracing/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "reqwest-tracing"
version = "0.5.8"
version = "0.6.0"
authors = ["Rodrigo Gryzinski <rodrigo.gryzinski@truelayer.com>"]
edition = "2018"
description = "Opentracing middleware for reqwest."
Expand All @@ -21,19 +21,20 @@ opentelemetry_0_27 = ["opentelemetry_0_27_pkg", "tracing-opentelemetry_0_28_pkg"
opentelemetry_0_28 = ["opentelemetry_0_28_pkg", "tracing-opentelemetry_0_29_pkg"]
opentelemetry_0_29 = ["opentelemetry_0_29_pkg", "tracing-opentelemetry_0_30_pkg"]
opentelemetry_0_30 = ["opentelemetry_0_30_pkg", "tracing-opentelemetry_0_31_pkg"]
opentelemetry_0_31 = ["opentelemetry_0_31_pkg", "tracing-opentelemetry_0_32_pkg"]
# This feature ensures that both the old (deprecated) and new attributes are published simultaneously.
# By doing so, we maintain backward compatibility, allowing existing code that relies on the old attributes
# to continue functioning while encouraging the transition to the new attributes.
deprecated_attributes = []

[dependencies]
reqwest-middleware = { version = ">0.3.0, <0.5.0", path = "../reqwest-middleware" }
reqwest-middleware = { version = "0.5", path = "../reqwest-middleware" }

anyhow = "1.0.70"
async-trait = "0.1.51"
matchit = "0.8.0"
http = "1"
reqwest = { version = "0.12.0", default-features = false }
reqwest = { version = "0.13.1", default-features = false }
tracing = "0.1.26"

opentelemetry_0_20_pkg = { package = "opentelemetry", version = "0.20.0", optional = true }
Expand All @@ -47,6 +48,7 @@ opentelemetry_0_27_pkg = { package = "opentelemetry", version = "0.27.0", option
opentelemetry_0_28_pkg = { package = "opentelemetry", version = "0.28.0", optional = true }
opentelemetry_0_29_pkg = { package = "opentelemetry", version = "0.29.0", optional = true }
opentelemetry_0_30_pkg = { package = "opentelemetry", version = "0.30.0", optional = true }
opentelemetry_0_31_pkg = { package = "opentelemetry", version = "0.31.0", optional = true }
tracing-opentelemetry_0_21_pkg = { package = "tracing-opentelemetry", version = "0.21.0", optional = true }
tracing-opentelemetry_0_22_pkg = { package = "tracing-opentelemetry", version = "0.22.0", optional = true }
tracing-opentelemetry_0_23_pkg = { package = "tracing-opentelemetry", version = "0.23.0", optional = true }
Expand All @@ -58,6 +60,7 @@ tracing-opentelemetry_0_28_pkg = { package = "tracing-opentelemetry", version =
tracing-opentelemetry_0_29_pkg = { package = "tracing-opentelemetry", version = "0.29.0", optional = true }
tracing-opentelemetry_0_30_pkg = { package = "tracing-opentelemetry", version = "0.30.0", optional = true }
tracing-opentelemetry_0_31_pkg = { package = "tracing-opentelemetry", version = "0.31.0", optional = true }
tracing-opentelemetry_0_32_pkg = { package = "tracing-opentelemetry", version = "0.32.0", optional = true }

[target.'cfg(target_arch = "wasm32")'.dependencies]
getrandom = { version = "0.2.0", features = ["js"] }
Expand All @@ -66,7 +69,7 @@ getrandom = { version = "0.2.0", features = ["js"] }
tokio = { version = "1.0.0", features = ["macros"] }
tracing_subscriber = { package = "tracing-subscriber", version = "0.3.0" }
wiremock = "0.6.0"
reqwest = { version = "0.12.0", features = ["rustls-tls"] }
reqwest = { version = "0.13.1", features = ["rustls"] }

opentelemetry_sdk_0_21 = { package = "opentelemetry_sdk", version = "0.21.0", features = ["trace"] }
opentelemetry_sdk_0_22 = { package = "opentelemetry_sdk", version = "0.22.0", features = ["trace"] }
Expand All @@ -78,6 +81,7 @@ opentelemetry_sdk_0_27 = { package = "opentelemetry_sdk", version = "0.27.0", fe
opentelemetry_sdk_0_28 = { package = "opentelemetry_sdk", version = "0.28.0", features = ["trace"] }
opentelemetry_sdk_0_29 = { package = "opentelemetry_sdk", version = "0.29.0", features = ["trace"] }
opentelemetry_sdk_0_30 = { package = "opentelemetry_sdk", version = "0.30.0", features = ["trace"] }
opentelemetry_sdk_0_31 = { package = "opentelemetry_sdk", version = "0.31.0", features = ["trace"] }
opentelemetry_stdout_0_1 = { package = "opentelemetry-stdout", version = "0.1.0", features = ["trace"] }
opentelemetry_stdout_0_2 = { package = "opentelemetry-stdout", version = "0.2.0", features = ["trace"] }
opentelemetry_stdout_0_3 = { package = "opentelemetry-stdout", version = "0.3.0", features = ["trace"] }
Expand Down
12 changes: 6 additions & 6 deletions reqwest-tracing/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,10 @@ Attach `TracingMiddleware` to your client to automatically trace HTTP requests:
# ...
[dependencies]
opentelemetry = "0.22"
reqwest = { version = "0.12", features = ["rustls-tls"] }
reqwest-middleware = "0.3"
reqwest-retry = "0.5"
reqwest-tracing = { version = "0.5", features = ["opentelemetry_0_22"] }
reqwest = "0.13"
reqwest-middleware = "0.5"
reqwest-retry = "0.9"
reqwest-tracing = { version = "0.6", features = ["opentelemetry_0_22"] }
tokio = { version = "1.12.0", features = ["macros", "rt-multi-thread"] }
tracing = "0.1"
tracing-opentelemetry = "0.23"
Expand Down Expand Up @@ -96,10 +96,10 @@ an opentelemetry version feature:
```toml
[dependencies]
# ...
reqwest-tracing = { version = "0.5.0", features = ["opentelemetry_0_22"] }
reqwest-tracing = { version = "0.6.0", features = ["opentelemetry_0_22"] }
```

Available opentelemetry features are `opentelemetry_0_22`, `opentelemetry_0_21`, and `opentelemetry_0_20`,
Available opentelemetry features are `opentelemetry_0_20` through `opentelemetry_0_31`.

#### License

Expand Down
1 change: 1 addition & 0 deletions reqwest-tracing/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@ mod middleware;
feature = "opentelemetry_0_28",
feature = "opentelemetry_0_29",
feature = "opentelemetry_0_30",
feature = "opentelemetry_0_31",
))]
mod otel;
mod reqwest_otel_span_builder;
Expand Down
1 change: 1 addition & 0 deletions reqwest-tracing/src/middleware.rs
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ where
feature = "opentelemetry_0_28",
feature = "opentelemetry_0_29",
feature = "opentelemetry_0_30",
feature = "opentelemetry_0_31",
))]
let req = if extensions.get::<crate::DisableOtelPropagation>().is_none() {
// Adds tracing headers to the given request to propagate the OpenTelemetry context to downstream revivers of the request.
Expand Down
Loading