use axum::{
extract::Request,
response::Response,
Router, routing::get,
};
use reqwest::Client;
async fn proxy(mut req: Request) -> Response {
let client = Client::new();
let path = req.uri().path_and_query()
.map(|x| x.as_str())
.unwrap_or("/");
let target_url = format!("https://httpbin.org{}", path);
let mut builder = client.request(req.method().clone(), &target_url);
for (key, value) in req.headers() {
if key != "host" {
builder = builder.header(key, value);
}
}
let body = axum::body::to_bytes(req.body_mut(), usize::MAX)
.await
.unwrap();
let resp = builder.body(body).send().await.unwrap();
let mut response = Response::builder()
.status(resp.status());
for (key, value) in resp.headers() {
response = response.header(key, value);
}
response.body(axum::body::Body::from(resp.bytes().await.unwrap())).unwrap()
}
#[tokio::main]
async fn main() {
let app = Router::new()
.fallback(proxy);
let listener = tokio::net::TcpListener::bind("0.0.0.0:8080")
.await
.unwrap();
println!("代理运行在 http://localhost:8080");
axum::serve(listener, app).await.unwrap();
}