fn parse()

in src/protocol/thrift/src/lib.rs [53:76]


    fn parse(&self, buffer: &[u8]) -> Result<ParseOk<Message>, std::io::Error> {
        if buffer.len() < THRIFT_HEADER_LEN {
            return Err(std::io::Error::from(std::io::ErrorKind::WouldBlock));
        }

        let data_len = u32::from_be_bytes([buffer[0], buffer[1], buffer[2], buffer[3]]);

        let framed_len = THRIFT_HEADER_LEN + data_len as usize;

        if framed_len == 0 || framed_len > self.max_size {
            return Err(std::io::Error::from(std::io::ErrorKind::InvalidInput));
        }

        if buffer.len() < framed_len {
            Err(std::io::Error::from(std::io::ErrorKind::WouldBlock))
        } else {
            MESSAGES_PARSED.increment();
            let data = buffer[THRIFT_HEADER_LEN..framed_len]
                .to_vec()
                .into_boxed_slice();
            let message = Message { data };
            Ok(ParseOk::new(message, framed_len))
        }
    }