async-http1-lite 0.3.2

Asynchronous http1 stream.
Documentation
use std::io::ErrorKind as IoErrorKind;

use async_sleep::impl_async_io::Timer;
use futures_lite::future::block_on;
use futures_util::io::Cursor;
use http::{Method, Version};
use http1_spec::body_framing::BodyFraming;

use async_http1_lite::{decoder::Http1RequestDecoder, stream::Http1StreamDecoder};

#[test]
fn request_simple() -> Result<(), Box<dyn std::error::Error>> {
    block_on(async {
        let mut stream = Cursor::new(
            "GET / HTTP/1.1\r\nHost: foo.com\r\n\r\nPOST /x HTTP/1.0\r\nHost: bar.com\r\n\r\n",
        );

        let mut decoder = Http1RequestDecoder::new(1024, None);

        let (request, body_framing) =
            Http1StreamDecoder::<_, Timer, _>::read_head(&mut decoder, &mut stream).await?;
        assert_eq!(request.method(), Method::GET);
        assert_eq!(request.uri(), "/");
        assert_eq!(request.version(), Version::HTTP_11);
        assert_eq!(request.headers().len(), 1);
        assert_eq!(
            request.headers().get("host").unwrap().to_str().unwrap(),
            "foo.com"
        );
        assert_eq!(body_framing, BodyFraming::Neither);

        let (request, body_framing) =
            Http1StreamDecoder::<_, Timer, _>::read_head(&mut decoder, &mut stream).await?;
        assert_eq!(request.method(), Method::POST);
        assert_eq!(request.uri(), "/x");
        assert_eq!(request.version(), Version::HTTP_10);
        assert_eq!(request.headers().len(), 1);
        assert_eq!(
            request.headers().get("host").unwrap().to_str().unwrap(),
            "bar.com"
        );
        assert_eq!(body_framing, BodyFraming::Neither);

        let err = Http1StreamDecoder::<_, Timer, _>::read_head(&mut decoder, &mut stream)
            .await
            .err()
            .unwrap();
        assert_eq!(err.kind(), IoErrorKind::UnexpectedEof);
        assert_eq!(err.to_string(), "read 0");

        Ok(())
    })
}