From c08d9a34680032f2477307d2ca346220df00ea5d Mon Sep 17 00:00:00 2001 From: Fuwn Date: Sun, 28 Mar 2021 15:12:32 +0000 Subject: fix: Implement parser Fixes the problem that sometimes, commands are just skipped despite being sent from the client. --- src/server/parser.rs | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 src/server/parser.rs (limited to 'src/server/parser.rs') diff --git a/src/server/parser.rs b/src/server/parser.rs new file mode 100644 index 0000000..39065e6 --- /dev/null +++ b/src/server/parser.rs @@ -0,0 +1,37 @@ +use bytes::BytesMut; + +/// Read all commands from the given buffer. +/// +/// # Process +/// 1. Get a command from `buffer` based on first byte. +/// 2. Push command to `commands`. +/// 3. Remove command from `buffer`. +/// 4. Iterate and do this for all commands within `buffer`. +pub fn get_commands_from_buffer(mut buffer: BytesMut) -> Vec { + let mut commands: Vec = Vec::new(); + // debug!("initial buffer: {:?}, length: {}", buffer, buffer.len()); + + let data_length = buffer.get(0).unwrap().to_owned() as usize; + if buffer.len() > data_length { + loop { + // debug!("loop: {:?}, length: {}", buffer, buffer.len()); + let command_length = buffer.get(0).unwrap().to_owned() as usize; + commands.push( + BytesMut::from(buffer.get(0..command_length).unwrap()) + ); + + // Remove command from buffer + buffer = buffer.split_off(command_length); + + // Check if any more commands are present + if buffer.len() == 0 { break; } + } + } else { + // There will always be at least one command, push it. + commands.push( + BytesMut::from(buffer.get(0..data_length).unwrap()) + ); + } + + commands // Return command (s) +} -- cgit v1.2.3