anneal 0.3.4

A testing framework for Iron
Documentation
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())
    }
    
    // intermediate buffers! what kind of an operation do you think we're running here????
    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)
    }
}