From 7792e7ca8230c5722822e084a0acfbee5273efc9 Mon Sep 17 00:00:00 2001 From: Jeff Baskin Date: Tue, 8 Apr 2025 09:30:04 -0400 Subject: [PATCH] Made request pass session to message. --- src/client.rs | 45 ++++++++++++++++++++++++++++++++++++--------- src/lib.rs | 2 +- src/main.rs | 26 +++++++++++++++++++++++++- src/queue.rs | 32 +++++++++++++++++++++++++++++--- 4 files changed, 91 insertions(+), 14 deletions(-) diff --git a/src/client.rs b/src/client.rs index b8aec3e..5400f2b 100644 --- a/src/client.rs +++ b/src/client.rs @@ -1,4 +1,5 @@ use crate::{ + field::Field, queue::{Message, MsgType, Queue}, utils::GenID, }; @@ -14,20 +15,46 @@ use uuid::Uuid; const RESPONS_TO: [MsgType; 1] = [MsgType::Session]; -pub struct Request; +pub struct Request { + pub session: Option, +} impl Request { - pub fn new() -> Self { - Self {} + pub fn new(session: Option) -> Self { + Self { session: session } } } #[cfg(test)] -mod requests { +pub mod requests { use super::*; - pub fn create_request() -> Request { - Request::new() + pub fn get_root_document() -> Request { + Request::new(None) + } + + pub fn get_root_document_eith_session(id: F) -> Request + where + F: Into, + { + Request::new(Some(id.into())) + } + + #[test] + fn new_request_no_session() { + let sess: Option = None; + let req = Request::new(sess); + assert!(req.session.is_none(), "should not have a session") + } + + #[test] + fn new_request_with_session() { + let id = Uuid::new_v4(); + let req = Request::new(Some(id.into())); + match req.session { + Some(result) => assert_eq!(result.to_uuid().unwrap(), id), + None => unreachable!("should contain a session"), + } } } @@ -193,7 +220,7 @@ mod clientlinks { let (tx, rx) = channel(); let mut registry = ClientRegistry::new(); let mut link = ClientLink::new(tx, registry.clone()); - let req = Request::new(); + let req = Request::new(None); let rx_client = link.send(req); let msg = rx.recv_timeout(TIMEOUT).unwrap(); match msg.get_class() { @@ -266,7 +293,7 @@ impl Client { #[cfg(test)] mod clients { use super::*; - use requests::create_request; + use requests::get_root_document; use std::time::Duration; static TIMEOUT: Duration = Duration::from_millis(500); @@ -277,7 +304,7 @@ mod clients { let queue = Queue::new(); queue.add(tx, [MsgType::SessionValidate].to_vec()); let mut link = Client::start(queue.clone()); - let req = create_request(); + let req = get_root_document(); let reply_rx = link.send(req); let sess = rx.recv_timeout(TIMEOUT).unwrap(); match sess.get_class() { diff --git a/src/lib.rs b/src/lib.rs index de9c9dd..b3478d2 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -27,7 +27,7 @@ impl MoreThanText { where F: Into, { - let req = Request::new(); + let req = Request::new(None); let rx = self.client_link.send(req); rx.recv().unwrap() } diff --git a/src/main.rs b/src/main.rs index 7ec4a45..856a976 100644 --- a/src/main.rs +++ b/src/main.rs @@ -67,7 +67,7 @@ mod servers { body::Body, http::{Request, StatusCode}, }; - use tower::ServiceExt; + use tower::{Service, ServiceExt}; #[tokio::test] async fn get_home_page() { @@ -100,4 +100,28 @@ mod servers { holder.push(sessid); } } + + // Next test to complete. + //#[tokio::test] + async fn session_only_sent_once() { + let mut app = mtt_conn.with_state(MoreThanText::new()); + let request = Request::builder().uri("/").body(Body::empty()).unwrap(); + let response = ServiceExt::>::ready(&mut app) + .await + .unwrap() + .call(request) + .await + .unwrap(); + assert_eq!(response.status(), StatusCode::OK); + let request = Request::builder().uri("/").body(Body::empty()).unwrap(); + let response = ServiceExt::>::ready(&mut app) + .await + .unwrap() + .call(request) + .await + .unwrap(); + assert_eq!(response.status(), StatusCode::OK); + let session = response.headers().get("set-cookie"); + assert!(session.is_none(), "should only send the session once"); + } } diff --git a/src/queue.rs b/src/queue.rs index b8482c3..4115478 100644 --- a/src/queue.rs +++ b/src/queue.rs @@ -58,15 +58,20 @@ impl Message { } impl From for Message { - fn from(_value: Request) -> Self { - let msg = Message::new(MsgType::ClientRequest); - msg.reply(MsgType::ClientRequest) + fn from(value: Request) -> Self { + let mut msg = Message::new(MsgType::ClientRequest); + match value.session { + Some(id) => msg.add_data("sess_id", id), + None => {} + } + msg } } #[cfg(test)] mod messages { use super::*; + use crate::client::requests::{get_root_document, get_root_document_eith_session}; #[test] fn new_message() { @@ -130,6 +135,27 @@ mod messages { let msg = Message::new(MsgType::Session); assert_eq!(msg.get_id(), msg.id); } + + #[test] + fn from_request_no_session() { + let req = get_root_document(); + let msg: Message = req.into(); + assert!( + msg.get_data("sess_id").is_none(), + "should not have a session id" + ) + } + + #[test] + fn from_request_with_session() { + let id = Uuid::new_v4(); + let req = get_root_document_eith_session(id.clone()); + let msg: Message = req.into(); + match msg.get_data("sess_id") { + Some(result) => assert_eq!(result.to_uuid().unwrap(), id), + None => unreachable!("should return an id"), + } + } } #[derive(Clone)]