mirror of
https://github.com/actix/examples
synced 2025-06-26 17:17:42 +02:00
clean up http-proxy
This commit is contained in:
@ -4,7 +4,10 @@ version = "1.0.0"
|
||||
edition = "2021"
|
||||
|
||||
[dependencies]
|
||||
actix-web = { version = "4.0.0-beta.21", features = ["openssl"] }
|
||||
actix-web = { version = "4.0.0-rc.1", features = ["openssl"] }
|
||||
awc = "3.0.0-beta.19"
|
||||
clap = { version = "3.0.13", features = ["derive"] }
|
||||
url = "2.0"
|
||||
|
||||
clap = { version = "3", features = ["derive"] }
|
||||
env_logger = "0.9"
|
||||
log = "0.4"
|
||||
url = "2.2"
|
||||
|
@ -1,4 +1,4 @@
|
||||
## HTTP Full proxy example
|
||||
## HTTP naïve proxy example
|
||||
|
||||
This is a relatively simple HTTP proxy, forwarding HTTP requests to another HTTP server, including
|
||||
request body, headers, and streaming uploads.
|
||||
@ -6,5 +6,7 @@ request body, headers, and streaming uploads.
|
||||
To start:
|
||||
|
||||
``` shell
|
||||
cargo run <listen addr> <listen port> <forward addr> <forward port>
|
||||
cargo run -- <listen addr> <listen port> <forward addr> <forward port>
|
||||
# example:
|
||||
cargo run -- 127.0.0.1 3333 127.0.0.1 8080
|
||||
```
|
||||
|
@ -1,7 +1,7 @@
|
||||
use std::net::ToSocketAddrs;
|
||||
|
||||
use actix_web::{
|
||||
http::StatusCode, middleware, web, App, Error, HttpRequest, HttpResponse, HttpServer,
|
||||
error, middleware, web, App, Error, HttpRequest, HttpResponse, HttpServer,
|
||||
};
|
||||
use awc::Client;
|
||||
use clap::StructOpt;
|
||||
@ -22,15 +22,17 @@ async fn forward(
|
||||
let forwarded_req = client
|
||||
.request_from(new_url.as_str(), req.head())
|
||||
.no_decompress();
|
||||
let forwarded_req = if let Some(addr) = req.head().peer_addr {
|
||||
forwarded_req.insert_header(("x-forwarded-for", format!("{}", addr.ip())))
|
||||
} else {
|
||||
forwarded_req
|
||||
let forwarded_req = match req.head().peer_addr {
|
||||
Some(addr) => {
|
||||
forwarded_req.insert_header(("x-forwarded-for", format!("{}", addr.ip())))
|
||||
}
|
||||
None => forwarded_req,
|
||||
};
|
||||
|
||||
let res = forwarded_req.send_stream(payload).await.map_err(|e| {
|
||||
actix_web::error::InternalError::new(e, StatusCode::INTERNAL_SERVER_ERROR)
|
||||
})?;
|
||||
let res = forwarded_req
|
||||
.send_stream(payload)
|
||||
.await
|
||||
.map_err(error::ErrorInternalServerError)?;
|
||||
|
||||
let mut client_resp = HttpResponse::build(res.status());
|
||||
// Remove `Connection` as per
|
||||
@ -54,26 +56,35 @@ struct CliArguments {
|
||||
|
||||
#[actix_web::main]
|
||||
async fn main() -> std::io::Result<()> {
|
||||
env_logger::init_from_env(env_logger::Env::new().default_filter_or("info"));
|
||||
|
||||
let args = CliArguments::parse();
|
||||
let forward_url = Url::parse(&format!(
|
||||
"http://{}",
|
||||
(args.forward_addr, args.forward_port)
|
||||
.to_socket_addrs()
|
||||
.unwrap()
|
||||
.next()
|
||||
.unwrap()
|
||||
))
|
||||
.unwrap();
|
||||
|
||||
let forward_socket_addr = (args.forward_addr, args.forward_port)
|
||||
.to_socket_addrs()?
|
||||
.next()
|
||||
.expect("given forwarding address was not valid");
|
||||
|
||||
let forward_url = format!("http://{}", forward_socket_addr);
|
||||
let forward_url = Url::parse(&forward_url).unwrap();
|
||||
|
||||
log::info!(
|
||||
"starting HTTP serer at http://{}:{}",
|
||||
&args.listen_addr,
|
||||
args.listen_port
|
||||
);
|
||||
|
||||
log::info!("forwarding to {forward_url}");
|
||||
|
||||
HttpServer::new(move || {
|
||||
App::new()
|
||||
.app_data(web::Data::new(Client::new()))
|
||||
.app_data(web::Data::new(Client::default()))
|
||||
.app_data(web::Data::new(forward_url.clone()))
|
||||
.wrap(middleware::Logger::default())
|
||||
.default_service(web::route().to(forward))
|
||||
.default_service(web::to(forward))
|
||||
})
|
||||
.bind((args.listen_addr, args.listen_port))?
|
||||
.system_exit()
|
||||
.workers(2)
|
||||
.run()
|
||||
.await
|
||||
}
|
||||
|
Reference in New Issue
Block a user