hyper_body_to_bytes/
lib.rs1use bytes::{Bytes, BytesMut};
2use futures_util::StreamExt as _;
3use hyper::{Body as HyperBody, Error as HyperError};
4
5pub async fn hyper_body_to_bytes(mut hyper_body: HyperBody) -> Result<Bytes, HyperError> {
6 let mut bytes_mut = BytesMut::new();
7 while let Some(bytes) = hyper_body.next().await {
8 let bytes = bytes?;
9 bytes_mut.extend_from_slice(&bytes[..]);
10 }
11 Ok(bytes_mut.freeze())
12}
13
14pub async fn hyper_body_to_bytes_with_max_length(
15 mut hyper_body: HyperBody,
16 max_length: usize,
17) -> Result<Bytes, HyperError> {
18 let mut bytes_mut = BytesMut::new();
19 while let Some(bytes) = hyper_body.next().await {
21 let bytes = bytes?;
22 bytes_mut.extend_from_slice(&bytes[..]);
23 if bytes_mut.len() >= max_length {
24 return Ok(bytes_mut.freeze());
25 }
26 }
27 Ok(bytes_mut.freeze())
28}
29
30#[cfg(test)]
31mod tests {
32 use super::*;
33
34 use futures_util::stream;
35
36 #[tokio::test]
37 async fn test_hyper_body_to_bytes() {
38 let hyper_body = HyperBody::from("foo");
39 assert_eq!(
40 hyper_body_to_bytes(hyper_body).await.unwrap(),
41 Bytes::copy_from_slice(b"foo")
42 );
43 }
44
45 #[tokio::test]
46 async fn test_hyper_body_to_bytes_with_max_length() {
47 let hyper_body = HyperBody::from("foobar");
48 assert_eq!(
49 hyper_body_to_bytes_with_max_length(hyper_body, 3)
50 .await
51 .unwrap(),
52 Bytes::copy_from_slice(b"foobar")
53 );
54
55 let chunks: Vec<Result<_, std::io::Error>> = vec![Ok("hello"), Ok(" "), Ok("world")];
56 let hyper_body = HyperBody::wrap_stream(stream::iter(chunks));
57 assert_eq!(
58 hyper_body_to_bytes_with_max_length(hyper_body, 3)
59 .await
60 .unwrap(),
61 Bytes::copy_from_slice(b"hello")
62 );
63
64 let chunks: Vec<Result<_, std::io::Error>> = vec![Ok("fo"), Ok("o"), Ok("bar")];
65 let hyper_body = HyperBody::wrap_stream(stream::iter(chunks));
66 assert_eq!(
67 hyper_body_to_bytes_with_max_length(hyper_body, 3)
68 .await
69 .unwrap(),
70 Bytes::copy_from_slice(b"foo")
71 );
72 }
73}