在 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) -> Result, 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 策略。