/* This file is part of gnix (https://codeberg.org/metamuffin/gnix) which is licensed under the GNU Affero General Public License (version 3); see /COPYING. Copyright (C) 2025 metamuffin */ 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 delay; mod error; mod fallback; mod file; mod files; mod headers; mod hosts; mod inspect; mod limits; mod loadbalance; mod paths; mod proxy; mod ratelimit; 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, &limits::LimitsKind, &delay::DelayKind, &ratelimit::RatelimitKind, ]; pub struct NodeContext { pub state: Arc, pub addr: SocketAddr, pub secure: bool, pub listen_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>>; }