mod test_utils; mod client_decode { use std::io::Write; use super::test_utils::CloseableCursor; use async_h1::client; use async_std::io::Cursor; use http_types::headers; use http_types::Response; use http_types::Result; use pretty_assertions::assert_eq; async fn decode_lines(s: Vec<&str>) -> Result { client::decode(Cursor::new(s.join("\r\n"))).await } #[async_std::test] async fn response_no_date() -> Result<()> { let res = decode_lines(vec![ "HTTP/1.1 200 OK", "transfer-encoding: chunked", "content-type: text/plain", "", "", ]) .await?; assert!(res.header(&headers::DATE).is_some()); Ok(()) } #[async_std::test] async fn multiple_header_values_for_same_header_name() -> Result<()> { let res = decode_lines(vec![ "HTTP/1.1 200 OK", "host: example.com", "content-length: 0", "set-cookie: sessionId=e8bb43229de9", "set-cookie: qwerty=219ffwef9w0f", "", "", ]) .await?; assert_eq!(res.header(&headers::SET_COOKIE).unwrap().iter().count(), 2); Ok(()) } #[async_std::test] async fn connection_closure() -> Result<()> { let mut cursor = CloseableCursor::default(); cursor.write_all(b"HTTP/1.1 200 OK\r\nhost: example.com")?; cursor.close(); assert_eq!( client::decode(cursor).await.unwrap_err().to_string(), "empty response" ); let cursor = CloseableCursor::default(); cursor.close(); assert_eq!( client::decode(cursor).await.unwrap_err().to_string(), "connection closed" ); Ok(()) } #[async_std::test] async fn response_newlines() -> Result<()> { let res = decode_lines(vec![ "HTTP/1.1 200 OK", "content-length: 78", "date: {DATE}", "content-type: text/plain; charset=utf-8", "", "http specifies headers are separated with \r\n but many servers don't do that", "", ]) .await?; assert_eq!( res[headers::CONTENT_LENGTH] .as_str() .parse::() .unwrap(), 78 ); Ok(()) } }