From 1ac21721d2a5821608fea8865885a918009b1d36 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sat, 17 Apr 2021 00:33:22 +0100 Subject: [PATCH] mgmtchannel: Switch to Framed from newline-based framing Signed-off-by: Ian Jackson --- src/mgmtchannel.rs | 16 +++++++++------- src/prelude.rs | 1 + 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/mgmtchannel.rs b/src/mgmtchannel.rs index c3a7f97d..36d55db5 100644 --- a/src/mgmtchannel.rs +++ b/src/mgmtchannel.rs @@ -35,8 +35,8 @@ impl From for MgmtChannelWriteError { } pub struct MgmtChannel { - read: io::Lines>>, - write: BufWriter>, + read: FrameReader>>, + write: FrameWriter>>, } impl Debug for MgmtChannel{ @@ -61,25 +61,27 @@ impl MgmtChannel { let read = conn.try_clone().context("dup the command stream")?; let read = Box::new(read) as Box; let read = BufReader::new(read); - let read = read.lines(); + let read = FrameReader::new(read); let write = Box::new(conn) as Box; let write = BufWriter::new(write); + let write = FrameWriter::new(write); MgmtChannel { read, write } } #[throws(MgmtChannelReadError)] pub fn read(&mut self) -> T { use MgmtChannelReadError::*; - let l = self.read.next().ok_or(EOF)??; - let r = serde_json::from_str(&l); + let f = self.read.new_frame()?.ok_or(MgmtChannelReadError::EOF)?; + let r = serde_json::from_reader(f); let v = r.map_err(|e| Parse(format!("{}", &e)))?; v } #[throws(io::Error)] pub fn write(&mut self, val: &T) { - serde_json::to_writer(&mut self.write, val)?; - write!(self.write, "\n")?; + let mut f = self.write.new_frame()?; + serde_json::to_writer(&mut f, val)?; + f.finish()?; self.write.flush()?; } diff --git a/src/prelude.rs b/src/prelude.rs index cdde169d..6bc26c54 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -136,6 +136,7 @@ pub use crate::mgmtchannel::*; pub use crate::nwtemplates; pub use crate::occultilks::*; pub use crate::organise; +pub use crate::packetframe::{FrameReader, FrameWriter}; pub use crate::pcaliases::*; pub use crate::pcrender::*; pub use crate::pieces::*; -- 2.30.2