From befe6dde61b51d86406de7c45d4ad27977e5d49e Mon Sep 17 00:00:00 2001 From: Pepo Viola Date: Thu, 24 Dec 2020 11:00:50 -0300 Subject: [PATCH 1/5] wip, use session behind an arc in middleware --- src/request.rs | 19 +++++++++++++------ src/sessions/middleware.rs | 9 +++++++-- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/request.rs b/src/request.rs index 4dca98043..c8a14733b 100644 --- a/src/request.rs +++ b/src/request.rs @@ -2,6 +2,7 @@ use async_std::io::{self, prelude::*}; use async_std::task::{Context, Poll}; use route_recognizer::Params; +use std::sync::{Arc,RwLock}; use std::ops::Index; use std::pin::Pin; @@ -500,10 +501,13 @@ impl Request { /// This method will panic if a tide::sessions:SessionMiddleware has not /// been run. #[cfg(feature = "sessions")] - pub fn session(&self) -> &crate::sessions::Session { - self.ext::().expect( + pub fn session(&self) -> std::sync::RwLockReadGuard { + let lock = self.ext::>>().expect( "request session not initialized, did you enable tide::sessions::SessionMiddleware?", - ) + ); + let guard = lock.read().unwrap(); + + guard } /// Retrieves a mutable reference to the current session. @@ -513,10 +517,13 @@ impl Request { /// This method will panic if a tide::sessions:SessionMiddleware has not /// been run. #[cfg(feature = "sessions")] - pub fn session_mut(&mut self) -> &mut crate::sessions::Session { - self.ext_mut().expect( + pub fn session_mut(&mut self) -> std::sync::RwLockWriteGuard { + let lock = self.ext::>>().expect( "request session not initialized, did you enable tide::sessions::SessionMiddleware?", - ) + ); + let guard = lock.write().unwrap(); + + guard } /// Get the length of the body stream, if it has been set. diff --git a/src/sessions/middleware.rs b/src/sessions/middleware.rs index 57dfbbd72..62c29c8cb 100644 --- a/src/sessions/middleware.rs +++ b/src/sessions/middleware.rs @@ -6,6 +6,8 @@ use crate::http::{ use crate::{utils::async_trait, Middleware, Next, Request}; use std::time::Duration; +use std::sync::{Arc,RwLock}; + use async_session::{ base64, hmac::{Hmac, Mac, NewMac}, @@ -86,16 +88,19 @@ where .and_then(|cookie| self.verify_signature(cookie.value()).ok()); let mut session = self.load_or_create(cookie_value).await; - if let Some(ttl) = self.session_ttl { session.expire_in(ttl); } let secure_cookie = request.url().scheme() == "https"; - request.set_ext(session.clone()); + + let session_lock = Arc::new(RwLock::new(session)); + request.set_ext(session_lock.clone()); let mut response = next.run(request).await; + let session = (*session_lock.read().unwrap()).clone(); + if session.is_destroyed() { if let Err(e) = self.store.destroy_session(session).await { crate::log::error!("unable to destroy session", { error: e.to_string() }); From bb4d37143fd2f87cfa65e405ad37dcf6006596b2 Mon Sep 17 00:00:00 2001 From: Pepo Viola Date: Thu, 24 Dec 2020 13:16:51 -0300 Subject: [PATCH 2/5] fmt --- src/request.rs | 2 +- src/sessions/middleware.rs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/request.rs b/src/request.rs index c8a14733b..70ee7e29f 100644 --- a/src/request.rs +++ b/src/request.rs @@ -2,9 +2,9 @@ use async_std::io::{self, prelude::*}; use async_std::task::{Context, Poll}; use route_recognizer::Params; -use std::sync::{Arc,RwLock}; use std::ops::Index; use std::pin::Pin; +use std::sync::{Arc, RwLock}; #[cfg(feature = "cookies")] use crate::cookies::CookieData; diff --git a/src/sessions/middleware.rs b/src/sessions/middleware.rs index 62c29c8cb..169298725 100644 --- a/src/sessions/middleware.rs +++ b/src/sessions/middleware.rs @@ -6,7 +6,7 @@ use crate::http::{ use crate::{utils::async_trait, Middleware, Next, Request}; use std::time::Duration; -use std::sync::{Arc,RwLock}; +use std::sync::{Arc, RwLock}; use async_session::{ base64, @@ -94,7 +94,7 @@ where let secure_cookie = request.url().scheme() == "https"; - let session_lock = Arc::new(RwLock::new(session)); + let session_lock = Arc::new(RwLock::new(session)); request.set_ext(session_lock.clone()); let mut response = next.run(request).await; From 43c0e6e78649f33ec3dcd84cc20dc88bf2b71147 Mon Sep 17 00:00:00 2001 From: Pepo Viola Date: Fri, 25 Dec 2020 23:34:55 -0300 Subject: [PATCH 3/5] clean code --- src/request.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/request.rs b/src/request.rs index 70ee7e29f..a07bacf6a 100644 --- a/src/request.rs +++ b/src/request.rs @@ -505,9 +505,8 @@ impl Request { let lock = self.ext::>>().expect( "request session not initialized, did you enable tide::sessions::SessionMiddleware?", ); - let guard = lock.read().unwrap(); - guard + lock.read().unwrap() } /// Retrieves a mutable reference to the current session. @@ -521,9 +520,8 @@ impl Request { let lock = self.ext::>>().expect( "request session not initialized, did you enable tide::sessions::SessionMiddleware?", ); - let guard = lock.write().unwrap(); - guard + lock.write().unwrap() } /// Get the length of the body stream, if it has been set. From 20dd0eb876e2a562918c8cee1f4304f0aec77c04 Mon Sep 17 00:00:00 2001 From: Pepo Viola Date: Sat, 26 Dec 2020 04:10:36 -0300 Subject: [PATCH 4/5] extract value from arc::rwlock and not clone --- src/sessions/middleware.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sessions/middleware.rs b/src/sessions/middleware.rs index 169298725..f9e2e7d4f 100644 --- a/src/sessions/middleware.rs +++ b/src/sessions/middleware.rs @@ -99,7 +99,7 @@ where let mut response = next.run(request).await; - let session = (*session_lock.read().unwrap()).clone(); + let session = Arc::try_unwrap(session_lock).unwrap().into_inner().unwrap(); if session.is_destroyed() { if let Err(e) = self.store.destroy_session(session).await { From a3b83262d2cac90f4593f6937889e16266700ff8 Mon Sep 17 00:00:00 2001 From: Javier Viola Date: Wed, 30 Dec 2020 04:00:32 -0300 Subject: [PATCH 5/5] apply clippy --- src/request.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/request.rs b/src/request.rs index a07bacf6a..a79b8e67e 100644 --- a/src/request.rs +++ b/src/request.rs @@ -501,7 +501,7 @@ impl Request { /// This method will panic if a tide::sessions:SessionMiddleware has not /// been run. #[cfg(feature = "sessions")] - pub fn session(&self) -> std::sync::RwLockReadGuard { + pub fn session(&self) -> std::sync::RwLockReadGuard<'_, crate::sessions::Session> { let lock = self.ext::>>().expect( "request session not initialized, did you enable tide::sessions::SessionMiddleware?", ); @@ -516,7 +516,7 @@ impl Request { /// This method will panic if a tide::sessions:SessionMiddleware has not /// been run. #[cfg(feature = "sessions")] - pub fn session_mut(&mut self) -> std::sync::RwLockWriteGuard { + pub fn session_mut(&mut self) -> std::sync::RwLockWriteGuard<'_, crate::sessions::Session> { let lock = self.ext::>>().expect( "request session not initialized, did you enable tide::sessions::SessionMiddleware?", );