chiark / gitweb /
buffer trouble - something works ish ?
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 4 Jul 2020 23:04:16 +0000 (00:04 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 4 Jul 2020 23:04:23 +0000 (00:04 +0100)
Cargo.lock.example
Cargo.toml
src/bin/server.rs
src/sse.rs

index 02f92c83363b65b10c21dd72eb94e8b4646648ba..e29210cd07af7723afbfc61162c14421eb2840a8 100644 (file)
@@ -463,8 +463,6 @@ checksum = "b6cab2627acfc432780848602f3f558f7e9dd427352224b0d9324025796d2a5e"
 [[package]]
 name = "hyper"
 version = "0.10.16"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0a0652d9a2609a968c14be1a9ea00bf4b1d64e2e1f53a1b51b6fff3a6e829273"
 dependencies = [
  "base64 0.9.3",
  "httparse",
@@ -938,8 +936,6 @@ checksum = "26412eb97c6b088a6997e05f69403a802a92d520de2f8e63c2b65f9e0f47c4e8"
 [[package]]
 name = "rocket"
 version = "0.4.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6130967b369cfb8411b0b73e96fcba1229c32a9cc6f295d144f879bfced13c6e"
 dependencies = [
  "atty",
  "base64 0.12.3",
@@ -959,8 +955,6 @@ dependencies = [
 [[package]]
 name = "rocket_codegen"
 version = "0.4.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cb852e6da168fb948a8f2b798ba2e2f0e4fc860eae0efa9cf2bf0f5466bb0425"
 dependencies = [
  "devise",
  "glob 0.3.0",
@@ -974,8 +968,6 @@ dependencies = [
 [[package]]
 name = "rocket_contrib"
 version = "0.4.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e3946ca815127041d8f64455561031d058c22ae1b135251502c5ea523cf9e14b"
 dependencies = [
  "glob 0.3.0",
  "log 0.4.8",
@@ -990,8 +982,6 @@ dependencies = [
 [[package]]
 name = "rocket_http"
 version = "0.4.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1aff5a5480175f2f553a876b251e9350c74196128806d176da3a51c82aab5428"
 dependencies = [
  "cookie",
  "hyper",
index 4df0ccce700f76fe5a7598a1cd9b1960fe321663..fcb2f5a8537990d34489dcd3caa1c0162b999ddc 100644 (file)
@@ -33,11 +33,17 @@ index_vec = "0.1.1"
 
 num-traits = "0.2"
 
-rocket = "0.4"
-rocket_contrib = { version = "0.4", default-features=false, features=["tera_templates","helmet","json"] }
+#rocket = "0.4"
+#rocket_contrib = { version = "0.4", default-features=false, features=["tera_templates","helmet","json"] }
+
+rocket = { path = "/home/ian/Rustup/Game/rocket/core/lib" }
+rocket_contrib = { path = "/home/ian/Rustup/Game/rocket/contrib/lib", default-features=false, features=["tera_templates","helmet","json"] }
 
 vecdeque-stableix = "0"
 
+[patch.crates-io]
+hyper = { path = "/home/ian/Rustup/Game/hyper" } 
+
 #hmac = "0.7"
 #base64 = "0.10"
 #sha2 = "0.8"
index eb29a9a2f66a00c705bd024925b123321e34b4b0..7a708d096e6e531a7273e51ecec134cd83d0039b 100644 (file)
@@ -207,7 +207,7 @@ fn updates(ctoken : InstanceAccess<ClientId>, gen: u64)
   let gen = Generation(gen);
   let iad = ctoken.i;
   let content = sse::content(iad, gen)?;
-  let content = response::Stream::chunked(content, 1);
+  let content = response::Stream::chunked(content, 4096 /* xxx */);
   const CTYPE : &str = "text/event-stream; charset=utf-8";
   let ctype = ContentType::parse_flexible(CTYPE).unwrap();
   // xxx set CORS allowed header
index 13ca4c4ff6d0ab5d90fed9aa0e92bc316c517bac..d258fe0f1e32cdb137ea96427988124ceb6e4c94 100644 (file)
@@ -39,6 +39,7 @@ impl StableIndexOffset for UpdateId {
 struct UpdateReader {
   player : PlayerId,
   client : ClientId,
+  need_flush : bool,
   init_confirmation_send : iter::Once<()>,
   to_send : UpdateId,
   ami : Arc<Mutex<Instance>>,
@@ -51,6 +52,10 @@ struct RecordedConfirmation {
   cseq : ClientSequence,
 }
 
+#[derive(Error,Debug)]
+#[error("WouldBlock error misreported!")]
+struct FlushWouldBlockError{}
+
 impl Read for UpdateReader {
   fn read(&mut self, orig_buf: &mut [u8]) -> Result<usize,io::Error> {
     let em : fn(&'static str) -> io::Error =
@@ -62,10 +67,10 @@ impl Read for UpdateReader {
 
     if self.init_confirmation_send.next().is_some() {
       write!(buf, r#"
-event: commsworking
 data: server online
 
 "#)?;
+/*event: commsworking*/
     }
 
     let pu = &mut amig.updates.get(self.player)
@@ -107,9 +112,16 @@ data: {}
         eprintln!("SENDING {} to {:?} {:?}:\n{}\n",
                   generated, &self.player, &self.client,
                   str::from_utf8(&orig_buf[0..generated]).unwrap());
+        self.need_flush = true;
         return Ok(generated)
       }
 
+      if self.need_flush {
+        self.need_flush = false;
+        return Err(io::Error::new(io::ErrorKind::WouldBlock,
+                                  FlushWouldBlockError{}));
+      }
+
       amig = cv.wait_timeout(amig, UPDATE_KEEPALIVE)
         .map_err(|_| em("poison"))?.0;
       write!(buf,r#"
@@ -223,6 +235,7 @@ eprintln!("updates content iad={:?} player={:?} cl={:?} updates={:?}",
     
     UpdateReader {
       player, client, to_send, ami,
+      need_flush : false,
       init_confirmation_send : iter::once(()),
     }
   };