From 0c4e1414331a909d7f6f58848c4bd1c9c6ff3a0e Mon Sep 17 00:00:00 2001 From: Damian Wilkolek Date: Tue, 11 Nov 2025 18:33:28 +0100 Subject: [PATCH 1/3] chore: update dependencies --- Cargo.toml | 13 ++++++------- src/lib.rs | 39 ++++++++++++++++++++++++++++----------- 2 files changed, 34 insertions(+), 18 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index d47a3e1..7fad81c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,15 +15,14 @@ exclude = [ ] [dependencies] -hyper = "1.1" -once_cell = "1.16" -reqwest = { version = "0.11", default-features = false, features = ["stream"] } -thiserror = "1.0" -unicase = "2.6" -warp = { version = "0.3", default-features = false } +once_cell = "1.21" +reqwest = { version = "0.12", default-features = false, features = ["stream"] } +thiserror = "2.0" +unicase = "2.8" +warp = { version = "0.4", default-features = false, features = ["server", "test"] } [dev-dependencies] -bytes = "1.0" +bytes = "1.10" tokio = { version = "1", features = ["macros", "rt-multi-thread"] } [features] diff --git a/src/lib.rs b/src/lib.rs index 8a651ae..47a8bdc 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -3,10 +3,10 @@ //! //! //! ```no_run -//! use warp::{hyper::Body, Filter, Rejection, Reply, http::Response}; -//! use warp_reverse_proxy::reverse_proxy_filter; +//! use warp::{Filter, Rejection, Reply}; +//! use warp_reverse_proxy::{reverse_proxy_filter, ProxyResponse}; //! -//! async fn log_response(response: Response) -> Result { +//! async fn log_response(response: ProxyResponse) -> Result { //! println!("{:?}", response); //! Ok(response) //! } @@ -37,9 +37,22 @@ use warp::filters::path::FullPath; use warp::http; use warp::http::{HeaderMap, HeaderValue, Method as RequestMethod}; use warp::hyper::body::Bytes; -use warp::hyper::Body; use warp::{Filter, Rejection}; +#[derive(Debug)] +pub struct ProxyResponse(http::Response); + +impl warp::Reply for ProxyResponse { + fn into_response(self) -> warp::reply::Response { + let (parts, body) = self.0.into_parts(); + let mut response = warp::reply::Response::new(body.into()); + *response.status_mut() = parts.status; + *response.headers_mut() = parts.headers; + *response.version_mut() = parts.version; + response + } +} + /// Reverse proxy internal client /// /// It can be overridden if needed calling `OnceCell::set` as follows: @@ -92,7 +105,7 @@ pub type Request = (Uri, QueryParameters, Method, Headers, Bytes); pub fn reverse_proxy_filter( base_path: String, proxy_address: String, -) -> impl Filter,), Error = Rejection> + Clone { +) -> impl Filter + Clone { let proxy_address = warp::any().map(move || proxy_address.clone()); let base_path = warp::any().map(move || base_path.clone()); let data_filter = extract_request_data_filter(); @@ -101,6 +114,7 @@ pub fn reverse_proxy_filter( .and(base_path) .and(data_filter) .and_then(proxy_to_and_forward_response) + .map(ProxyResponse) .boxed() } @@ -149,10 +163,10 @@ pub fn extract_request_data_filter( /// provides the `(Uri, QueryParameters, Method, Headers, Body)` needed for calling this method. But the `proxy_address` /// and the `base_path` arguments need to be provided too. /// ```rust, ignore -/// use warp::{Filter, hyper::Body, Reply, Rejection, hyper::Response}; -/// use warp_reverse_proxy::{extract_request_data_filter, proxy_to_and_forward_response}; +/// use warp::{Filter, Reply, Rejection}; +/// use warp_reverse_proxy::{extract_request_data_filter, proxy_to_and_forward_response, ProxyResponse}; /// -/// async fn log_response(response: Response) -> Result { +/// async fn log_response(response: ProxyResponse) -> Result { /// println!("{:?}", response); /// Ok(response) /// } @@ -163,6 +177,7 @@ pub fn extract_request_data_filter( /// .untuple_one() /// .and(request_filter) /// .and_then(proxy_to_and_forward_response) +/// .map(warp_reverse_proxy::ProxyResponse) /// .and_then(log_response); /// ``` pub async fn proxy_to_and_forward_response( @@ -173,7 +188,7 @@ pub async fn proxy_to_and_forward_response( method: Method, headers: HeaderMap, body: Bytes, -) -> Result, Rejection> { +) -> Result, Rejection> { let proxy_uri = remove_relative_path(&uri, base_path, proxy_address); let request = filtered_data_to_request(proxy_uri, (uri, params, method, headers, body)) .map_err(warp::reject::custom)?; @@ -186,13 +201,15 @@ pub async fn proxy_to_and_forward_response( /// Converts a reqwest response into a http::Response async fn response_to_reply( response: reqwest::Response, -) -> Result, errors::Error> { +) -> Result, errors::Error> { let mut builder = http::Response::builder(); for (k, v) in remove_hop_headers(response.headers()).iter() { builder = builder.header(k, v); } let status = response.status(); - let body = Body::wrap_stream(response.bytes_stream()); + + let body = response.bytes().await.map_err(errors::Error::Request)?; + builder .status(status) .body(body) From cb3b9e7b3d3e383a130a1c43ce02e0ea81e31003 Mon Sep 17 00:00:00 2001 From: Damian Wilkolek Date: Fri, 2 Jan 2026 17:00:40 +0100 Subject: [PATCH 2/3] chore: update reqwest to 0.13 --- Cargo.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 7fad81c..d89aa05 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,16 +16,16 @@ exclude = [ [dependencies] once_cell = "1.21" -reqwest = { version = "0.12", default-features = false, features = ["stream"] } +reqwest = { version = "0.13", default-features = false, features = ["stream"] } thiserror = "2.0" unicase = "2.8" warp = { version = "0.4", default-features = false, features = ["server", "test"] } [dev-dependencies] -bytes = "1.10" +bytes = "1.11" tokio = { version = "1", features = ["macros", "rt-multi-thread"] } [features] default = ["default-tls"] default-tls = ["reqwest/default-tls"] -rustls-tls = ["reqwest/rustls-tls"] +rustls = ["reqwest/rustls"] From d0e58cc5d4202f81524d1531cb534c088737fcab Mon Sep 17 00:00:00 2001 From: Damian Wilkolek Date: Sat, 18 Apr 2026 19:11:22 +0200 Subject: [PATCH 3/3] update unicase --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index d89aa05..6ca05a2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,7 +18,7 @@ exclude = [ once_cell = "1.21" reqwest = { version = "0.13", default-features = false, features = ["stream"] } thiserror = "2.0" -unicase = "2.8" +unicase = "2.9" warp = { version = "0.4", default-features = false, features = ["server", "test"] } [dev-dependencies]