simple_proxy 0.1.1

Simple proxy with middlewares, easy to customize, easy to use.
Documentation
use hyper::{Body, Error, Request, Response};
use proxy::error::MiddlewareError;
use proxy::service::State;

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,
    _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,
    _req: &mut Response<Body>,
    _req_id: u64,
    _state: &State,
  ) -> Result<MiddlewareResult, MiddlewareError> {
    Ok(Next)
  }
}