3 changed files with 122 additions and 0 deletions
@ -0,0 +1,109 @@ |
|||
use crate::{ |
|||
directions::{IncomingDataEvent, IncomingDirection, OutgoingDataEvent, OutgoingDirection}, |
|||
proxy_handler::{ProxyHandler, ProxyHandlerManager}, |
|||
session_info::SessionInfo, |
|||
}; |
|||
use std::{collections::VecDeque, net::SocketAddr, sync::Arc}; |
|||
use tokio::sync::Mutex; |
|||
|
|||
struct NoProxyHandler { |
|||
info: SessionInfo, |
|||
domain_name: Option<String>, |
|||
client_outbuf: VecDeque<u8>, |
|||
server_outbuf: VecDeque<u8>, |
|||
udp_associate: bool, |
|||
} |
|||
|
|||
#[async_trait::async_trait] |
|||
impl ProxyHandler for NoProxyHandler { |
|||
fn get_session_info(&self) -> SessionInfo { |
|||
self.info |
|||
} |
|||
|
|||
fn get_domain_name(&self) -> Option<String> { |
|||
self.domain_name.clone() |
|||
} |
|||
|
|||
async fn push_data(&mut self, event: IncomingDataEvent<'_>) -> std::io::Result<()> { |
|||
let IncomingDataEvent { direction, buffer } = event; |
|||
match direction { |
|||
IncomingDirection::FromServer => { |
|||
self.client_outbuf.extend(buffer.iter()); |
|||
} |
|||
IncomingDirection::FromClient => { |
|||
self.server_outbuf.extend(buffer.iter()); |
|||
} |
|||
} |
|||
Ok(()) |
|||
} |
|||
|
|||
fn consume_data(&mut self, dir: OutgoingDirection, size: usize) { |
|||
let buffer = match dir { |
|||
OutgoingDirection::ToServer => &mut self.server_outbuf, |
|||
OutgoingDirection::ToClient => &mut self.client_outbuf, |
|||
}; |
|||
buffer.drain(0..size); |
|||
} |
|||
|
|||
fn peek_data(&mut self, dir: OutgoingDirection) -> OutgoingDataEvent { |
|||
let buffer = match dir { |
|||
OutgoingDirection::ToServer => &mut self.server_outbuf, |
|||
OutgoingDirection::ToClient => &mut self.client_outbuf, |
|||
}; |
|||
OutgoingDataEvent { |
|||
direction: dir, |
|||
buffer: buffer.make_contiguous(), |
|||
} |
|||
} |
|||
|
|||
fn connection_established(&self) -> bool { |
|||
true |
|||
} |
|||
|
|||
fn data_len(&self, dir: OutgoingDirection) -> usize { |
|||
match dir { |
|||
OutgoingDirection::ToServer => self.server_outbuf.len(), |
|||
OutgoingDirection::ToClient => self.client_outbuf.len(), |
|||
} |
|||
} |
|||
|
|||
fn reset_connection(&self) -> bool { |
|||
false |
|||
} |
|||
|
|||
fn get_udp_associate(&self) -> Option<SocketAddr> { |
|||
self.udp_associate.then_some(self.info.dst) |
|||
} |
|||
} |
|||
|
|||
pub(crate) struct NoProxyManager { |
|||
server: SocketAddr, |
|||
} |
|||
|
|||
#[async_trait::async_trait] |
|||
impl ProxyHandlerManager for NoProxyManager { |
|||
async fn new_proxy_handler( |
|||
&self, |
|||
info: SessionInfo, |
|||
domain_name: Option<String>, |
|||
udp_associate: bool, |
|||
) -> std::io::Result<Arc<Mutex<dyn ProxyHandler>>> { |
|||
Ok(Arc::new(Mutex::new(NoProxyHandler { |
|||
info, |
|||
domain_name, |
|||
client_outbuf: VecDeque::default(), |
|||
server_outbuf: VecDeque::default(), |
|||
udp_associate, |
|||
}))) |
|||
} |
|||
|
|||
fn get_server_addr(&self) -> SocketAddr { |
|||
self.server |
|||
} |
|||
} |
|||
|
|||
impl NoProxyManager { |
|||
pub(crate) fn new(server: SocketAddr) -> Self { |
|||
Self { server } |
|||
} |
|||
} |
|||
Loading…
Reference in new issue