From: Ian Jackson Date: Sun, 17 May 2020 12:36:28 +0000 (+0100) Subject: deployment note, copy to see-test read for hacking main X-Git-Tag: otter-0.2.0~1611 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=e7d6a355e1d1bfc7f301fc9a9561140736cd3b87;p=otter.git deployment note, copy to see-test read for hacking main --- diff --git a/src/bin/ssetest.rs b/src/bin/ssetest.rs new file mode 100644 index 00000000..6caaca9e --- /dev/null +++ b/src/bin/ssetest.rs @@ -0,0 +1,88 @@ + +#![feature(proc_macro_hygiene, decl_macro)] + +#[macro_use] extern crate rocket; + +extern crate rocket_contrib; // why do we need this ? +extern crate serde; +extern crate thiserror; +extern crate anyhow; + +#[path="../imports.rs"] +mod imports; +use imports::*; + +type RE = E; + +#[derive(Serialize,Debug)] +struct TestRenderContext { } + +#[get("/")] +fn index() -> Result { + let c = TestRenderContext { }; + Ok(Template::render("test",&c)) +} + +const RESOURCES : &[&'static str] = &["script.js", "style.css"]; + +#[derive(Debug)] +struct CheckedResourceLeaf { pub safe : &'static str } +#[derive(Error,Debug)] +#[error("not a valid resource path")] +struct UnknownResource{} + +impl<'r> FromParam<'r> for CheckedResourceLeaf { + type Error = UnknownResource; + fn from_param(param: &'r RawStr) -> Result { + for &safe in RESOURCES { + if safe == param.as_str() { return Ok(CheckedResourceLeaf{ safe }) } + } + Err(UnknownResource{}) + } +} + +type TestCounter = BufReader; +#[derive(Debug)] +struct TestCounterInner { next : usize, } +impl Read for TestCounterInner { + fn read(&mut self, buf: &mut [u8]) -> io::Result { + thread::sleep(Duration::from_millis(500)); + let data = format!("data: {}\n\n", self.next); + self.next += 1; + buf[0..data.len()].copy_from_slice(data.as_bytes()); + Ok(buf.len()) + } +} + +#[get("/updates")] +fn updates() -> impl response::Responder<'static> { + let tc = TestCounterInner { next : 0 }; + let tc = BufReader::new(tc); + let ch = response::Stream::chunked(tc, 1); + let ct = ContentType::parse_flexible("text/event-stream; charset=utf-8"). + unwrap(); + response::content::Content(ct,ch) +} + +#[get("/")] +fn resource(leaf : CheckedResourceLeaf) -> io::Result { + let template_dir = "templates"; // xxx + NamedFile::open(format!("{}/{}", template_dir, leaf.safe)) +} + +fn main() { + let helmet = SpaceHelmet::default() + .enable(NoSniff::Enable) + .enable(Frame::Deny) + .enable(Referrer::NoReferrer); + + rocket::ignite() + .attach(helmet) + .attach(Template::fairing()) + .mount("/", routes![ + index, + resource, + updates, + ]) + .launch(); +} diff --git a/templates/script.js b/templates/script.js index bb72ad5b..f2cf6f70 100644 --- a/templates/script.js +++ b/templates/script.js @@ -1,5 +1,7 @@ // +// xxx deployment note: need a whole bunch of domains for SSE conn limit + status_node = document.getElementById('spong'); status_node.innerHTML = 'js-done'