This commit is contained in:
parent
8d9fdfa9b5
commit
7b3ceb2467
23
src/main.rs
23
src/main.rs
@ -32,6 +32,10 @@ struct Args {
|
|||||||
/// The path on the server this server will save requests and responses
|
/// The path on the server this server will save requests and responses
|
||||||
#[arg(short, long, default_value = "storage")]
|
#[arg(short, long, default_value = "storage")]
|
||||||
storage_path: String,
|
storage_path: String,
|
||||||
|
|
||||||
|
/// Only forward requests that match a given prefix
|
||||||
|
#[arg(short, long)]
|
||||||
|
prefix: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get the current time since epoch
|
/// Get the current time since epoch
|
||||||
@ -62,7 +66,10 @@ async fn main() -> Result<(), Box<dyn Error>> {
|
|||||||
let (mut client_socket, _) = listener.accept().await?;
|
let (mut client_socket, _) = listener.accept().await?;
|
||||||
|
|
||||||
tokio::spawn(async move {
|
tokio::spawn(async move {
|
||||||
log::info!("Start new connection from {}", client_socket.peer_addr().unwrap());
|
log::info!(
|
||||||
|
"Start new connection from {}",
|
||||||
|
client_socket.peer_addr().unwrap()
|
||||||
|
);
|
||||||
|
|
||||||
let args = Args::parse();
|
let args = Args::parse();
|
||||||
|
|
||||||
@ -126,7 +133,17 @@ async fn main() -> Result<(), Box<dyn Error>> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// We need to modify some headers (if not done already) to adapt the request to the server
|
// We need to modify some headers (if not done already) to adapt the request to the server
|
||||||
let buff = if !modified_headers {
|
let buff = if !modified_headers {
|
||||||
|
|
||||||
|
// Check for URL prefix
|
||||||
|
if let Some(prefix) = &args.prefix {
|
||||||
|
if !String::from_utf8_lossy(&buf_client[..count]).split_once('\n').map(|l|l.0).unwrap_or("").contains(&format!(" {prefix}")) {
|
||||||
|
client_write.write_all(b"HTTP/1.1 401 Forbidden\r\n\r\nNot proxifiable.\r\n").await.expect("Failed to respond to client");
|
||||||
|
client_write.flush().await.expect("Failed to flush response to client!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
modified_headers = true;
|
modified_headers = true;
|
||||||
manipulate_headers(&buf_client[..count], &args.upstream_dns)
|
manipulate_headers(&buf_client[..count], &args.upstream_dns)
|
||||||
}
|
}
|
||||||
@ -165,8 +182,6 @@ async fn main() -> Result<(), Box<dyn Error>> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn manipulate_headers(buff: &[u8], host: &str) -> Vec<u8> {
|
fn manipulate_headers(buff: &[u8], host: &str) -> Vec<u8> {
|
||||||
// return buff.to_vec();
|
|
||||||
|
|
||||||
let mut out = Vec::with_capacity(buff.len());
|
let mut out = Vec::with_capacity(buff.len());
|
||||||
|
|
||||||
let mut i = 0;
|
let mut i = 0;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user