@@ -26,7 +26,9 @@ pub struct ImapStream<R: Read + Write> {
26
26
/// The underlying stream
27
27
pub ( crate ) inner : R ,
28
28
/// Number of bytes the next decode operation needs if known.
29
- decode_needs : Option < usize > ,
29
+ /// If the buffer contains less than this, it is a waste of time to try to parse it.
30
+ /// If unknown, set it to 0, so decoding is always attempted.
31
+ decode_needs : usize ,
30
32
/// The buffer.
31
33
buffer : Buffer ,
32
34
/// Whether there is any more items to return from the stream. This is set to true once
@@ -40,7 +42,7 @@ impl<R: Read + Write + Unpin> ImapStream<R> {
40
42
ImapStream {
41
43
inner,
42
44
buffer : Buffer :: new ( ) ,
43
- decode_needs : None ,
45
+ decode_needs : 0 ,
44
46
closed : false ,
45
47
}
46
48
}
@@ -99,7 +101,7 @@ impl<R: Read + Write + Unpin> ImapStream<R> {
99
101
100
102
impl < R : Read + Write + Unpin > ImapStream < R > {
101
103
fn maybe_decode ( & mut self ) -> io:: Result < Option < ResponseData > > {
102
- if self . buffer . used ( ) > self . decode_needs . unwrap_or ( 0 ) {
104
+ if self . buffer . used ( ) >= self . decode_needs {
103
105
self . decode ( )
104
106
} else {
105
107
Ok ( None )
@@ -116,22 +118,22 @@ impl<R: Read + Write + Unpin> ImapStream<R> {
116
118
match imap_proto:: parser:: parse_response ( buf) {
117
119
Ok ( ( remaining, response) ) => {
118
120
// TODO: figure out if we can use a minimum required size for a response.
119
- self . decode_needs = None ;
121
+ self . decode_needs = 0 ;
120
122
self . buffer . reset_with_data ( remaining) ;
121
123
Ok ( response)
122
124
}
123
125
Err ( nom:: Err :: Incomplete ( Needed :: Size ( min) ) ) => {
124
126
log:: trace!( "decode: incomplete data, need minimum {} bytes" , min) ;
125
- self . decode_needs = Some ( usize:: from ( min) ) ;
127
+ self . decode_needs = self . buffer . used ( ) + usize:: from ( min) ;
126
128
Err ( None )
127
129
}
128
130
Err ( nom:: Err :: Incomplete ( _) ) => {
129
131
log:: trace!( "decode: incomplete data, need unknown number of bytes" ) ;
130
- self . decode_needs = None ;
132
+ self . decode_needs = 0 ;
131
133
Err ( None )
132
134
}
133
135
Err ( other) => {
134
- self . decode_needs = None ;
136
+ self . decode_needs = 0 ;
135
137
Err ( Some ( io:: Error :: new (
136
138
io:: ErrorKind :: Other ,
137
139
format ! ( "{:?} during parsing of {:?}" , other, buf) ,
@@ -197,9 +199,9 @@ impl Buffer {
197
199
}
198
200
199
201
/// Ensure the buffer has free capacity, optionally ensuring minimum buffer size.
200
- fn ensure_capacity ( & mut self , required : Option < usize > ) -> io:: Result < ( ) > {
202
+ fn ensure_capacity ( & mut self , required : usize ) -> io:: Result < ( ) > {
201
203
let free_bytes: usize = self . block . size ( ) - self . offset ;
202
- let min_required_bytes: usize = required. unwrap_or ( 0 ) ;
204
+ let min_required_bytes: usize = required;
203
205
let extra_bytes_needed: usize = min_required_bytes. saturating_sub ( self . block . size ( ) ) ;
204
206
if free_bytes == 0 || extra_bytes_needed > 0 {
205
207
let increase = std:: cmp:: max ( Buffer :: BLOCK_SIZE , extra_bytes_needed) ;
@@ -384,7 +386,7 @@ mod tests {
384
386
assert_eq ! ( buf. block. size( ) , Buffer :: BLOCK_SIZE ) ;
385
387
386
388
// Still has capacity, no size request.
387
- buf. ensure_capacity ( None ) . unwrap ( ) ;
389
+ buf. ensure_capacity ( 0 ) . unwrap ( ) ;
388
390
assert_eq ! ( buf. free_as_mut_slice( ) . len( ) , 1 ) ;
389
391
assert_eq ! ( buf. block. size( ) , Buffer :: BLOCK_SIZE ) ;
390
392
@@ -394,15 +396,14 @@ mod tests {
394
396
assert_eq ! ( buf. block. size( ) , Buffer :: BLOCK_SIZE ) ;
395
397
396
398
// No capacity, no size request.
397
- buf. ensure_capacity ( None ) . unwrap ( ) ;
399
+ buf. ensure_capacity ( 0 ) . unwrap ( ) ;
398
400
assert_eq ! ( buf. free_as_mut_slice( ) . len( ) , Buffer :: BLOCK_SIZE ) ;
399
401
assert_eq ! ( buf. block. size( ) , 2 * Buffer :: BLOCK_SIZE ) ;
400
402
401
403
// Some capacity, size request.
402
404
buf. extend_used ( 5 ) ;
403
405
assert_eq ! ( buf. offset, Buffer :: BLOCK_SIZE + 5 ) ;
404
- buf. ensure_capacity ( Some ( 3 * Buffer :: BLOCK_SIZE - 6 ) )
405
- . unwrap ( ) ;
406
+ buf. ensure_capacity ( 3 * Buffer :: BLOCK_SIZE - 6 ) . unwrap ( ) ;
406
407
assert_eq ! ( buf. free_as_mut_slice( ) . len( ) , 2 * Buffer :: BLOCK_SIZE - 5 ) ;
407
408
assert_eq ! ( buf. block. size( ) , 3 * Buffer :: BLOCK_SIZE ) ;
408
409
}
0 commit comments