hyper_body_to_bytes/
lib.rs

1use 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    // .take not working
20    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}