diff --git a/src/body/body.rs b/src/body/body.rs index 74bac989b7..c31635e26a 100644 --- a/src/body/body.rs +++ b/src/body/body.rs @@ -331,19 +331,15 @@ impl HttpBody for Body { fn size_hint(&self) -> SizeHint { match self.kind { - Kind::Once(Some(ref val)) => { - let mut hint = SizeHint::default(); - hint.set_exact(val.len() as u64); - hint - } - Kind::Once(None) => SizeHint::default(), + Kind::Once(Some(ref val)) => SizeHint::with_exact(val.len() as u64), + Kind::Once(None) => SizeHint::with_exact(0), #[cfg(feature = "stream")] Kind::Wrapped(..) => SizeHint::default(), Kind::Chan { content_length, .. } | Kind::H2 { content_length, .. } => { let mut hint = SizeHint::default(); if let Some(content_length) = content_length.into_opt() { - hint.set_exact(content_length as u64); + hint.set_exact(content_length); } hint @@ -547,7 +543,7 @@ mod tests { use std::mem; use std::task::Poll; - use super::{Body, DecodedLength, HttpBody, Sender}; + use super::{Body, DecodedLength, HttpBody, Sender, SizeHint}; #[test] fn test_size_of() { @@ -578,6 +574,27 @@ mod tests { ); } + #[test] + fn size_hint() { + fn eq(body: Body, b: SizeHint, note: &str) { + let a = body.size_hint(); + assert_eq!(a.lower(), b.lower(), "lower for {:?}", note); + assert_eq!(a.upper(), b.upper(), "upper for {:?}", note); + } + + eq(Body::from("Hello"), SizeHint::with_exact(5), "from str"); + + eq(Body::empty(), SizeHint::with_exact(0), "empty"); + + eq(Body::channel().1, SizeHint::new(), "channel"); + + eq( + Body::new_channel(DecodedLength::new(4), /*wanter =*/ false).1, + SizeHint::with_exact(4), + "channel with length", + ); + } + #[tokio::test] async fn channel_abort() { let (tx, mut rx) = Body::channel();