use log::{error, info};
use tokio::net::{TcpListener, TcpStream};
pub async fn proxy_tcp(
local: &String,
upstream: &String,
) -> Result<(), Box<dyn std::error::Error>> {
let listener = TcpListener::bind(local).await?;
info!("Proxy tcp packets from {} -> {}", local, upstream);
loop {
let (mut local_stream, saddr) = listener.accept().await?;
let forward = upstream.clone();
info!("New client from {}", saddr);
tokio::spawn(async move {
let upstream_ret = TcpStream::connect(forward.clone()).await;
match upstream_ret {
Ok(mut upstream) => {
let ret = tokio::io::copy_bidirectional(&mut local_stream, &mut upstream).await;
match ret {
Err(e) => info!("Disconnected, {}", e),
Ok((in_byte, out_byte)) => {
info!("Disconnected, in bytes={}, out bytes={}", in_byte, out_byte)
}
}
}
Err(e) => error!("Failed connect to {}, {}", forward, e),
}
});
}
}