use crate::error::ServiceError; use crate::State; use bytes::Bytes; use futures::Future; use http_body_util::combinators::BoxBody; use hyper::{body::Incoming, Request, Response}; use serde_yaml::Value; use std::{net::SocketAddr, pin::Pin, sync::Arc}; pub mod accesslog; pub mod auth; pub mod cgi; pub mod debug; pub mod error; pub mod file; pub mod files; pub mod headers; pub mod hosts; pub mod paths; pub mod proxy; pub mod redirect; pub mod switch; pub type NodeRequest = Request; pub type NodeResponse = Response>; pub static MODULES: &[&dyn NodeKind] = &[ &auth::basic::HttpBasicAuthKind, &auth::cookie::CookieAuthKind, &proxy::ProxyKind, &hosts::HostsKind, &paths::PathsKind, &files::FilesKind, &file::FileKind, &accesslog::AccessLogKind, &error::ErrorKind, &headers::HeadersKind, &switch::SwitchKind, &redirect::RedirectKind, &cgi::CgiKind, &debug::DebugKind, ]; 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>>; }