simple_api/
middlewares.rs1use crate::middleware::Middleware;
2use crate::{context::Context, types::HttpRequest};
3
4pub use crate::types::HttpResonse;
5use crate::utils;
6use anyhow::Ok;
7use async_trait::async_trait;
8
9use hyper::header;
10pub struct SessionMiddleware;
11
12#[async_trait]
13impl Middleware for SessionMiddleware {
14 async fn pre_process(
15 &self,
16 req: &mut HttpRequest,
17 ctx: &mut Context,
18 ) -> anyhow::Result<Option<HttpResonse>> {
19 let sp = match ctx.session_provider {
20 Some(ref v) => v,
21 None => return Ok(None),
22 };
23
24 let cookie_string = match req.headers().get(header::COOKIE) {
25 Some(v) => v.to_str()?,
26 None => "",
27 };
28
29 let cookie_map = utils::cookie::parse_cookie(cookie_string);
30 let session = sp.open_session(&cookie_map).await?;
31 ctx.session = session;
32 Ok(None)
33 }
34
35 async fn post_process(
36 &self,
37 _req: &mut HttpRequest,
38 res: &mut HttpResonse,
39 ctx: &mut Context,
40 ) -> anyhow::Result<Option<HttpResonse>> {
41 if let (Some(session), Some(sp)) = (&ctx.session, &ctx.session_provider) {
42 sp.save_session(session, res).await?;
43 }
44 Ok(None)
45 }
46}