diff --git a/actix-session/CHANGES.md b/actix-session/CHANGES.md index 927485051..d85f6d5f1 100644 --- a/actix-session/CHANGES.md +++ b/actix-session/CHANGES.md @@ -1,12 +1,12 @@ # Changes -## [0.2.0] - 2019-07-03 +## [0.2.0] - 2019-07-08 + * Enhanced ``actix-session`` to facilitate state changes. Use ``Session.renew()`` at successful login to cycle a session (new key/cookie but keeps state). - Use ``Session.purge()`` at logout to invalid a session cookie (and remove + Use ``Session.purge()`` at logout to invalid a session cookie (and remove from redis cache, if applicable). - ## [0.1.1] - 2019-06-03 * Fix optional cookie session support diff --git a/actix-session/README.md b/actix-session/README.md index 7d6830412..0aee756fd 100644 --- a/actix-session/README.md +++ b/actix-session/README.md @@ -6,4 +6,4 @@ * [API Documentation](https://docs.rs/actix-session/) * [Chat on gitter](https://gitter.im/actix/actix) * Cargo package: [actix-session](https://crates.io/crates/actix-session) -* Minimum supported Rust version: 1.33 or later +* Minimum supported Rust version: 1.34 or later diff --git a/actix-session/src/cookie.rs b/actix-session/src/cookie.rs index 45f24817e..8627ce4c8 100644 --- a/actix-session/src/cookie.rs +++ b/actix-session/src/cookie.rs @@ -120,8 +120,7 @@ impl CookieSessionInner { } /// invalidates session cookie - fn remove_cookie(&self, res: &mut ServiceResponse) - -> Result<(), Error> { + fn remove_cookie(&self, res: &mut ServiceResponse) -> Result<(), Error> { let mut cookie = Cookie::named(self.name.clone()); cookie.set_value(""); cookie.set_max_age(time::Duration::seconds(0)); @@ -317,7 +316,7 @@ where } /// On first request, a new session cookie is returned in response, regardless - /// of whether any session state is set. With subsequent requests, if the + /// of whether any session state is set. With subsequent requests, if the /// session state changes, then set-cookie is returned in response. As /// a user logs out, call session.purge() to set SessionStatus accordingly /// and this will trigger removal of the session cookie in the response. @@ -329,21 +328,24 @@ where Box::new(self.service.call(req).map(move |mut res| { match Session::get_changes(&mut res) { (SessionStatus::Changed, Some(state)) - | (SessionStatus::Renewed, Some(state)) => - res.checked_expr(|res| inner.set_cookie(res, state)), + | (SessionStatus::Renewed, Some(state)) => { + res.checked_expr(|res| inner.set_cookie(res, state)) + } (SessionStatus::Unchanged, _) => - // set a new session cookie upon first request (new client) + // set a new session cookie upon first request (new client) + { if is_new { let state: HashMap = HashMap::new(); res.checked_expr(|res| inner.set_cookie(res, state.into_iter())) } else { res - }, + } + } (SessionStatus::Purged, _) => { - inner.remove_cookie(&mut res); - res - }, - _ => res + inner.remove_cookie(&mut res); + res + } + _ => res, } })) } diff --git a/actix-session/src/lib.rs b/actix-session/src/lib.rs index aaf0ab02f..27ad2b876 100644 --- a/actix-session/src/lib.rs +++ b/actix-session/src/lib.rs @@ -103,7 +103,7 @@ pub enum SessionStatus { Changed, Purged, Renewed, - Unchanged + Unchanged, } impl Default for SessionStatus { fn default() -> SessionStatus { @@ -183,7 +183,10 @@ impl Session { pub fn get_changes( res: &mut ServiceResponse, - ) -> (SessionStatus, Option>) { + ) -> ( + SessionStatus, + Option>, + ) { if let Some(s_impl) = res .request() .extensions() @@ -286,7 +289,6 @@ mod tests { assert_eq!(session.0.borrow().status, SessionStatus::Purged); } - #[test] fn renew_session() { let mut req = test::TestRequest::default().to_srv_request();