ferron/modules/
default_handler_checks.rs1use std::error::Error;
2
3use crate::ferron_common::{
4 ErrorLogger, HyperResponse, RequestData, ResponseData, ServerConfig, ServerModule,
5 ServerModuleHandlers, SocketData,
6};
7use crate::ferron_common::{HyperUpgraded, WithRuntime};
8use async_trait::async_trait;
9use http_body_util::{BodyExt, Empty};
10use hyper::header::HeaderValue;
11use hyper::{header, HeaderMap, Method, Response, StatusCode};
12use hyper_tungstenite::HyperWebsocket;
13use tokio::runtime::Handle;
14
15struct DefaultHandlerChecksModule;
16
17pub fn server_module_init(
18) -> Result<Box<dyn ServerModule + Send + Sync>, Box<dyn Error + Send + Sync>> {
19 Ok(Box::new(DefaultHandlerChecksModule::new()))
20}
21
22impl DefaultHandlerChecksModule {
23 fn new() -> Self {
24 Self
25 }
26}
27
28impl ServerModule for DefaultHandlerChecksModule {
29 fn get_handlers(&self, handle: Handle) -> Box<dyn ServerModuleHandlers + Send> {
30 Box::new(DefaultHandlerChecksModuleHandlers { handle })
31 }
32}
33struct DefaultHandlerChecksModuleHandlers {
34 handle: Handle,
35}
36
37#[async_trait]
38impl ServerModuleHandlers for DefaultHandlerChecksModuleHandlers {
39 async fn request_handler(
40 &mut self,
41 request: RequestData,
42 _config: &ServerConfig,
43 _socket_data: &SocketData,
44 _error_logger: &ErrorLogger,
45 ) -> Result<ResponseData, Box<dyn Error + Send + Sync>> {
46 WithRuntime::new(self.handle.clone(), async move {
47 match request.get_hyper_request().method() {
48 &Method::OPTIONS => Ok(
49 ResponseData::builder(request)
50 .response(
51 Response::builder()
52 .status(StatusCode::NO_CONTENT)
53 .header(
54 header::ALLOW,
55 HeaderValue::from_static("GET, POST, HEAD, OPTIONS"),
56 )
57 .body(Empty::new().map_err(|e| match e {}).boxed())
58 .unwrap_or_default(),
59 )
60 .build(),
61 ),
62 &Method::GET | &Method::POST | &Method::HEAD => Ok(ResponseData::builder(request).build()),
63 _ => {
64 let mut header_map = HeaderMap::new();
65 header_map.insert(
66 header::ALLOW,
67 HeaderValue::from_static("GET, POST, HEAD, OPTIONS"),
68 );
69 Ok(
70 ResponseData::builder(request)
71 .status(StatusCode::METHOD_NOT_ALLOWED)
72 .headers(header_map)
73 .build(),
74 )
75 }
76 }
77 })
78 .await
79 }
80
81 async fn proxy_request_handler(
82 &mut self,
83 request: RequestData,
84 _config: &ServerConfig,
85 _socket_data: &SocketData,
86 _error_logger: &ErrorLogger,
87 ) -> Result<ResponseData, Box<dyn Error + Send + Sync>> {
88 Ok(
89 ResponseData::builder(request)
90 .status(StatusCode::NOT_IMPLEMENTED)
91 .build(),
92 )
93 }
94
95 async fn response_modifying_handler(
96 &mut self,
97 response: HyperResponse,
98 ) -> Result<HyperResponse, Box<dyn Error + Send + Sync>> {
99 Ok(response)
100 }
101
102 async fn proxy_response_modifying_handler(
103 &mut self,
104 response: HyperResponse,
105 ) -> Result<HyperResponse, Box<dyn Error + Send + Sync>> {
106 Ok(response)
107 }
108
109 async fn connect_proxy_request_handler(
110 &mut self,
111 _upgraded_request: HyperUpgraded,
112 _connect_address: &str,
113 _config: &ServerConfig,
114 _socket_data: &SocketData,
115 _error_logger: &ErrorLogger,
116 ) -> Result<(), Box<dyn Error + Send + Sync>> {
117 Ok(())
118 }
119
120 fn does_connect_proxy_requests(&mut self) -> bool {
121 false
122 }
123
124 async fn websocket_request_handler(
125 &mut self,
126 _websocket: HyperWebsocket,
127 _uri: &hyper::Uri,
128 _headers: &hyper::HeaderMap,
129 _config: &ServerConfig,
130 _socket_data: &SocketData,
131 _error_logger: &ErrorLogger,
132 ) -> Result<(), Box<dyn Error + Send + Sync>> {
133 Ok(())
134 }
135
136 fn does_websocket_requests(&mut self, _config: &ServerConfig, _socket_data: &SocketData) -> bool {
137 false
138 }
139}