[go: up one dir, main page]

chttp 0.2.3

The practical HTTP client that is fun to use.
Documentation
use env_logger;
use rouille;
use std::env;
use std::net::SocketAddr;
use std::thread;
use std::sync::Arc;
use std::sync::Once;

pub fn setup() {
    static ONCE: Once = Once::new();

    ONCE.call_once(|| {
        env::set_var("RUST_LOG", "chttp=trace,curl=trace");
        env_logger::init();
    });
}

pub struct TestServer {
    addr: SocketAddr,
    counter: Option<Arc<()>>,
    handle: Option<thread::JoinHandle<()>>,
}

impl TestServer {
    pub fn spawn(handler: fn(&rouille::Request) -> rouille::Response) -> Self {
        let server = rouille::Server::new("localhost:0", handler).unwrap();
        let addr = server.server_addr();

        let counter_outer = Arc::new(());
        let counter_inner = counter_outer.clone();
        let handle = thread::spawn(move || {
            while Arc::strong_count(&counter_inner) > 1 {
                server.poll();
            }
        });

        Self {
            addr: addr,
            counter: Some(counter_outer),
            handle: Some(handle),
        }
    }

    pub fn endpoint(&self) -> String {
        format!("http://{}", self.addr)
    }
}

impl Drop for TestServer {
    fn drop(&mut self) {
        self.counter.take();
        self.handle.take().unwrap().join().unwrap();
    }
}