#[derive(Serialize,Debug)]
struct FrontPageRenderContext { }
-#[get("/")]
-#[throws(OE)]
-fn index() -> Template {
- let c = FrontPageRenderContext { };
- Template::render("front",&c)
-}
-
#[derive(Copy,Clone,Debug)]
enum ResourceLocation { Main, Wasm(&'static str), }
type RL = ResourceLocation;
struct LoadingRenderContext<'r> {
ptoken : &'r RawTokenVal,
}
-#[get("/<ptoken>")]
+#[get("/")]
#[throws(OE)]
-fn loading(ptoken : InstanceAccess<PlayerId>) -> Template {
- let c = LoadingRenderContext { ptoken : ptoken.raw_token };
- Template::render("loading",&c)
+fn loading(ptoken: WholeQueryString) -> Template {
+ if let Some(ptoken) = ptoken.0 {
+ let c = LoadingRenderContext { ptoken : RawTokenVal::from_str(ptoken) };
+ Template::render("loading",&c)
+ } else {
+ let c = FrontPageRenderContext { };
+ Template::render("front",&c)
+ }
+}
+
+struct WholeQueryString<'r>(pub Option<&'r str>);
+
+impl<'a,'r> FromRequest<'a,'r> for WholeQueryString<'a> {
+ type Error = Impossible;
+ fn from_request(r: &'a rocket::Request<'r>) -> rocket::Outcome<Self, (rocket::http::Status, <Self as rocket::request::FromRequest<'a, 'r>>::Error), ()> {
+ eprintln!("REQUEST uri={:?}", &r.uri());
+ let q = r.uri().query();
+ rocket::Outcome::Success(WholeQueryString(q))
+ }
}
-#[get("/_/updates/<ctoken>/<gen>")]
+#[get("/_/updates?<ctoken>&<gen>")]
#[throws(OE)]
fn updates<'r>(ctoken : InstanceAccess<ClientId>, gen: u64,
cors: rocket_cors::Guard<'r>)
.attach(Template::fairing())
.manage(cors_state)
.mount("/", routes![
- index,
loading,
resource,
updates,
// str is [u8] with a funny hat on, so &str is pointer + byte count.
// nomicon says &SomeStruct([T]) is pointer plus number of elements.
// So &str and &SomeStruct(str) have the same layout
- fn from_str(s: &str) -> &RawTokenVal { unsafe { mem::transmute(s) } }
+ pub fn from_str(s: &str) -> &RawTokenVal { unsafe { mem::transmute(s) } }
}
impl Borrow<RawTokenVal> for RawToken {
let ipl = &self.c.g.iplayers.byid(player)?.ipl;
let gpl = self.c.g.gs.players.byid(player)?;
- let url = format!("{}/{}",
- &config().public_url.trim_start_matches("/"),
+ let url = format!("{}/?{}",
+ &config().public_url.trim_end_matches("/"),
token.0);
let info = AccessTokenInfo { url };
let report = access.deliver(&gpl, &ipl, info)?;
.ok_or(Id::ERROR)
}
-impl<'r, Id> FromParam<'r> for InstanceAccess<'r, Id>
+impl<'r, Id> FromFormValue<'r> for InstanceAccess<'r, Id>
where Id : AccessId, OE : From<Id::Error>
{
type Error = OE;
#[throws(OE)]
- fn from_param(param: &'r RawStr) -> Self {
+ fn from_form_value(param: &'r RawStr) -> Self {
let g = Id::global_tokens(PRIVATE_Y).read().unwrap();
let token = RawTokenVal::from_str(param.as_str());
let i = g.get(token).ok_or(Id::ERROR)?;
&player, client, &c.nick, &c.ctoken,
iad.gref.lock().ok().as_ref().map(|ig| &**ig));
- Ok(Template::render("landscape",&c))
+ Ok(Template::render("session",&c))
}
pub fn mount(rocket_instance: Rocket) -> Rocket {
redisplay_ancillaries(piece,p);
}
- var es = new EventSource(sse_url_prefix + "/_/updates/"+ctoken+'/'+gen);
+ var es = new EventSource(
+ sse_url_prefix + "/_/updates?ctoken="+ctoken+'&gen='+gen
+ );
es.onmessage = function(event) {
console.log('GOTEVE', event);
var k;