use crate::error::ServiceError; use crate::State; use bytes::Bytes; use futures::Future; use http_body_util::combinators::BoxBody; use hyper::{Request, Response}; use serde_yml::Value; use std::{net::SocketAddr, pin::Pin, sync::Arc}; mod accesslog; mod auth; mod cache; mod cgi; mod debug; mod error; pub mod fallback; mod file; mod files; mod headers; mod hosts; mod inspect; mod loadbalance; mod paths; mod proxy; mod redirect; mod switch; mod upgrade_insecure; pub type NodeRequest = Request>; pub type NodeResponse = Response>; pub static MODULES: &[&dyn NodeKind] = &[ &auth::basic::HttpBasicAuthKind, &auth::cookie::CookieAuthKind, &auth::openid::OpenIDAuthKind, &proxy::ProxyKind, &hosts::HostsKind, &paths::PathsKind, &files::FilesKind, &file::FileKind, &accesslog::AccessLogKind, &error::ErrorKind, &headers::HeadersKind, &switch::SwitchKind, &redirect::RedirectKind, &cgi::CgiKind, &debug::DebugKind, &cache::CacheKind, &loadbalance::LoadBalanceKind, &upgrade_insecure::UpgradeInsecureKind, &inspect::InspectKind, &fallback::FallbackKind, ]; pub struct NodeContext { pub state: Arc, pub addr: SocketAddr, pub secure: bool, } 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>>; }