1use std::collections::HashSet;
2use std::error::Error;
3use std::net::SocketAddr;
4use std::sync::Arc;
5
6use async_trait::async_trait;
7use bytes::Bytes;
8use http_body_util::combinators::BoxBody;
9use hyper::{HeaderMap, Request, Response, StatusCode, Uri};
10
11use crate::config::ServerConfiguration;
12use crate::logging::ErrorLogger;
13
14pub trait ModuleLoader {
16 fn load_module(
18 &mut self,
19 config: &ServerConfiguration,
20 global_config: Option<&ServerConfiguration>,
21 secondary_runtime: &tokio::runtime::Runtime,
22 ) -> Result<Arc<dyn Module + Send + Sync>, Box<dyn Error + Send + Sync>>;
23
24 fn get_requirements(&self) -> Vec<&'static str> {
26 vec![]
27 }
28
29 #[allow(unused_variables)]
31 fn validate_configuration(
32 &self,
33 config: &ServerConfiguration,
34 used_properties: &mut HashSet<String>,
35 ) -> Result<(), Box<dyn Error + Send + Sync>> {
36 Ok(())
37 }
38}
39
40pub trait Module {
42 fn get_module_handlers(&self) -> Box<dyn ModuleHandlers>;
44}
45
46#[async_trait(?Send)]
48pub trait ModuleHandlers {
49 async fn request_handler(
51 &mut self,
52 request: Request<BoxBody<Bytes, std::io::Error>>,
53 config: &ServerConfiguration,
54 socket_data: &SocketData,
55 error_logger: &ErrorLogger,
56 ) -> Result<ResponseData, Box<dyn Error + Send + Sync>>;
57
58 async fn response_modifying_handler(
60 &mut self,
61 response: Response<BoxBody<Bytes, std::io::Error>>,
62 ) -> Result<Response<BoxBody<Bytes, std::io::Error>>, Box<dyn Error>> {
63 Ok(response)
64 }
65}
66
67pub struct SocketData {
70 pub remote_addr: SocketAddr,
72
73 pub local_addr: SocketAddr,
75
76 pub encrypted: bool,
78}
79
80#[derive(Clone)]
82pub struct RequestData {
83 pub auth_user: Option<String>,
85
86 pub original_url: Option<Uri>,
88
89 #[allow(dead_code)]
91 pub error_status_code: Option<StatusCode>,
92}
93
94pub struct ResponseData {
96 pub request: Option<Request<BoxBody<Bytes, std::io::Error>>>,
98
99 pub response: Option<Response<BoxBody<Bytes, std::io::Error>>>,
101
102 pub response_status: Option<StatusCode>,
104
105 pub response_headers: Option<HeaderMap>,
107
108 pub new_remote_address: Option<SocketAddr>,
110}