hyper 0.11.27

A modern HTTP library.
Documentation
extern crate pretty_env_logger;

use futures::Async;
use futures::future::poll_fn;
use tokio::reactor::Core;

use mock::MockConnector;
use super::*;

#[test]
fn retryable_request() {
    let _ = pretty_env_logger::try_init();
    let mut core = Core::new().unwrap();

    let mut connector = MockConnector::new();

    let sock1 = connector.mock("http://mock.local/a");
    let sock2 = connector.mock("http://mock.local/b");

    let client = Client::configure()
        .connector(connector)
        .build(&core.handle());


    {
        let res1 = client.get("http://mock.local/a".parse().unwrap());
        let srv1 = poll_fn(|| {
            try_ready!(sock1.read(&mut [0u8; 512]));
            try_ready!(sock1.write(b"HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n"));
            Ok(Async::Ready(()))
        });
        core.run(res1.join(srv1)).expect("res1");
    }
    drop(sock1);

    let res2 = client.get("http://mock.local/b".parse().unwrap())
        .map(|res| {
            assert_eq!(res.status().as_u16(), 222);
        });
    let srv2 = poll_fn(|| {
        try_ready!(sock2.read(&mut [0u8; 512]));
        try_ready!(sock2.write(b"HTTP/1.1 222 OK\r\nContent-Length: 0\r\n\r\n"));
        Ok(Async::Ready(()))
    });

    core.run(res2.join(srv2)).expect("res2");
}

#[test]
fn conn_reset_after_write() {
    let _ = pretty_env_logger::try_init();
    let mut core = Core::new().unwrap();

    let mut connector = MockConnector::new();

    let sock1 = connector.mock("http://mock.local/a");

    let client = Client::configure()
        .connector(connector)
        .build(&core.handle());


    {
        let res1 = client.get("http://mock.local/a".parse().unwrap());
        let srv1 = poll_fn(|| {
            try_ready!(sock1.read(&mut [0u8; 512]));
            try_ready!(sock1.write(b"HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n"));
            Ok(Async::Ready(()))
        });
        core.run(res1.join(srv1)).expect("res1");
    }

    let res2 = client.get("http://mock.local/a".parse().unwrap());
    let mut sock1 = Some(sock1);
    let srv2 = poll_fn(|| {
        // We purposefully keep the socket open until the client
        // has written the second request, and THEN disconnect.
        //
        // Not because we expect servers to be jerks, but to trigger
        // state where we write on an assumedly good connetion, and
        // only reset the close AFTER we wrote bytes.
        try_ready!(sock1.as_mut().unwrap().read(&mut [0u8; 512]));
        sock1.take();
        Ok(Async::Ready(()))
    });
    let err = core.run(res2.join(srv2)).expect_err("res2");
    match err {
        ::Error::Incomplete => (),
        other => panic!("expected Incomplete, found {:?}", other)
    }
}