@@ -608,6 +608,13 @@ fn decode_array(buf: &mut BytesMut, idx: usize) -> DecodeResult {
608
608
Some ( ( pos, -1 ) ) => Ok ( Some ( ( pos, Response :: Nil ) ) ) ,
609
609
Some ( ( pos, size) ) if size >= 0 => {
610
610
let size = size as usize ;
611
+
612
+ // ensure all array items present in buffer
613
+ let items = buf[ idx..] . windows ( 2 ) . filter ( |w| w == b"\r \n " ) . count ( ) / 2 ;
614
+ if items < size {
615
+ return Ok ( None ) ;
616
+ }
617
+
611
618
let mut pos = pos;
612
619
let mut values = Vec :: with_capacity ( size) ;
613
620
for _ in 0 ..size {
@@ -737,6 +744,31 @@ mod tests {
737
744
assert_eq ! ( deserialized, resp) ;
738
745
}
739
746
747
+ #[ test]
748
+ fn test_decode_array ( ) {
749
+ let codec = Codec ;
750
+
751
+ let resp = Response :: Array ( vec ! [
752
+ Response :: Bytes ( Bytes :: from_static( b"TEST1" ) ) ,
753
+ Response :: Bytes ( Bytes :: from_static( b"TEST2" ) ) ,
754
+ ] ) ;
755
+
756
+ let mut bytes = BytesMut :: copy_from_slice ( b"*2\r \n $5\r \n TEST1\r \n $5\r \n TEST2\r \n " ) ;
757
+ let deserialized = codec. decode ( & mut bytes) . unwrap ( ) . unwrap ( ) ;
758
+ assert_eq ! ( deserialized, resp) ;
759
+
760
+ // uncomplete array data
761
+ let mut bytes = BytesMut :: copy_from_slice ( b"*2\r \n $5\r \n TEST1\r \n " ) ;
762
+ let result = codec. decode ( & mut bytes) . unwrap ( ) ;
763
+ assert ! ( result. is_none( ) ) ;
764
+
765
+ // receiving remain data
766
+ bytes. extend_from_slice ( b"$5\r \n TEST2\r \n " ) ;
767
+
768
+ let deserialized = codec. decode ( & mut bytes) . unwrap ( ) . unwrap ( ) ;
769
+ assert_eq ! ( deserialized, resp) ;
770
+ }
771
+
740
772
#[ test]
741
773
fn test_nil_string ( ) {
742
774
let mut bytes = BytesMut :: new ( ) ;
0 commit comments