Skip to content

Commit 21f35c4

Browse files
fix(proto): emitting DecoderError::HeadTooLong
1 parent cb9b511 commit 21f35c4

File tree

2 files changed

+20
-8
lines changed

2 files changed

+20
-8
lines changed

watermelon-proto/src/proto/decoder/mod.rs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,14 @@ pub(super) fn decode(
8383
}
8484

8585
let Some(control_line_len) = memchr::memmem::find(read_buf, b"\r\n") else {
86-
*last_bytes_read = read_buf.len();
87-
return Ok(None);
86+
return if read_buf.len() < MAX_HEAD_LEN {
87+
*last_bytes_read = read_buf.len();
88+
Ok(None)
89+
} else {
90+
Err(DecoderError::HeadTooLong {
91+
len: read_buf.len(),
92+
})
93+
};
8894
};
8995

9096
let mut control_line = read_buf.split_to(control_line_len + "\r\n".len());
@@ -118,10 +124,6 @@ pub(super) fn decode(
118124
} else if let Some(info) = control_line.strip_prefix(b"INFO ") {
119125
let info = serde_json::from_slice(info).map_err(DecoderError::InvalidInfo)?;
120126
Ok(Some(ServerOp::Info { info }))
121-
} else if read_buf.len() > MAX_HEAD_LEN {
122-
Err(DecoderError::HeadTooLong {
123-
len: read_buf.len(),
124-
})
125127
} else {
126128
Err(DecoderError::InvalidCommand)
127129
};

watermelon-proto/src/proto/decoder/stream.rs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,13 +47,13 @@ impl Default for StreamDecoder {
4747
#[cfg(test)]
4848
mod tests {
4949
use bytes::{BufMut as _, Bytes};
50-
use claims::assert_ok_eq;
50+
use claims::{assert_matches, assert_ok_eq};
5151

5252
use crate::{
5353
error::ServerError,
5454
headers::HeaderMap,
5555
message::{MessageBase, ServerMessage},
56-
proto::server::ServerOp,
56+
proto::{error::DecoderError, server::ServerOp},
5757
Subject,
5858
};
5959

@@ -121,4 +121,14 @@ mod tests {
121121
);
122122
assert_ok_eq!(decoder.decode(), None);
123123
}
124+
125+
#[test]
126+
fn head_too_long() {
127+
let mut decoder = StreamDecoder::new();
128+
decoder.read_buf().put_bytes(0, 20000);
129+
assert_matches!(
130+
decoder.decode(),
131+
Err(DecoderError::HeadTooLong { len: 20000 })
132+
);
133+
}
124134
}

0 commit comments

Comments
 (0)