Skip to content

Commit 41c9d42

Browse files
authored
fix decode array if received uncomplete data (#7)
* fix decode array if received uncomplete data
1 parent 0a8528c commit 41c9d42

File tree

2 files changed

+34
-0
lines changed

2 files changed

+34
-0
lines changed

CHANGES.md

+2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
# Changes
22

3+
* Fix decode uncomple array data
4+
35
## [0.4.0] - 2023-01-04
46

57
* 0.4 Release

src/codec.rs

+32
Original file line numberDiff line numberDiff line change
@@ -608,6 +608,13 @@ fn decode_array(buf: &mut BytesMut, idx: usize) -> DecodeResult {
608608
Some((pos, -1)) => Ok(Some((pos, Response::Nil))),
609609
Some((pos, size)) if size >= 0 => {
610610
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+
611618
let mut pos = pos;
612619
let mut values = Vec::with_capacity(size);
613620
for _ in 0..size {
@@ -737,6 +744,31 @@ mod tests {
737744
assert_eq!(deserialized, resp);
738745
}
739746

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\nTEST1\r\n$5\r\nTEST2\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\nTEST1\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\nTEST2\r\n");
767+
768+
let deserialized = codec.decode(&mut bytes).unwrap().unwrap();
769+
assert_eq!(deserialized, resp);
770+
}
771+
740772
#[test]
741773
fn test_nil_string() {
742774
let mut bytes = BytesMut::new();

0 commit comments

Comments
 (0)