在 Rust 中,你可以使用 hyper
和 tower-http
这两个库来创建一个 HTTP 代理服务器。下面是一个简单的示例,展示了如何配置一个基本的 HTTP 代理服务器:
首先,确保在你的 Cargo.toml
文件中添加了以下依赖:
[dependencies]
hyper = "0.14"
tower-http = "0.2"
tokio = { version = "1", features = ["full"] }
然后,你可以创建一个名为 main.rs
的文件,并在其中编写以下代码:
use hyper::{service::{make_service_fn, service_fn}, Server, Body, Request, Response};
use hyper::service::conn::AddrStream;
use hyper::net::SocketAddr;
use tower_http::cors::{CorsLayer, Origin};
use std::convert::Infallible;
async fn handle_request(req: Request<Body>) -> Result<Response<Body>, Infallible> {
println!("Request: {:?}", req);
let target = "http://example.com"; // 将请求转发到的目标服务器
let mut target_req = Request::builder()
.method(req.method())
.uri(target)
.body(req.into_body())
.expect("Failed to build target request");
let client = hyper::Client::new();
let resp = client.request(target_req).await?;
Ok(Response::builder()
.status(resp.status())
.body(resp.into_body())
.expect("Failed to build response"))
}
#[tokio::main]
async fn main() {
let addr = SocketAddr::from(([127, 0, 0, 1], 3000)); // 代理服务器的地址和端口
let make_svc = make_service_fn(|_conn| {
async { Ok::<_, Infallible>(service_fn(handle_request)) }
});
let server = Server::bind(&addr).serve(make_svc);
if let Err(e) = server.await {
eprintln!("Server error: {}", e);
}
}
这个示例创建了一个简单的 HTTP 代理服务器,监听本地的 3000 端口。当代理收到请求时,它会将请求转发到 http://example.com
。你可以根据需要修改目标服务器的地址。
注意:这个示例没有包含 CORS 支持。如果你需要处理跨域请求,可以使用 tower-http
库中的 CorsLayer
。在上面的代码中,我已经添加了一个简单的 CORS 配置,允许所有来源的请求。你可以根据需要调整 CORS 策略。