#反向代理 #代理 #Warp #反向 #过滤器 #代理服务器 #HTTP 响应

warp-reverse-proxy

Warp 过滤器,充当反向代理,将请求转发到代理地址并提取响应

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日

401HTTP 服务器

Download history 1800/week @ 2024-05-03 2267/week @ 2024-05-10 2400/week @ 2024-05-17 2199/week @ 2024-05-24 2291/week @ 2024-05-31 2926/week @ 2024-06-07 3934/week @ 2024-06-14 3128/week @ 2024-06-21 2563/week @ 2024-06-28 2912/week @ 2024-07-05 3168/week @ 2024-07-12 3380/week @ 2024-07-19 3143/week @ 2024-07-26 3784/week @ 2024-08-02 3510/week @ 2024-08-09 3982/week @ 2024-08-16

15,101 每月下载量
用于 21 个 Crates (4 个直接使用)

自定义许可证

20KB
250

warp-reverse-proxy

MIT licensed GHA Build Status Docs Badge

完全可组合的 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