simple_api/
middlewares.rs

1use 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}