in src/codec/echo.rs [51:83]
fn decode(&self, buffer: &mut Session) -> Result<(), ParseError> {
// no-copy borrow as a slice
let buf: &[u8] = (*buffer).buffer();
// check if we got a CRLF
let mut double_byte_windows = buf.windows(2);
if let Some(response_end) = double_byte_windows.position(|w| w == b"\r\n") {
if response_end < 5 {
Err(ParseError::Unknown)
} else {
let message = &buf[0..(response_end - 4)];
let crc_received = &buf[(response_end - 4)..response_end];
let mut digest = CRC.digest();
digest.update(message);
let crc_calculated = digest.finalize();
let crc_calculated: [u8; 4] =
unsafe { std::mem::transmute(crc_calculated.to_be()) };
if crc_calculated != crc_received[..] {
debug!(
"Response has bad CRC: {:?} != {:?}",
crc_received, crc_calculated
);
metrics::RESPONSE_EX.increment();
Err(ParseError::Error)
} else {
let _ = buffer.consume(response_end + 2);
Ok(())
}
}
} else {
Err(ParseError::Incomplete)
}
}