Skip to content

Commit 5283dae

Browse files
committed
Tide sessions
1 parent 724afc9 commit 5283dae

File tree

8 files changed

+661
-3
lines changed

8 files changed

+661
-3
lines changed

Cargo.toml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,18 @@ features = ["docs"]
2424
rustdoc-args = ["--cfg", "feature=\"docs\""]
2525

2626
[features]
27-
default = ["h1-server", "logger"]
27+
default = ["h1-server", "logger", "sessions"]
2828
h1-server = ["async-h1"]
2929
logger = []
3030
docs = ["unstable"]
31+
sessions = ["async-session"]
3132
unstable = []
3233
# DO NOT USE. Only exists to expose internals so they can be benchmarked.
3334
__internal__bench = []
3435

3536
[dependencies]
3637
async-h1 = { version = "2.0.1", optional = true }
38+
async-session = { version = "2.0.0", optional = true }
3739
async-sse = "4.0.0"
3840
async-std = { version = "1.6.0", features = ["unstable"] }
3941
async-trait = "0.1.36"
@@ -65,4 +67,3 @@ required-features = ["unstable"]
6567
[[bench]]
6668
name = "router"
6769
harness = false
68-

examples/sessions.rs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
#[async_std::main]
2+
async fn main() -> Result<(), std::io::Error> {
3+
tide::log::start();
4+
let mut app = tide::new();
5+
6+
app.middleware(tide::sessions::SessionMiddleware::new(
7+
tide::sessions::MemoryStore::new(),
8+
std::env::var("TIDE_SECRET")
9+
.expect(
10+
"Please provide a TIDE_SECRET value of at \
11+
least 32 bytes in order to run this example",
12+
)
13+
.as_bytes(),
14+
));
15+
16+
app.middleware(tide::utils::Before(
17+
|mut request: tide::Request<()>| async move {
18+
let session = request.session_mut();
19+
let visits: usize = session.get("visits").unwrap_or_default();
20+
session.insert("visits", visits + 1).unwrap();
21+
request
22+
},
23+
));
24+
25+
app.at("/").get(|req: tide::Request<()>| async move {
26+
let visits: usize = req.session().get("visits").unwrap();
27+
Ok(format!("you have visited this website {} times", visits))
28+
});
29+
30+
app.at("/reset")
31+
.get(|mut req: tide::Request<()>| async move {
32+
req.session_mut().destroy();
33+
Ok(tide::Redirect::new("/"))
34+
});
35+
36+
app.listen("127.0.0.1:8080").await?;
37+
38+
Ok(())
39+
}

src/lib.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,9 @@ pub mod security;
215215
pub mod sse;
216216
pub mod utils;
217217

218+
#[cfg(feature = "sessions")]
219+
pub mod sessions;
220+
218221
pub use endpoint::Endpoint;
219222
pub use middleware::{Middleware, Next};
220223
pub use redirect::Redirect;

src/request.rs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,12 @@ impl<State> Request<State> {
260260
self.req.ext().get()
261261
}
262262

263+
/// Get a mutable reference to value stored in request extensions.
264+
#[must_use]
265+
pub fn ext_mut<T: Send + Sync + 'static>(&mut self) -> Option<&mut T> {
266+
self.req.ext_mut().get_mut()
267+
}
268+
263269
/// Set a request extension value.
264270
pub fn set_ext<T: Send + Sync + 'static>(&mut self, val: T) -> Option<T> {
265271
self.req.ext_mut().insert(val)
@@ -506,6 +512,32 @@ impl<State> Request<State> {
506512
.and_then(|cookie_data| cookie_data.content.read().unwrap().get(name).cloned())
507513
}
508514

515+
/// Retrieves a reference to the current session.
516+
///
517+
/// # Panics
518+
///
519+
/// This method will panic if a tide::sessions:SessionMiddleware has not
520+
/// been run.
521+
#[cfg(feature = "sessions")]
522+
pub fn session(&self) -> &crate::sessions::Session {
523+
self.ext::<crate::sessions::Session>().expect(
524+
"request session not initialized, did you enable tide::sessions::SessionMiddleware?",
525+
)
526+
}
527+
528+
/// Retrieves a mutable reference to the current session.
529+
///
530+
/// # Panics
531+
///
532+
/// This method will panic if a tide::sessions:SessionMiddleware has not
533+
/// been run.
534+
#[cfg(feature = "sessions")]
535+
pub fn session_mut(&mut self) -> &mut crate::sessions::Session {
536+
self.ext_mut().expect(
537+
"request session not initialized, did you enable tide::sessions::SessionMiddleware?",
538+
)
539+
}
540+
509541
/// Get the length of the body stream, if it has been set.
510542
///
511543
/// This value is set when passing a fixed-size object into as the body. E.g. a string, or a

0 commit comments

Comments
 (0)