warp-reverse-proxy
Fully composable warp filter that can be used as a reverse proxy. It forwards the request to the
desired address and replies back the remote address response.
Add the library dependency
[dependencies]
warp = "0.3"
warp-reverse-proxy = "0.3"
Use it as simple as:
use warp::{hyper::body::Bytes, Filter, Rejection, Reply};
use warp_reverse_proxy::reverse_proxy_filter;
async fn log_response(response: http::Response<Bytes>) -> Result<impl Reply, Rejection> {
println!("{:?}", response);
Ok(response)
}
#[tokio::main]
async fn main() {
let hello = warp::path!("hello" / String).map(|name| format!("Hello, {}!", name));
tokio::spawn(warp::serve(hello).run(([0, 0, 0, 0], 8080)));
let app = warp::path!("hello" / ..).and(
reverse_proxy_filter("".to_string(), "http://127.0.0.1:8080/".to_string())
.and_then(log_response),
);
warp::serve(app).run(([0, 0, 0, 0], 3030)).await;
}
For more control. You can compose inner library filters to help you compose your own reverse proxy:
#[tokio::main]
async fn main() {
let hello = warp::path!("hello" / String).map(|name| format!("Hello port, {}!", name));
tokio::spawn(warp::serve(hello).run(([0, 0, 0, 0], 8080)));
let request_filter = extract_request_data_filter();
let app = warp::path!("hello" / String)
.map(|port| (format!("http://127.0.0.1:{}/", port), "".to_string()))
.untuple_one()
.and(request_filter)
.and_then(proxy_to_and_forward_response)
.and_then(log_response);
warp::serve(app).run(([0, 0, 0, 0], 3030)).await;
}