@@ -58,6 +58,8 @@ enum ChunkedState {
58
58
Body ,
59
59
BodyCr ,
60
60
BodyLf ,
61
+ EndCr ,
62
+ EndLf ,
61
63
End ,
62
64
}
63
65
@@ -148,6 +150,8 @@ impl ChunkedState {
148
150
Body => try!( ChunkedState :: read_body ( body, size, buf, read) ) ,
149
151
BodyCr => try!( ChunkedState :: read_body_cr ( body) ) ,
150
152
BodyLf => try!( ChunkedState :: read_body_lf ( body) ) ,
153
+ EndCr => try!( ChunkedState :: read_end_cr ( body) ) ,
154
+ EndLf => try!( ChunkedState :: read_end_lf ( body) ) ,
151
155
End => ChunkedState :: End ,
152
156
} )
153
157
}
@@ -201,10 +205,11 @@ impl ChunkedState {
201
205
trace ! ( "Chunk size is {:?}" , size) ;
202
206
match byte ! ( rdr) {
203
207
b'\n' if * size > 0 => Ok ( ChunkedState :: Body ) ,
204
- b'\n' if * size == 0 => Ok ( ChunkedState :: End ) ,
208
+ b'\n' if * size == 0 => Ok ( ChunkedState :: EndCr ) ,
205
209
_ => Err ( io:: Error :: new ( io:: ErrorKind :: InvalidInput , "Invalid chunk size LF" ) ) ,
206
210
}
207
211
}
212
+
208
213
fn read_body < R : Read > ( rdr : & mut R ,
209
214
rem : & mut u64 ,
210
215
buf : & mut [ u8 ] ,
@@ -250,6 +255,19 @@ impl ChunkedState {
250
255
_ => Err ( io:: Error :: new ( io:: ErrorKind :: InvalidInput , "Invalid chunk body LF" ) ) ,
251
256
}
252
257
}
258
+
259
+ fn read_end_cr < R : Read > ( rdr : & mut R ) -> io:: Result < ChunkedState > {
260
+ match byte ! ( rdr) {
261
+ b'\r' => Ok ( ChunkedState :: EndLf ) ,
262
+ _ => Err ( io:: Error :: new ( io:: ErrorKind :: InvalidInput , "Invalid chunk end CR" ) ) ,
263
+ }
264
+ }
265
+ fn read_end_lf < R : Read > ( rdr : & mut R ) -> io:: Result < ChunkedState > {
266
+ match byte ! ( rdr) {
267
+ b'\n' => Ok ( ChunkedState :: End ) ,
268
+ _ => Err ( io:: Error :: new ( io:: ErrorKind :: InvalidInput , "Invalid chunk end LF" ) ) ,
269
+ }
270
+ }
253
271
}
254
272
255
273
#[ cfg( test) ]
@@ -276,7 +294,7 @@ mod tests {
276
294
let desc = format ! ( "read_size failed for {:?}" , s) ;
277
295
state = result. expect ( desc. as_str ( ) ) ;
278
296
trace ! ( "State {:?}" , state) ;
279
- if state == ChunkedState :: Body || state == ChunkedState :: End {
297
+ if state == ChunkedState :: Body || state == ChunkedState :: EndCr {
280
298
break ;
281
299
}
282
300
}
@@ -375,7 +393,7 @@ mod tests {
375
393
376
394
#[ test]
377
395
fn test_read_chunked_after_eof ( ) {
378
- let content = b"10\r \n 1234567890abcdef\r \n 0\r \n " ;
396
+ let content = b"10\r \n 1234567890abcdef\r \n 0\r \n \r \n " ;
379
397
let mut mock_buf = io:: Cursor :: new ( content) ;
380
398
let mut buf = [ 0u8 ; 50 ] ;
381
399
let mut decoder = Decoder :: chunked ( ) ;
0 commit comments