diff --git a/actix-session/CHANGES.md b/actix-session/CHANGES.md index d85f6d5f1..784bfdf0d 100644 --- a/actix-session/CHANGES.md +++ b/actix-session/CHANGES.md @@ -6,6 +6,7 @@ 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 from redis cache, if applicable). +* Add access to the session from RequestHead for use of session from guard methods ## [0.1.1] - 2019-06-03 diff --git a/actix-session/src/lib.rs b/actix-session/src/lib.rs index 6f23ef913..771c4f67c 100644 --- a/actix-session/src/lib.rs +++ b/actix-session/src/lib.rs @@ -46,7 +46,9 @@ use std::cell::RefCell; use std::collections::HashMap; use std::rc::Rc; -use actix_web::dev::{Extensions, Payload, ServiceRequest, ServiceResponse}; +use actix_web::dev::{ + Extensions, Payload, RequestHead, ServiceRequest, ServiceResponse, +}; use actix_web::{Error, FromRequest, HttpMessage, HttpRequest}; use futures::future::{ok, Ready}; use serde::de::DeserializeOwned; @@ -99,6 +101,12 @@ impl UserSession for ServiceRequest { } } +impl UserSession for RequestHead { + fn get_session(&mut self) -> Session { + Session::get_session(&mut *self.extensions_mut()) + } +} + #[derive(PartialEq, Clone, Debug)] pub enum SessionStatus { Changed, @@ -281,6 +289,20 @@ mod tests { assert_eq!(res, Some("value".to_string())); } + #[test] + fn get_session_from_request_head() { + let mut req = test::TestRequest::default().to_srv_request(); + + Session::set_session( + vec![("key".to_string(), "\"value\"".to_string())].into_iter(), + &mut req, + ); + + let session = req.head_mut().get_session(); + let res = session.get::("key").unwrap(); + assert_eq!(res, Some("value".to_string())); + } + #[test] fn purge_session() { let req = test::TestRequest::default().to_srv_request();