use hyper::{
error::Result as HyperResult,
net::{
NetworkConnector,
NetworkStream,
},
};
use std::{
collections::VecDeque,
io::{
Result,
Read,
Write,
},
net::{
Shutdown,
SocketAddr,
},
sync::{
Arc,
Mutex,
},
time::Duration,
};
#[derive(Clone)]
pub struct TransferConnector {
buffer: Arc<Mutex<VecDeque<u8>>>,
pub client_address: SocketAddr,
pub scheme: Arc<Mutex<Option<String>>>,
pub server_address: Arc<Mutex<Option<SocketAddr>>>,
}
impl TransferConnector {
pub fn new(client_address: SocketAddr) -> TransferConnector {
TransferConnector {
buffer: Arc::new(Mutex::new(VecDeque::new())),
client_address,
scheme: Arc::new(Mutex::new(None)),
server_address: Arc::new(Mutex::new(None)),
}
}
pub fn server_stream(&self) -> ServerStream {
ServerStream {
buffer: self.buffer.clone(),
peer_address: self.client_address.clone(),
}
}
}
impl NetworkConnector for TransferConnector {
type Stream = ClientStream;
fn connect(&self, host: &str, port: u16, scheme: &str) -> HyperResult<Self::Stream> {
let addr : SocketAddr = format!("{}:{}", host, port).parse().expect("connect address parse");
*self.server_address.lock().expect("connect server address lock")
= Some(addr.clone());
*self.scheme.lock().expect("connect scheme lock")
= Some(scheme.to_string());
Ok(ClientStream {
buffer: self.buffer.clone(),
peer_address: addr,
})
}
}
pub struct ClientStream {
buffer: Arc<Mutex<VecDeque<u8>>>,
peer_address: SocketAddr,
}
impl NetworkStream for ClientStream {
fn peer_addr(&mut self) -> Result<SocketAddr> {
Ok(self.peer_address.clone())
}
fn set_read_timeout(&self, _: Option<Duration>) -> Result<()> {
Ok(())
}
fn set_write_timeout(&self, _: Option<Duration>) -> Result<()> {
Ok(())
}
}
impl Write for ClientStream {
fn write(&mut self, buf: &[u8]) -> Result<usize> {
let mut own_buffer = self.buffer.lock().expect("client stream write");
for b in buf {
own_buffer.push_back(*b);
}
Ok(buf.len())
}
fn flush(&mut self) -> Result<()> {
Ok(())
}
}
impl Read for ClientStream {
fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
Err(std::io::Error::new(std::io::ErrorKind::Other, "boop"))
}
}
pub struct ServerStream {
buffer: Arc<Mutex<VecDeque<u8>>>,
peer_address: SocketAddr,
}
impl NetworkStream for ServerStream {
fn peer_addr(&mut self) -> Result<SocketAddr> {
Ok(self.peer_address.clone())
}
fn set_read_timeout(&self, _: Option<Duration>) -> Result<()> {
Ok(())
}
fn set_write_timeout(&self, _: Option<Duration>) -> Result<()> {
Ok(())
}
}
impl Write for ServerStream {
fn write(&mut self, _: &[u8]) -> Result<usize> {
Err(std::io::Error::new(std::io::ErrorKind::Other, "boop"))
}
fn flush(&mut self) -> Result<()> {
Ok(())
}
}
impl Read for ServerStream {
fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
let mut own_buffer = self.buffer.lock().expect("server stream read");
let mut i = 0;
while own_buffer.len() != 0 {
if i >= buf.len() { break; }
buf[i] = own_buffer.pop_front().unwrap();
i += 1;
}
Ok(i)
}
}