9 个版本 (1 个稳定版)
1.0.0 | 2022年12月19日 |
---|---|
0.5.0 | 2022年3月18日 |
0.4.0 | 2021年10月3日 |
0.3.2 | 2021年6月2日 |
0.1.0 | 2020年8月17日 |
401 在 HTTP 服务器
15,101 每月下载量
用于 21 个 Crates (4 个直接使用)
20KB
250 行
warp-reverse-proxy
完全可组合的 warp 过滤器,可作为反向代理使用。它将请求转发到目标地址,并返回远程地址的响应。
添加库依赖项
[dependencies]
warp = "0.3"
warp-reverse-proxy = "1"
使用它就像这样简单
use warp::{hyper::Body, Filter, Rejection, Reply, http::Response};
use warp_reverse_proxy::reverse_proxy_filter;
async fn log_response(response: Response<Body>) -> Result<impl Reply, Rejection> {
println!("{:?}", response);
Ok(response)
}
#[tokio::main]
async fn main() {
let hello = warp::path!("hello" / String).map(|name| format!("Hello, {}!", name));
// // spawn base server
tokio::spawn(warp::serve(hello).run(([0, 0, 0, 0], 8080)));
// Forward request to localhost in other port
let app = warp::path!("hello" / ..).and(
reverse_proxy_filter("".to_string(), "http://127.0.0.1:8080/".to_string())
.and_then(log_response),
);
// spawn proxy server
warp::serve(app).run(([0, 0, 0, 0], 3030)).await;
}
为了获得更多控制,您可以组合内部库过滤器以帮助您组合自己的反向代理
#[tokio::main]
async fn main() {
let hello = warp::path!("hello" / String).map(|name| format!("Hello port, {}!", name));
// // spawn base server
tokio::spawn(warp::serve(hello).run(([0, 0, 0, 0], 8080)));
let request_filter = extract_request_data_filter();
let app = warp::path!("hello" / String)
// build proxy address and base path data from current filter
.map(|port| (format!("http://127.0.0.1:{}/", port), "".to_string()))
.untuple_one()
// build the request with data from previous filters
.and(request_filter)
.and_then(proxy_to_and_forward_response)
.and_then(log_response);
// spawn proxy server
warp::serve(app).run(([0, 0, 0, 0], 3030)).await;
}
请求客户端初始化
默认情况下,初始化并使用一个简单的 reqwests::Client
。如果需要使用特定的客户端配置,则可以覆盖它
use warp_reverse_proxy::{reverse_proxy_filter, CLIENT as PROXY_CLIENT};
#[tokio::main]
async fn main() {
let client = reqwest::Client::builder()
.default_headers(headers)
.build().expect("client goes boom...");
PROXY_CLIENT.set(client).expect("client couldn't be set");
...
}
依赖项
~10–27MB
~402K SLoC