From: Ian Jackson Date: Sat, 4 Jul 2020 23:04:16 +0000 (+0100) Subject: buffer trouble - something works ish ? X-Git-Tag: otter-0.2.0~1456 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=56640cfe830243b77f021af69911edb26e11aa3c;p=otter.git buffer trouble - something works ish ? --- diff --git a/Cargo.lock.example b/Cargo.lock.example index 02f92c83..e29210cd 100644 --- a/Cargo.lock.example +++ b/Cargo.lock.example @@ -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", diff --git a/Cargo.toml b/Cargo.toml index 4df0ccce..fcb2f5a8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -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" diff --git a/src/bin/server.rs b/src/bin/server.rs index eb29a9a2..7a708d09 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -207,7 +207,7 @@ fn updates(ctoken : InstanceAccess, 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 diff --git a/src/sse.rs b/src/sse.rs index 13ca4c4f..d258fe0f 100644 --- a/src/sse.rs +++ b/src/sse.rs @@ -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>, @@ -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 { 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(()), } };