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