rasi-ext 0.1.11

This library includes extend features or experimental features that are useful for asynchronous programming.
Documentation
use std::path::Path;

use boring::ssl::{SslAcceptor, SslFiletype, SslMethod};
use http::{Response, StatusCode};
use rasi::{executor::spawn, net::TcpListener};
use rasi_ext::net::http::{client::HttpRequestSend, server::HttpServer, types::Request};

mod init;

#[futures_test::test]
async fn test_http() {
    init::init();

    let listener = TcpListener::bind("127.0.0.1:0").await.unwrap();

    let raddr = listener.local_addr().unwrap();

    spawn(async move {
        HttpServer::on(listener)
            .serve(|req, resp| async move {
                assert_eq!(req.uri().path(), "/hello");

                resp.write(
                    Response::builder()
                        .status(StatusCode::OK)
                        .body("hello world")
                        .unwrap(),
                )
                .await?;

                Ok(())
            })
            .await
            .unwrap();
    });

    let response = Request::get(format!("http://{:?}/hello", raddr))
        .body("")
        .send()
        .response()
        .await
        .unwrap();

    assert_eq!(response.status(), StatusCode::OK);

    let (_, body) = response.into_parts();

    assert_eq!(body.into_bytes(1024, None).await.unwrap(), "hello world");
}

#[futures_test::test]
async fn test_https() {
    init::init();

    let listener = TcpListener::bind("127.0.0.1:0").await.unwrap();

    let raddr = listener.local_addr().unwrap();

    spawn(async move {
        let root_path = Path::new(env!("CARGO_MANIFEST_DIR"));

        let mut acceptor = SslAcceptor::mozilla_intermediate(SslMethod::tls()).unwrap();

        acceptor
            .set_private_key_file(root_path.join("cert/server.key"), SslFiletype::PEM)
            .unwrap();
        acceptor
            .set_certificate_chain_file(root_path.join("cert/server.crt"))
            .unwrap();

        acceptor.check_private_key().unwrap();

        HttpServer::on(listener)
            .with_ssl(acceptor.build())
            .serve(|req, resp| async move {
                assert_eq!(req.uri().path(), "/hello");

                resp.write(
                    Response::builder()
                        .status(StatusCode::OK)
                        .body("hello world")
                        .unwrap(),
                )
                .await?;

                Ok(())
            })
            .await
            .unwrap();
    });

    let root_path = Path::new(env!("CARGO_MANIFEST_DIR"));

    let ca_file = root_path.join("cert/rasi_ca.pem");

    let response = Request::get(format!("https://rasi.quic/hello"))
        .body("")
        .send()
        .redirect(raddr)
        .with_ca_file(ca_file)
        .response()
        .await
        .unwrap();

    assert_eq!(response.status(), StatusCode::OK);

    let (_, body) = response.into_parts();

    assert_eq!(body.into_bytes(1024, None).await.unwrap(), "hello world");
}