hyper-client-sockets 0.6.0

A Hyper client library allowing access to Unix, VSock and Firecracker sockets
Documentation
use std::{future::Future, sync::Arc};

use async_executor::Executor;
use bytes::Bytes;
use common::{check_response, serve_firecracker, serve_unix, serve_vsock};
use http::{Request, Uri};
use http_body_util::Full;
use hyper::client::conn::http1::handshake;
use hyper_client_sockets::{
    async_io::AsyncIoBackend,
    connector::{FirecrackerConnector, UnixConnector, VsockConnector},
    uri::{FirecrackerUri, UnixUri, VsockUri},
    Backend,
};
use hyper_util::client::legacy::Client;
use smol_hyper::rt::SmolExecutor;

mod common;

#[test]
fn async_io_unix_raw_connectivity() {
    run(|executor| async move {
        let socket_path = serve_unix();
        let io = AsyncIoBackend::connect_to_unix_socket(&socket_path).await.unwrap();
        let (mut send_request, conn) = handshake::<_, Full<Bytes>>(io).await.unwrap();
        executor.spawn(conn).detach();
        let response = send_request
            .send_request(Request::new(Full::new(Bytes::new())))
            .await
            .unwrap();
        check_response(response).await;
    });
}

#[test]
fn async_io_unix_pooled_connectivity() {
    run(|executor| async move {
        let socket_path = serve_unix();
        let client = Client::builder(SmolExecutor::new(executor))
            .build::<_, Full<Bytes>>(UnixConnector::<AsyncIoBackend>::new());
        let response = client.get(Uri::unix(&socket_path, "/").unwrap()).await.unwrap();
        check_response(response).await;
    });
}

#[test]
fn async_io_vsock_raw_connectivity() {
    run(|executor| async move {
        let addr = serve_vsock();
        let io = AsyncIoBackend::connect_to_vsock_socket(addr).await.unwrap();
        let (mut send_request, conn) = handshake::<_, Full<Bytes>>(io).await.unwrap();
        executor.spawn(conn).detach();
        let response = send_request
            .send_request(Request::new(Full::new(Bytes::new())))
            .await
            .unwrap();
        check_response(response).await;
    });
}

#[test]
fn async_io_vsock_pooled_connectivity() {
    run(|executor| async move {
        let addr = serve_vsock();
        let client = Client::builder(SmolExecutor::new(executor))
            .build::<_, Full<Bytes>>(VsockConnector::<AsyncIoBackend>::new());
        let response = client.get(Uri::vsock(addr, "/").unwrap()).await.unwrap();
        check_response(response).await;
    });
}

#[test]
fn async_io_firecracker_raw_connectivity() {
    run(|executor| async move {
        let socket_path = serve_firecracker();
        let io = AsyncIoBackend::connect_to_firecracker_socket(&socket_path, 1234)
            .await
            .unwrap();
        let (mut send_request, conn) = handshake::<_, Full<Bytes>>(io).await.unwrap();
        executor.spawn(conn).detach();
        let response = send_request
            .send_request(Request::new(Full::new(Bytes::new())))
            .await
            .unwrap();
        check_response(response).await;
    });
}

#[test]
fn async_io_firecracker_pooled_connectivity() {
    run(|executor| async move {
        let socket_path = serve_firecracker();
        let client = Client::builder(SmolExecutor::new(executor))
            .build::<_, Full<Bytes>>(FirecrackerConnector::<AsyncIoBackend>::new());
        let response = client
            .get(Uri::firecracker(&socket_path, 1234, "/").unwrap())
            .await
            .unwrap();
        check_response(response).await;
    });
}

fn run<F: FnOnce(Arc<Executor<'static>>) -> Fut, Fut: Future>(function: F) {
    let executor = Arc::new(Executor::new());
    async_io::block_on(executor.clone().run(function(executor)));
}