Add minimal example, some formatting, bump parking_lot version

master
Ondřej Hruška 2 years ago
parent bc2180d1e4
commit b0a2d8c910
  1. 2
      Cargo.toml
  2. 24
      README.md
  3. 28
      examples/minimal/main.rs
  4. 26
      src/lib.rs

@ -18,4 +18,4 @@ categories = [
[dependencies] [dependencies]
rand = "0.8" rand = "0.8"
rocket = "0.5.0-rc.2" rocket = "0.5.0-rc.2"
parking_lot = "0.11" parking_lot = "0.12"

@ -13,6 +13,8 @@ The implementation is generic to support any type as session data: a custom stru
The session lifetime, cookie name, and other parameters can be configured by calling chained The session lifetime, cookie name, and other parameters can be configured by calling chained
methods on the fairing. When a session expires, the data associated with it is dropped. methods on the fairing. When a session expires, the data associated with it is dropped.
Example: `Session::fairing().with_lifetime(Duration::from_secs(15))`
## Usage ## Usage
To use session in a route, first make sure you have the fairing attached by calling To use session in a route, first make sure you have the fairing attached by calling
@ -31,7 +33,7 @@ the session list does not waste memory.
## Examples ## Examples
(More examples are in the examples folder) More examples are in the "examples" folder - run with `cargo run --example=NAME`
### Basic Example ### Basic Example
@ -39,19 +41,16 @@ This simple example uses u64 as the session variable; note that it can be a stru
it just needs to implement `Send + Sync + Default`. it just needs to implement `Send + Sync + Default`.
```rust ```rust
#![feature(proc_macro_hygiene, decl_macro)] #[macro_use]
#[macro_use] extern crate rocket; extern crate rocket;
use std::time::Duration;
// It's convenient to define a type alias: type Session<'a> = rocket_session::Session<'a, u64>;
pub type Session<'a> = rocket_session::Session<'a, u64>;
fn main() { #[launch]
rocket::ignite() fn rocket() -> _ {
rocket::build()
.attach(Session::fairing()) .attach(Session::fairing())
.mount("/", routes![index]) .mount("/", routes![index])
.launch();
} }
#[get("/")] #[get("/")]
@ -67,6 +66,7 @@ fn index(session: Session) -> String {
format!("{} visits", count) format!("{} visits", count)
} }
``` ```
## Extending Session by a Trait ## Extending Session by a Trait
@ -76,8 +76,8 @@ The `.tap()` method is powerful, but sometimes you may wish for something more c
Here is an example of using a custom trait and the `json_dotpath` crate to implement Here is an example of using a custom trait and the `json_dotpath` crate to implement
a polymorphic store based on serde serialization. a polymorphic store based on serde serialization.
Note that this approach is prone to data races, since every method contains its own `.tap()`. Note that this approach is prone to data races if you're accessing the session object multiple times per request,
It may be safer to simply call the `.dot_*()` methods manually in one shared closure. since every method contains its own `.tap()`. It may be safer to simply call the `.dot_*()` methods manually in one shared closure.
```rust ```rust
use serde_json::Value; use serde_json::Value;

@ -0,0 +1,28 @@
#[macro_use]
extern crate rocket;
use std::time::Duration;
type Session<'a> = rocket_session::Session<'a, u64>;
#[launch]
fn rocket() -> _ {
// This session expires in 15 seconds as a demonstration of session configuration
rocket::build()
.attach(Session::fairing().with_lifetime(Duration::from_secs(15)))
.mount("/", routes![index])
}
#[get("/")]
fn index(session: Session) -> String {
let count = session.tap(|n| {
// Change the stored value (it is &mut)
*n += 1;
// Return something to the caller.
// This can be any type, 'tap' is generic.
*n
});
format!("{} visits", count)
}

@ -1,6 +1,12 @@
use std::borrow::Cow;
use std::collections::HashMap;
use std::fmt::{self, Display, Formatter};
use std::marker::PhantomData;
use std::ops::Add;
use std::time::{Duration, Instant};
use parking_lot::{Mutex, RwLock, RwLockUpgradableReadGuard}; use parking_lot::{Mutex, RwLock, RwLockUpgradableReadGuard};
use rand::{rngs::OsRng, Rng}; use rand::{rngs::OsRng, Rng};
use rocket::{ use rocket::{
fairing::{self, Fairing, Info}, fairing::{self, Fairing, Info},
http::{Cookie, Status}, http::{Cookie, Status},
@ -9,13 +15,6 @@ use rocket::{
Build, Request, Response, Rocket, State, Build, Request, Response, Rocket, State,
}; };
use std::borrow::Cow;
use std::collections::HashMap;
use std::fmt::{self, Display, Formatter};
use std::marker::PhantomData;
use std::ops::Add;
use std::time::{Duration, Instant};
/// Session store (shared state) /// Session store (shared state)
#[derive(Debug)] #[derive(Debug)]
pub struct SessionStore<D> pub struct SessionStore<D>
@ -134,11 +133,10 @@ where
let store_ug = store.inner.upgradable_read(); let store_ug = store.inner.upgradable_read();
// Resolve session ID // Resolve session ID
let id = if let Some(cookie) = request.cookies().get(&store.config.cookie_name) { let id = request
Some(SessionID(cookie.value().to_string())) .cookies()
} else { .get(&store.config.cookie_name)
None .map(|cookie| SessionID(cookie.value().to_string()));
};
let expires = Instant::now().add(store.config.lifespan); let expires = Instant::now().add(store.config.lifespan);
@ -200,7 +198,7 @@ where
new_id new_id
} }
}), }),
store: store, store,
}) })
} }
} }

Loading…
Cancel
Save