Skip to content

Commit dc88204

Browse files
authored
fix(body): return exactly 0 SizeHint for empty body (#2122)
1 parent 9d12713 commit dc88204

File tree

1 file changed

+25
-8
lines changed

1 file changed

+25
-8
lines changed

src/body/body.rs

+25-8
Original file line numberDiff line numberDiff line change
@@ -331,19 +331,15 @@ impl HttpBody for Body {
331331

332332
fn size_hint(&self) -> SizeHint {
333333
match self.kind {
334-
Kind::Once(Some(ref val)) => {
335-
let mut hint = SizeHint::default();
336-
hint.set_exact(val.len() as u64);
337-
hint
338-
}
339-
Kind::Once(None) => SizeHint::default(),
334+
Kind::Once(Some(ref val)) => SizeHint::with_exact(val.len() as u64),
335+
Kind::Once(None) => SizeHint::with_exact(0),
340336
#[cfg(feature = "stream")]
341337
Kind::Wrapped(..) => SizeHint::default(),
342338
Kind::Chan { content_length, .. } | Kind::H2 { content_length, .. } => {
343339
let mut hint = SizeHint::default();
344340

345341
if let Some(content_length) = content_length.into_opt() {
346-
hint.set_exact(content_length as u64);
342+
hint.set_exact(content_length);
347343
}
348344

349345
hint
@@ -547,7 +543,7 @@ mod tests {
547543
use std::mem;
548544
use std::task::Poll;
549545

550-
use super::{Body, DecodedLength, HttpBody, Sender};
546+
use super::{Body, DecodedLength, HttpBody, Sender, SizeHint};
551547

552548
#[test]
553549
fn test_size_of() {
@@ -578,6 +574,27 @@ mod tests {
578574
);
579575
}
580576

577+
#[test]
578+
fn size_hint() {
579+
fn eq(body: Body, b: SizeHint, note: &str) {
580+
let a = body.size_hint();
581+
assert_eq!(a.lower(), b.lower(), "lower for {:?}", note);
582+
assert_eq!(a.upper(), b.upper(), "upper for {:?}", note);
583+
}
584+
585+
eq(Body::from("Hello"), SizeHint::with_exact(5), "from str");
586+
587+
eq(Body::empty(), SizeHint::with_exact(0), "empty");
588+
589+
eq(Body::channel().1, SizeHint::new(), "channel");
590+
591+
eq(
592+
Body::new_channel(DecodedLength::new(4), /*wanter =*/ false).1,
593+
SizeHint::with_exact(4),
594+
"channel with length",
595+
);
596+
}
597+
581598
#[tokio::test]
582599
async fn channel_abort() {
583600
let (tx, mut rx) = Body::channel();

0 commit comments

Comments
 (0)