simple_proxy/proxy/
middleware.rs1use crate::proxy::error::MiddlewareError;
2use crate::proxy::service::{ServiceContext, State};
3use hyper::{Body, Error, Request, Response};
4
5pub enum MiddlewareResult {
6    RespondWith(Response<hyper::Body>),
7    Next,
8}
9
10use self::MiddlewareResult::Next;
11
12pub trait Middleware {
13    fn name() -> String
14    where
15        Self: Sized;
16
17    fn get_name(&self) -> String
18    where
19        Self: Sized,
20    {
21        Self::name()
22    }
23
24    fn set_state(&self, req_id: u64, state: &State, data: String) -> Result<(), MiddlewareError>
25    where
26        Self: Sized,
27    {
28        let mut state = state.lock()?;
29        state.insert((self.get_name(), req_id), data);
30        Ok(())
31    }
32
33    fn state(req_id: u64, state: &State) -> Result<Option<String>, MiddlewareError>
34    where
35        Self: Sized,
36    {
37        let state = state.lock()?;
38        debug!("State length: {}", state.len());
39        let state = match state.get(&(Self::name(), req_id)) {
40            None => None,
41            Some(state) => Some(state.to_string()),
42        };
43
44        debug!(
45            "[{}] State for {}: {:?}",
46            Self::name(),
47            &req_id.to_string()[..6],
48            state
49        );
50
51        Ok(state)
52    }
53
54    fn get_state(&self, req_id: u64, state: &State) -> Result<Option<String>, MiddlewareError>
55    where
56        Self: Sized,
57    {
58        Self::state(req_id, state)
59    }
60
61    fn before_request(
62        &mut self,
63        _req: &mut Request<Body>,
64        _ctx: &ServiceContext,
65        _state: &State,
66    ) -> Result<MiddlewareResult, MiddlewareError> {
67        Ok(Next)
68    }
69
70    fn after_request(
71        &mut self,
72        _res: Option<&mut Response<Body>>,
73        _ctx: &ServiceContext,
74        _state: &State,
75    ) -> Result<MiddlewareResult, MiddlewareError> {
76        Ok(Next)
77    }
78
79    fn request_failure(
80        &mut self,
81        _err: &Error,
82        _ctx: &ServiceContext,
83        _state: &State,
84    ) -> Result<MiddlewareResult, MiddlewareError> {
85        Ok(Next)
86    }
87
88    fn request_success(
89        &mut self,
90        _res: &mut Response<Body>,
91        _ctx: &ServiceContext,
92        _state: &State,
93    ) -> Result<MiddlewareResult, MiddlewareError> {
94        Ok(Next)
95    }
96}