@@ -190,10 +190,10 @@ impl ChunkReaderState {
190190 String :: from_utf8_lossy ( & buf. as_ref ( ) [ 0 ..buf. position ( ) ] ) . to_string ( ) ,
191191 ) ) ?;
192192 // 2. Convert hex size to integer.
193- let size = usize :: from_str_radix ( & String :: from_utf8_lossy ( hex_size) , 16 ) ?;
193+ let size = u64 :: from_str_radix ( & String :: from_utf8_lossy ( hex_size) , 16 ) ?;
194194 // 3. Add CRLF
195195 buf. set_position ( buf. position ( ) + 2 ) ;
196- Ok ( size)
196+ Ok ( size as usize )
197197 }
198198}
199199
@@ -310,6 +310,110 @@ pub(crate) mod tests {
310310 assert_eq ! ( ChunkReaderState :: End , state) ;
311311 }
312312
313+ #[ test]
314+ fn test_chunked_reader_read_partial ( ) {
315+ let data = "4\r \n \
316+ Wiki\r \n \
317+ 6\r \n \
318+ pedia \r \n \
319+ E\r \n \
320+ in";
321+ let remain = " \r \n \
322+ \r \n \
323+ chunks.\r \n \
324+ 0; hola\r \n \
325+ \r \n ";
326+ let mut buf = BytesMut :: from ( data) ;
327+ let mut cbuf = Cursor :: new ( & mut buf) ;
328+ let mut state = ChunkReaderState :: ReadSize ;
329+ loop {
330+ match state. next ( & mut cbuf) {
331+ Some ( _) => match state {
332+ ChunkReaderState :: LastChunk => break ,
333+ _ => continue ,
334+ } ,
335+ None => {
336+ assert_eq ! ( state, ChunkReaderState :: ReadChunk ( 14 ) ) ;
337+ cbuf. as_mut ( ) . put_slice ( remain. as_bytes ( ) ) ;
338+ continue ;
339+ }
340+ }
341+ }
342+
343+ assert_eq ! ( state, ChunkReaderState :: LastChunk ) ;
344+ state = ChunkReaderState :: EndCRLF ;
345+ state. next ( & mut cbuf) ;
346+ assert_eq ! ( state, ChunkReaderState :: End ) ;
347+ assert_eq ! ( cbuf. position( ) , cbuf. len( ) ) ;
348+ }
349+
350+ #[ test]
351+ fn test_mark_size_chunk_true ( ) {
352+ let data = "7\r \n " ;
353+ let mut buf = BytesMut :: from ( data) ;
354+ let mut cbuf = Cursor :: new ( & mut buf) ;
355+ let result = ChunkReaderState :: mark_size_chunk ( & mut cbuf) ;
356+ assert ! ( result) ;
357+ assert_eq ! ( cbuf. position( ) , 1 ) ;
358+ let size = ChunkReaderState :: try_get_size ( & mut cbuf) . unwrap ( ) ;
359+ assert_eq ! ( size, 7 ) ;
360+ }
361+
362+ #[ test]
363+ fn test_mark_size_chunk_true_with_extension ( ) {
364+ let data = "7; hola amigo\r \n " ;
365+ let mut buf = BytesMut :: from ( data) ;
366+ let mut cbuf = Cursor :: new ( & mut buf) ;
367+ let result = ChunkReaderState :: mark_size_chunk ( & mut cbuf) ;
368+ assert ! ( result) ;
369+ assert_eq ! ( cbuf. position( ) , data. len( ) - 2 ) ;
370+ let size = ChunkReaderState :: try_get_size ( & mut cbuf) . unwrap ( ) ;
371+ assert_eq ! ( size, 7 ) ;
372+ }
373+
374+ #[ test]
375+ fn test_mark_size_chunk_false ( ) {
376+ let data = "7\r " ;
377+ let mut buf = BytesMut :: from ( data) ;
378+ let mut cbuf = Cursor :: new ( & mut buf) ;
379+ let result = ChunkReaderState :: mark_size_chunk ( & mut cbuf) ;
380+ assert ! ( !result) ;
381+ }
382+
383+ #[ test]
384+ fn test_chunked_reader_extra_data ( ) {
385+ let data = "\r \n \
386+ extra data";
387+ let mut buf = BytesMut :: from ( data) ;
388+ let mut cbuf = Cursor :: new ( & mut buf) ;
389+ let mut state = ChunkReaderState :: EndCRLF ;
390+ let chunk = state. next ( & mut cbuf) . unwrap ( ) ;
391+ assert ! ( matches!( chunk, ChunkType :: EndCRLF ( _) ) ) ;
392+ assert_eq ! ( state, ChunkReaderState :: End ) ;
393+ assert_eq ! ( cbuf. remaining( ) , & b"extra data" [ ..] ) ;
394+ }
395+
396+ #[ test]
397+ fn test_chunked_reader_end_crlf_partial ( ) {
398+ let data = "\r " ;
399+ let mut buf = BytesMut :: from ( data) ;
400+ let mut cbuf = Cursor :: new ( & mut buf) ;
401+ let mut state = ChunkReaderState :: EndCRLF ;
402+ let chunk = state. next ( & mut cbuf) ;
403+ assert ! ( chunk. is_none( ) ) ;
404+ assert_eq ! ( state, ChunkReaderState :: EndCRLF ) ;
405+ }
406+
407+ #[ test]
408+ fn test_chunked_reader_ended ( ) {
409+ let data = "\r \n " ;
410+ let mut buf = BytesMut :: from ( data) ;
411+ let mut cbuf = Cursor :: new ( & mut buf) ;
412+ let mut state = ChunkReaderState :: End ;
413+ let chunk = state. next ( & mut cbuf) ;
414+ assert ! ( chunk. is_none( ) ) ;
415+ }
416+
313417 #[ test]
314418 fn test_chunked_reader_read_full ( ) {
315419 let data = "7; hola amigo\r \n \
@@ -444,46 +548,9 @@ pub(crate) mod tests {
444548 }
445549 }
446550
447- #[ test]
448- fn test_chunked_reader_read_partial ( ) {
449- let data = "4\r \n \
450- Wiki\r \n \
451- 6\r \n \
452- pedia \r \n \
453- E\r \n \
454- in";
455- let remain = " \r \n \
456- \r \n \
457- chunks.\r \n \
458- 0; hola\r \n \
459- \r \n ";
460- let mut buf = BytesMut :: from ( data) ;
461- let mut cbuf = Cursor :: new ( & mut buf) ;
462- let mut state = ChunkReaderState :: ReadSize ;
463- loop {
464- match state. next ( & mut cbuf) {
465- Some ( _) => match state {
466- ChunkReaderState :: LastChunk => break ,
467- _ => continue ,
468- } ,
469- None => {
470- assert_eq ! ( state, ChunkReaderState :: ReadChunk ( 14 ) ) ;
471- cbuf. as_mut ( ) . put_slice ( remain. as_bytes ( ) ) ;
472- continue ;
473- }
474- }
475- }
476-
477- assert_eq ! ( state, ChunkReaderState :: LastChunk ) ;
478- state = ChunkReaderState :: EndCRLF ;
479- state. next ( & mut cbuf) ;
480- assert_eq ! ( state, ChunkReaderState :: End ) ;
481- assert_eq ! ( cbuf. position( ) , cbuf. len( ) ) ;
482- }
483-
484551 #[ test]
485552 fn test_chunked_reader_read_loop ( ) {
486- let data = "7; hola amigo\r \n \
553+ let input = "7; hola amigo\r \n \
487554 Mozilla\r \n \
488555 9\r \n \
489556 Developer\r \n \
@@ -493,7 +560,7 @@ pub(crate) mod tests {
493560 a: b\r \n \
494561 c: d\r \n \
495562 \r \n ";
496- let mut buf = BytesMut :: from ( data ) ;
563+ let mut buf = BytesMut :: from ( input ) ;
497564 let mut cbuf = Cursor :: new ( & mut buf) ;
498565 let mut state = ChunkReaderState :: ReadSize ;
499566 loop {
@@ -511,71 +578,4 @@ pub(crate) mod tests {
511578
512579 assert_eq ! ( cbuf. remaining( ) . len( ) , 0 ) ;
513580 }
514-
515- #[ test]
516- fn test_mark_size_chunk_true ( ) {
517- let data = "7\r \n " ;
518- let mut buf = BytesMut :: from ( data) ;
519- let mut cbuf = Cursor :: new ( & mut buf) ;
520- let result = ChunkReaderState :: mark_size_chunk ( & mut cbuf) ;
521- assert ! ( result) ;
522- assert_eq ! ( cbuf. position( ) , 1 ) ;
523- let size = ChunkReaderState :: try_get_size ( & mut cbuf) . unwrap ( ) ;
524- assert_eq ! ( size, 7 ) ;
525- }
526-
527- #[ test]
528- fn test_mark_size_chunk_true_with_extension ( ) {
529- let data = "7; hola amigo\r \n " ;
530- let mut buf = BytesMut :: from ( data) ;
531- let mut cbuf = Cursor :: new ( & mut buf) ;
532- let result = ChunkReaderState :: mark_size_chunk ( & mut cbuf) ;
533- assert ! ( result) ;
534- assert_eq ! ( cbuf. position( ) , data. len( ) - 2 ) ;
535- let size = ChunkReaderState :: try_get_size ( & mut cbuf) . unwrap ( ) ;
536- assert_eq ! ( size, 7 ) ;
537- }
538-
539- #[ test]
540- fn test_mark_size_chunk_false ( ) {
541- let data = "7\r " ;
542- let mut buf = BytesMut :: from ( data) ;
543- let mut cbuf = Cursor :: new ( & mut buf) ;
544- let result = ChunkReaderState :: mark_size_chunk ( & mut cbuf) ;
545- assert ! ( !result) ;
546- }
547-
548- #[ test]
549- fn test_chunked_reader_extra_data ( ) {
550- let data = "\r \n \
551- extra data";
552- let mut buf = BytesMut :: from ( data) ;
553- let mut cbuf = Cursor :: new ( & mut buf) ;
554- let mut state = ChunkReaderState :: EndCRLF ;
555- let chunk = state. next ( & mut cbuf) . unwrap ( ) ;
556- assert ! ( matches!( chunk, ChunkType :: EndCRLF ( _) ) ) ;
557- assert_eq ! ( state, ChunkReaderState :: End ) ;
558- assert_eq ! ( cbuf. remaining( ) , & b"extra data" [ ..] ) ;
559- }
560-
561- #[ test]
562- fn test_chunked_reader_end_crlf_partial ( ) {
563- let data = "\r " ;
564- let mut buf = BytesMut :: from ( data) ;
565- let mut cbuf = Cursor :: new ( & mut buf) ;
566- let mut state = ChunkReaderState :: EndCRLF ;
567- let chunk = state. next ( & mut cbuf) ;
568- assert ! ( chunk. is_none( ) ) ;
569- assert_eq ! ( state, ChunkReaderState :: EndCRLF ) ;
570- }
571-
572- #[ test]
573- fn test_chunked_reader_ended ( ) {
574- let data = "\r \n " ;
575- let mut buf = BytesMut :: from ( data) ;
576- let mut cbuf = Cursor :: new ( & mut buf) ;
577- let mut state = ChunkReaderState :: End ;
578- let chunk = state. next ( & mut cbuf) ;
579- assert ! ( chunk. is_none( ) ) ;
580- }
581581}
0 commit comments