sentinel_driver/protocol/
codec.rs1use bytes::BytesMut;
2
3use crate::error::{Error, Result};
4use crate::protocol::backend::BackendMessage;
5
6const HEADER_LEN: usize = 5;
8
9pub fn decode_message(buf: &mut BytesMut) -> Result<Option<BackendMessage>> {
14 if buf.len() < HEADER_LEN {
15 return Ok(None);
16 }
17
18 let msg_type = buf[0];
19 let body_len = i32::from_be_bytes([buf[1], buf[2], buf[3], buf[4]]);
20
21 if body_len < 4 {
22 return Err(Error::protocol(format!(
23 "invalid message length: {body_len}"
24 )));
25 }
26
27 let total_len = 1 + body_len as usize; if buf.len() < total_len {
30 buf.reserve(total_len - buf.len());
32 return Ok(None);
33 }
34
35 let frame = buf.split_to(total_len).freeze();
37
38 let body = frame.slice(HEADER_LEN..);
40
41 super::backend::decode(msg_type, body).map(Some)
42}
43
44#[derive(Debug, Clone, Copy, PartialEq, Eq)]
46pub enum SslResponse {
47 Accepted,
48 Rejected,
49}
50
51pub fn decode_ssl_response(buf: &mut BytesMut) -> Option<SslResponse> {
53 if buf.is_empty() {
54 return None;
55 }
56 let byte = buf.split_to(1)[0];
57 match byte {
58 b'S' => Some(SslResponse::Accepted),
59 b'N' => Some(SslResponse::Rejected),
60 _ => None,
61 }
62}