chiark / gitweb /
mgmtchannel: Switch to Framed from newline-based framing
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Fri, 16 Apr 2021 23:33:22 +0000 (00:33 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 24 Apr 2021 11:58:18 +0000 (12:58 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/mgmtchannel.rs
src/prelude.rs

index c3a7f97db581841c9f5b8daa4f5246704d54d7d0..36d55db546db65c253de9dada04ef9f00223fa84 100644 (file)
@@ -35,8 +35,8 @@ impl From<rmp_serde::encode::Error> for MgmtChannelWriteError {
 }
 
 pub struct MgmtChannel {
-  read: io::Lines<BufReader<Box<dyn Read>>>,
-  write: BufWriter<Box<dyn Write>>,
+  read:  FrameReader<BufReader<Box<dyn Read >>>,
+  write: FrameWriter<BufWriter<Box<dyn Write>>>,
 }
 
 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<dyn Read>;
     let read = BufReader::new(read);
-    let read = read.lines();
+    let read = FrameReader::new(read);
     let write = Box::new(conn) as Box<dyn Write>;
     let write = BufWriter::new(write);
+    let write = FrameWriter::new(write);
     MgmtChannel { read, write }
   }
 
   #[throws(MgmtChannelReadError)]
   pub fn read<T:DeserializeOwned>(&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<T:Serialize>(&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()?;
   }
 
index cdde169dadb91140f4b1adfcc49ede4ed42b85d4..6bc26c54c54c92e5664877a237ee97ac6dccb7ea 100644 (file)
@@ -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::*;