🐛 Fix http proxy
This commit is contained in:
		
							
								
								
									
										1
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										1
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							| @@ -352,6 +352,7 @@ dependencies = [ | |||||||
|  "percent-encoding", |  "percent-encoding", | ||||||
|  "pin-project-lite", |  "pin-project-lite", | ||||||
|  "rand", |  "rand", | ||||||
|  |  "rustls", | ||||||
|  "serde", |  "serde", | ||||||
|  "serde_json", |  "serde_json", | ||||||
|  "serde_urlencoded", |  "serde_urlencoded", | ||||||
|   | |||||||
| @@ -10,7 +10,7 @@ actix-files = "0.6.5" | |||||||
| actix-proxy = "0.2.0" | actix-proxy = "0.2.0" | ||||||
| actix-web = { version = "4.5.1", features = ["rustls-0_22"] } | actix-web = { version = "4.5.1", features = ["rustls-0_22"] } | ||||||
| actix-web-httpauth = "0.8.1" | actix-web-httpauth = "0.8.1" | ||||||
| awc = "3.4.0" | awc = { version = "3.4.0", features = ["tls-rustls-0_22"] } | ||||||
| config = { version = "0.14.0", features = ["toml"] } | config = { version = "0.14.0", features = ["toml"] } | ||||||
| lazy_static = "1.4.0" | lazy_static = "1.4.0" | ||||||
| mime = "0.3.17" | mime = "0.3.17" | ||||||
|   | |||||||
| @@ -5,10 +5,14 @@ id = "root" | |||||||
| hosts = ["localhost"] | hosts = ["localhost"] | ||||||
| paths = ["/"] | paths = ["/"] | ||||||
| [[locations.destinations]] | [[locations.destinations]] | ||||||
| id = "static" | id = "hypertext" | ||||||
| uri = "files://regions?index=index.html" | uri = "https://postman-echo.com/get" | ||||||
|  | # [[locations.destinations]] | ||||||
|  | # id = "static" | ||||||
|  | # uri = "files://regions?index=index.html" | ||||||
|  |  | ||||||
| [[applications]] |  | ||||||
| id = "script" | # [[applications]] | ||||||
| exe = "./script.sh" | # id = "script" | ||||||
| workdir = "regions" | # exe = "./script.sh" | ||||||
|  | # workdir = "regions" | ||||||
| @@ -1,3 +1,3 @@ | |||||||
| #!/bin/bash | #!/bin/bash | ||||||
|  |  | ||||||
| echo "Good morning!" | echo "Good morning!" > ./kokodayo.txt | ||||||
|   | |||||||
| @@ -12,7 +12,7 @@ use super::responder::StaticResponderConfig; | |||||||
| pub struct Region { | pub struct Region { | ||||||
|     pub id: String, |     pub id: String, | ||||||
|     pub locations: Vec<Location>, |     pub locations: Vec<Location>, | ||||||
|     pub applications: Vec<Application>, |     pub applications: Option<Vec<Application>>, | ||||||
| } | } | ||||||
|  |  | ||||||
| #[derive(Debug, Clone, Serialize, Deserialize)] | #[derive(Debug, Clone, Serialize, Deserialize)] | ||||||
|   | |||||||
| @@ -5,7 +5,8 @@ use std::{ | |||||||
| use actix_files::{NamedFile}; | use actix_files::{NamedFile}; | ||||||
| use actix_proxy::IntoHttpResponse; | use actix_proxy::IntoHttpResponse; | ||||||
| use actix_web::{HttpRequest, HttpResponse, web}; | use actix_web::{HttpRequest, HttpResponse, web}; | ||||||
| use actix_web::http::Method; | use actix_web::http::{header, Method}; | ||||||
|  | use actix_web::http::header::HeaderValue; | ||||||
| use awc::Client; | use awc::Client; | ||||||
| use tracing::log::warn; | use tracing::log::warn; | ||||||
| use crate::proxies::ProxyError; | use crate::proxies::ProxyError; | ||||||
| @@ -15,29 +16,32 @@ pub async fn respond_hypertext( | |||||||
|     req: HttpRequest, |     req: HttpRequest, | ||||||
|     client: web::Data<Client>, |     client: web::Data<Client>, | ||||||
| ) -> Result<HttpResponse, ProxyError> { | ) -> Result<HttpResponse, ProxyError> { | ||||||
|     let ip = req.peer_addr().unwrap().ip().to_string(); |     let conn = req.connection_info(); | ||||||
|     let proto = req.uri().scheme_str().unwrap(); |     let ip = conn.realip_remote_addr().unwrap_or("0.0.0.0"); | ||||||
|     let host = req.uri().host().unwrap(); |     let proto = conn.scheme(); | ||||||
|  |     let host = conn.host(); | ||||||
|  |  | ||||||
|     let mut headers = req.headers().clone(); |     let mut headers = req.headers().clone(); | ||||||
|     headers.insert("Server".parse().unwrap(), "RoadSign".parse().unwrap()); |     headers.insert(header::X_FORWARDED_FOR, ip.parse().unwrap()); | ||||||
|     headers.insert("X-Forward-For".parse().unwrap(), ip.parse().unwrap()); |     headers.insert(header::X_FORWARDED_PROTO, proto.parse().unwrap()); | ||||||
|     headers.insert("X-Forwarded-Proto".parse().unwrap(), proto.parse().unwrap()); |     headers.insert(header::X_FORWARDED_HOST, host.parse().unwrap()); | ||||||
|     headers.insert("X-Forwarded-Host".parse().unwrap(), host.parse().unwrap()); |  | ||||||
|     headers.insert("X-Real-IP".parse().unwrap(), ip.parse().unwrap()); |  | ||||||
|     headers.insert( |     headers.insert( | ||||||
|         "Forwarded".parse().unwrap(), |         header::FORWARDED, | ||||||
|         format!("by={};for={};host={};proto={}", ip, ip, host, proto) |         format!("by={};for={};host={};proto={}", ip, ip, host, proto) | ||||||
|             .parse() |             .parse() | ||||||
|             .unwrap(), |             .unwrap(), | ||||||
|     ); |     ); | ||||||
|  |  | ||||||
|     let res = client.get(uri).send().await; |     let append_part = req.uri().to_string().chars().skip(1).collect::<String>(); | ||||||
|  |     let target_url = format!("{}{}", uri, append_part); | ||||||
|  |  | ||||||
|  |     let res = client.request(req.method().clone(), target_url).send().await; | ||||||
|  |  | ||||||
|     return match res { |     return match res { | ||||||
|         Ok(result) => { |         Ok(result) => { | ||||||
|             let mut res = result.into_http_response(); |             let mut res = result.into_http_response(); | ||||||
|             res.headers_mut().insert("Server".parse().unwrap(), "RoadSign".parse().unwrap()); |             res.headers_mut().insert(header::SERVER, HeaderValue::from_static("RoadSign")); | ||||||
|  |             res.headers_mut().remove(header::CONTENT_ENCODING); | ||||||
|             Ok(res) |             Ok(res) | ||||||
|         } |         } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -55,9 +55,9 @@ pub async fn handle(req: HttpRequest, client: web::Data<Client>) -> HttpResponse | |||||||
|     let loc = location.clone(); |     let loc = location.clone(); | ||||||
|     let end = destination.clone(); |     let end = destination.clone(); | ||||||
|  |  | ||||||
|     let ip = match req.peer_addr() { |     let ip = match req.connection_info().realip_remote_addr() { | ||||||
|         None => "unknown".to_string(), |         None => "unknown".to_string(), | ||||||
|         Some(val) => val.ip().to_string() |         Some(val) => val.to_string(), | ||||||
|     }; |     }; | ||||||
|     let ua = match req.headers().get(header::USER_AGENT) { |     let ua = match req.headers().get(header::USER_AGENT) { | ||||||
|         None => "unknown".to_string(), |         None => "unknown".to_string(), | ||||||
|   | |||||||
| @@ -29,7 +29,7 @@ pub fn build_single_proxy(cfg: ServerBindConfig) -> Result<Server, Box<dyn error | |||||||
|         App::new() |         App::new() | ||||||
|             .wrap(Logger::default()) |             .wrap(Logger::default()) | ||||||
|             .app_data(web::Data::new(Client::default())) |             .app_data(web::Data::new(Client::default())) | ||||||
|             .route("/", web::to(route::handle)) |             .default_service(web::to(route::handle)) | ||||||
|     }); |     }); | ||||||
|     if cfg.tls { |     if cfg.tls { | ||||||
|         Ok(server.bind_rustls_0_22(cfg.addr, use_rustls()?)?.run()) |         Ok(server.bind_rustls_0_22(cfg.addr, use_rustls()?)?.run()) | ||||||
|   | |||||||
| @@ -30,7 +30,7 @@ impl WardenInstance { | |||||||
|     pub fn scan(&mut self, regions: Vec<Region>) { |     pub fn scan(&mut self, regions: Vec<Region>) { | ||||||
|         self.applications = regions |         self.applications = regions | ||||||
|             .iter() |             .iter() | ||||||
|             .flat_map(|item| item.applications.clone()) |             .flat_map(|item| item.applications.clone().unwrap_or_default()) | ||||||
|             .collect::<Vec<Application>>(); |             .collect::<Vec<Application>>(); | ||||||
|         debug!( |         debug!( | ||||||
|             applications = format!("{:?}", self.applications), |             applications = format!("{:?}", self.applications), | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user