async-http1-lite 0.3.2

Asynchronous http1 stream.
Documentation
use async_sleep::impl_async_io::Timer;
use futures_lite::future::block_on;
use futures_util::io::Cursor;
use http::Request;
use http1_spec::body_framing::BodyFraming;

use async_http1_lite::{
    body::EncoderBody, encoder::Http1RequestEncoder, stream::Http1StreamEncoder,
};

#[test]
fn request_simple() -> Result<(), Box<dyn std::error::Error>> {
    block_on(async {
        let mut stream = Cursor::new(vec![]);
        let request = Request::builder()
            .method("GET")
            .uri("/")
            .header("Host", "example.com")
            .body(())
            .unwrap();

        let mut encoder = Http1RequestEncoder::new(1024);
        Http1StreamEncoder::<_, Timer, _>::write_head(
            &mut encoder,
            &mut stream,
            request,
            BodyFraming::Neither,
        )
        .await?;

        assert_eq!(
            stream.into_inner(),
            b"GET / HTTP/1.1\r\nhost:example.com\r\n\r\n".to_vec()
        );

        Ok(())
    })
}

#[test]
fn request_with_body() -> Result<(), Box<dyn std::error::Error>> {
    block_on(async {
        let mut stream = Cursor::new(vec![]);
        let request = Request::builder()
            .method("GET")
            .uri("/")
            .header("Host", "example.com")
            .body(())
            .unwrap();

        let mut encoder = Http1RequestEncoder::new(1024);
        Http1StreamEncoder::<_, Timer, _>::write_head(
            &mut encoder,
            &mut stream,
            request,
            BodyFraming::ContentLength(3),
        )
        .await?;
        Http1StreamEncoder::<_, Timer, _>::write_body(
            &mut encoder,
            &mut stream,
            EncoderBody::Completed(b"foo".to_vec()),
        )
        .await?;

        assert_eq!(
            stream.into_inner(),
            b"GET / HTTP/1.1\r\nhost:example.com\r\ncontent-length:3\r\n\r\nfoo".to_vec()
        );

        Ok(())
    })
}