use crate::error::ServiceError; use crate::State; use accesslog::AccessLogKind; use auth::{basic::HttpBasicAuthKind, cookie::CookieAuthKind}; use bytes::Bytes; use error::ErrorKind; use file::FileKind; use files::FilesKind; use futures::Future; use headers::HeadersKind; use hosts::HostsKind; use http_body_util::combinators::BoxBody; use hyper::{body::Incoming, Request, Response}; use proxy::ProxyKind; use redirect::RedirectKind; use serde_yaml::Value; use std::{net::SocketAddr, pin::Pin, sync::Arc}; use switch::SwitchKind; pub mod accesslog; pub mod auth; pub mod error; pub mod file; pub mod files; pub mod headers; pub mod hosts; pub mod proxy; pub mod redirect; pub mod switch; pub type NodeRequest = Request; pub type NodeResponse = Response>; pub static MODULES: &[&dyn NodeKind] = &[ &HttpBasicAuthKind, &CookieAuthKind, &ProxyKind, &HostsKind, &FilesKind, &FileKind, &AccessLogKind, &ErrorKind, &HeadersKind, &SwitchKind, &RedirectKind, ]; pub struct NodeContext { pub state: Arc, pub addr: SocketAddr, } pub trait NodeKind: Send + Sync + 'static { fn name(&self) -> &'static str; fn instanciate(&self, config: Value) -> anyhow::Result>; } pub trait Node: Send + Sync + 'static { fn handle<'a>( &'a self, context: &'a mut NodeContext, request: NodeRequest, ) -> Pin> + Send + Sync + 'a>>; }