@@ -331,19 +331,15 @@ impl HttpBody for Body {
331
331
332
332
fn size_hint ( & self ) -> SizeHint {
333
333
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 ) ,
340
336
#[ cfg( feature = "stream" ) ]
341
337
Kind :: Wrapped ( ..) => SizeHint :: default ( ) ,
342
338
Kind :: Chan { content_length, .. } | Kind :: H2 { content_length, .. } => {
343
339
let mut hint = SizeHint :: default ( ) ;
344
340
345
341
if let Some ( content_length) = content_length. into_opt ( ) {
346
- hint. set_exact ( content_length as u64 ) ;
342
+ hint. set_exact ( content_length) ;
347
343
}
348
344
349
345
hint
@@ -547,7 +543,7 @@ mod tests {
547
543
use std:: mem;
548
544
use std:: task:: Poll ;
549
545
550
- use super :: { Body , DecodedLength , HttpBody , Sender } ;
546
+ use super :: { Body , DecodedLength , HttpBody , Sender , SizeHint } ;
551
547
552
548
#[ test]
553
549
fn test_size_of ( ) {
@@ -578,6 +574,27 @@ mod tests {
578
574
) ;
579
575
}
580
576
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
+
581
598
#[ tokio:: test]
582
599
async fn channel_abort ( ) {
583
600
let ( tx, mut rx) = Body :: channel ( ) ;
0 commit comments