@@ -484,6 +484,7 @@ impl<T: Read + Write> Client<T> {
484
484
}
485
485
486
486
fn read_response_onto ( & mut self , data : & mut Vec < u8 > ) -> Result < ( ) > {
487
+ let mut continue_from = None ;
487
488
let mut try_first = !data. is_empty ( ) ;
488
489
let match_tag = format ! ( "{}{}" , TAG_PREFIX , self . tag) ;
489
490
loop {
@@ -493,7 +494,7 @@ impl<T: Read + Write> Client<T> {
493
494
} else {
494
495
let start_new = data. len ( ) ;
495
496
try!( self . readline ( data) ) ;
496
- start_new
497
+ continue_from . take ( ) . unwrap_or ( start_new)
497
498
} ;
498
499
499
500
let break_with = {
@@ -519,7 +520,11 @@ impl<T: Read + Write> Client<T> {
519
520
status => Err ( ( status, None ) ) ,
520
521
} )
521
522
}
522
- IResult :: Done ( ..) | IResult :: Incomplete ( ..) => None ,
523
+ IResult :: Done ( ..) => None ,
524
+ IResult :: Incomplete ( ..) => {
525
+ continue_from = Some ( line_start) ;
526
+ None
527
+ }
523
528
_ => Some ( Err ( ( Status :: Bye , None ) ) ) ,
524
529
}
525
530
} ;
@@ -606,6 +611,18 @@ mod tests {
606
611
}
607
612
608
613
614
+ #[ test]
615
+ fn fetch_body ( ) {
616
+ let response = "a0 OK Logged in.\r \n \
617
+ * 2 FETCH (BODY[TEXT] {3}\r \n foo)\r \n \
618
+ a0 OK FETCH completed\r \n ";
619
+ let mock_stream = MockStream :: new ( response. as_bytes ( ) . to_vec ( ) ) ;
620
+ let mut client = Client :: new ( mock_stream) ;
621
+ client. read_response ( ) . unwrap ( ) ;
622
+ client. read_response ( ) . unwrap ( ) ;
623
+ }
624
+
625
+
609
626
#[ test]
610
627
fn read_greeting ( ) {
611
628
let greeting = "* OK Dovecot ready.\r \n " ;
0 commit comments