From 8c442de4fadfa0bdb2669c21b368a3440d799e9d Mon Sep 17 00:00:00 2001 From: MeexReay Date: Mon, 14 Apr 2025 18:15:29 +0300 Subject: [PATCH] fix chat reading --- Cargo.toml | 5 ++--- src/chat.rs | 4 +++- src/proto.rs | 26 ++++++++++++++++---------- 3 files changed, 21 insertions(+), 14 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 70ca0dc..c9eb8d3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,16 +8,15 @@ rand = "0.9.0" regex = "1.11.1" colored = "3.0.0" lazy_static = "1.5.0" -crossterm = { version = "0.29.0", optional = true } +clap = { version = "4.5.36", features = ["derive"] } serde = { version = "1.0.219", features = ["serde_derive"] } serde_yml = "0.0.12" +crossterm = { version = "0.29.0", optional = true } homedir = { version = "0.3.4", optional = true } -clap = { version = "4.5.36", features = ["derive"] } native-tls = { version = "0.2.14", optional = true } [features] default = ["ssl", "pretty", "homedir"] - ssl = ["dep:native-tls"] pretty = ["dep:crossterm"] homedir = ["dep:homedir"] \ No newline at end of file diff --git a/src/chat.rs b/src/chat.rs index 2b323bd..dc3e3ef 100644 --- a/src/chat.rs +++ b/src/chat.rs @@ -50,7 +50,9 @@ impl ChatStorage { pub fn update(&self, max_length: usize, messages: Vec, packet_size: usize) { self.packet_size.store(packet_size, Ordering::SeqCst); let mut messages = messages; - messages.drain(max_length..); + if messages.len() > max_length { + messages.drain(max_length..); + } *self.messages.write().unwrap() = messages; } diff --git a/src/proto.rs b/src/proto.rs index ccf5bcc..2abe9a8 100644 --- a/src/proto.rs +++ b/src/proto.rs @@ -120,6 +120,13 @@ pub fn skip_null(stream: &mut impl Read) -> Result, Box> { } } +pub fn remove_trailing_null(vec: &mut Vec) -> Result<(), Box> { + while vec.ends_with(&[0]) { + vec.remove(vec.len()-1); + } + Ok(()) +} + /// Read messages /// /// max_messages - max messages in list @@ -141,15 +148,13 @@ pub fn read_messages( let data = if start_null { let mut data = skip_null(stream)?; - loop { - let mut buf = vec![0; 1]; - stream.read_exact(&mut buf)?; - let ch = buf[0]; - if ch == 0 { - break - } - data.push(ch); - } + let mut buf = vec![0; 10]; + let len = stream.read(&mut buf)?; + buf.truncate(len); + + remove_trailing_null(&mut buf); + data.append(&mut buf); + data } else { let mut data = vec![0; 10]; @@ -180,7 +185,8 @@ pub fn read_messages( let mut data = skip_null(stream)?; while data.len() < to_read { let mut buf = vec![0; to_read - data.len()]; - stream.read_exact(&mut buf)?; + let len = stream.read(&mut buf)?; + buf.truncate(len); data.append(&mut buf); } data