Compare commits
No commits in common. 'f8d5445cdc10919db5486c2e0e4cc3a6578bd972' and 'af30c552ac4aaa9a59ba8e5e56b0b08122fd7b1f' have entirely different histories.
f8d5445cdc
...
af30c552ac
@ -1,77 +0,0 @@ |
|||||||
#![feature(proc_macro_hygiene, decl_macro)] |
|
||||||
#[macro_use] |
|
||||||
extern crate rocket; |
|
||||||
|
|
||||||
use rocket::request::Form; |
|
||||||
use rocket::response::content::Html; |
|
||||||
use rocket::response::Redirect; |
|
||||||
|
|
||||||
type Session<'a> = rocket_session::Session<'a, Vec<String>>; |
|
||||||
|
|
||||||
fn main() { |
|
||||||
rocket::ignite() |
|
||||||
.attach(Session::fairing()) |
|
||||||
.mount("/", routes![index, add, remove]) |
|
||||||
.launch(); |
|
||||||
} |
|
||||||
|
|
||||||
#[get("/")] |
|
||||||
fn index(session: Session) -> Html<String> { |
|
||||||
let mut page = String::new(); |
|
||||||
page.push_str( |
|
||||||
r#" |
|
||||||
<!DOCTYPE html> |
|
||||||
<h1>My Dogs</h1> |
|
||||||
|
|
||||||
<form method="POST" action="/add"> |
|
||||||
Add Dog: <input type="text" name="name"> <input type="submit" value="Add"> |
|
||||||
</form> |
|
||||||
|
|
||||||
<ul> |
|
||||||
"#, |
|
||||||
); |
|
||||||
|
|
||||||
session.tap(|sess| { |
|
||||||
for (n, dog) in sess.iter().enumerate() { |
|
||||||
page.push_str(&format!( |
|
||||||
r#" |
|
||||||
<li>🐶 {} <a href="/remove/{}">Remove</a></li> |
|
||||||
"#, |
|
||||||
dog, n |
|
||||||
)); |
|
||||||
} |
|
||||||
}); |
|
||||||
|
|
||||||
page.push_str( |
|
||||||
r#" |
|
||||||
</ul> |
|
||||||
"#, |
|
||||||
); |
|
||||||
|
|
||||||
Html(page) |
|
||||||
} |
|
||||||
|
|
||||||
#[derive(FromForm)] |
|
||||||
struct AddForm { |
|
||||||
name: String, |
|
||||||
} |
|
||||||
|
|
||||||
#[post("/add", data = "<dog>")] |
|
||||||
fn add(session: Session, dog: Form<AddForm>) -> Redirect { |
|
||||||
session.tap(move |sess| { |
|
||||||
sess.push(dog.into_inner().name); |
|
||||||
}); |
|
||||||
|
|
||||||
Redirect::found("/") |
|
||||||
} |
|
||||||
|
|
||||||
#[get("/remove/<dog>")] |
|
||||||
fn remove(session: Session, dog: usize) -> Redirect { |
|
||||||
session.tap(|sess| { |
|
||||||
if dog < sess.len() { |
|
||||||
sess.remove(dog); |
|
||||||
} |
|
||||||
}); |
|
||||||
|
|
||||||
Redirect::found("/") |
|
||||||
} |
|
@ -1,74 +0,0 @@ |
|||||||
//! This demo is a page visit counter, with a custom cookie name, length, and expiry time.
|
|
||||||
//!
|
|
||||||
//! The expiry time is set to 10 seconds to illustrate how a session is cleared if inactive.
|
|
||||||
|
|
||||||
#![feature(proc_macro_hygiene, decl_macro)] |
|
||||||
#[macro_use] |
|
||||||
extern crate rocket; |
|
||||||
|
|
||||||
use rocket::response::content::Html; |
|
||||||
use std::time::Duration; |
|
||||||
|
|
||||||
#[derive(Default, Clone)] |
|
||||||
struct SessionData { |
|
||||||
visits1: usize, |
|
||||||
visits2: usize, |
|
||||||
} |
|
||||||
|
|
||||||
// It's convenient to define a type alias:
|
|
||||||
type Session<'a> = rocket_session::Session<'a, SessionData>; |
|
||||||
|
|
||||||
fn main() { |
|
||||||
rocket::ignite() |
|
||||||
.attach( |
|
||||||
Session::fairing() |
|
||||||
// 10 seconds of inactivity until session expires
|
|
||||||
// (wait 10s and refresh, the numbers will reset)
|
|
||||||
.with_lifetime(Duration::from_secs(10)) |
|
||||||
// custom cookie name and length
|
|
||||||
.with_cookie_name("my_cookie") |
|
||||||
.with_cookie_len(20), |
|
||||||
) |
|
||||||
.mount("/", routes![index, about]) |
|
||||||
.launch(); |
|
||||||
} |
|
||||||
|
|
||||||
#[get("/")] |
|
||||||
fn index(session: Session) -> Html<String> { |
|
||||||
// Here we build the entire response inside the 'tap' closure.
|
|
||||||
|
|
||||||
// While inside, the session is locked to parallel changes, e.g.
|
|
||||||
// from a different browser tab.
|
|
||||||
session.tap(|sess| { |
|
||||||
sess.visits1 += 1; |
|
||||||
|
|
||||||
Html(format!( |
|
||||||
r##" |
|
||||||
<!DOCTYPE html> |
|
||||||
<h1>Home</h1> |
|
||||||
<a href="/">Refresh</a> • <a href="/about/">go to About</a> |
|
||||||
<p>Visits: home {}, about {}</p> |
|
||||||
"##, |
|
||||||
sess.visits1, sess.visits2 |
|
||||||
)) |
|
||||||
}) |
|
||||||
} |
|
||||||
|
|
||||||
#[get("/about")] |
|
||||||
fn about(session: Session) -> Html<String> { |
|
||||||
// Here we return a value from the tap function and use it below
|
|
||||||
let count = session.tap(|sess| { |
|
||||||
sess.visits2 += 1; |
|
||||||
sess.visits2 |
|
||||||
}); |
|
||||||
|
|
||||||
Html(format!( |
|
||||||
r##" |
|
||||||
<!DOCTYPE html> |
|
||||||
<h1>About</h1> |
|
||||||
<a href="/about">Refresh</a> • <a href="/">go home</a> |
|
||||||
<p>Page visits: {}</p> |
|
||||||
"##, |
|
||||||
count |
|
||||||
)) |
|
||||||
} |
|
Loading…
Reference in new issue