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(header::ALLOW, "GET, POST, HEAD, OPTIONS")
54 .body(Empty::new().map_err(|e| match e {}).boxed())
55 .unwrap_or_default(),
56 )
57 .build(),
58 ),
59 &Method::GET | &Method::POST | &Method::HEAD => Ok(ResponseData::builder(request).build()),
60 _ => {
61 let mut header_map = HeaderMap::new();
62 if let Ok(header_value) = HeaderValue::from_str("GET, POST, HEAD, OPTIONS") {
63 header_map.insert(header::ALLOW, header_value);
64 };
65 Ok(
66 ResponseData::builder(request)
67 .status(StatusCode::METHOD_NOT_ALLOWED)
68 .headers(header_map)
69 .build(),
70 )
71 }
72 }
73 })
74 .await
75 }
76
77 async fn proxy_request_handler(
78 &mut self,
79 request: RequestData,
80 _config: &ServerConfig,
81 _socket_data: &SocketData,
82 _error_logger: &ErrorLogger,
83 ) -> Result<ResponseData, Box<dyn Error + Send + Sync>> {
84 Ok(
85 ResponseData::builder(request)
86 .status(StatusCode::NOT_IMPLEMENTED)
87 .build(),
88 )
89 }
90
91 async fn response_modifying_handler(
92 &mut self,
93 response: HyperResponse,
94 ) -> Result<HyperResponse, Box<dyn Error + Send + Sync>> {
95 Ok(response)
96 }
97
98 async fn proxy_response_modifying_handler(
99 &mut self,
100 response: HyperResponse,
101 ) -> Result<HyperResponse, Box<dyn Error + Send + Sync>> {
102 Ok(response)
103 }
104
105 async fn connect_proxy_request_handler(
106 &mut self,
107 _upgraded_request: HyperUpgraded,
108 _connect_address: &str,
109 _config: &ServerConfig,
110 _socket_data: &SocketData,
111 _error_logger: &ErrorLogger,
112 ) -> Result<(), Box<dyn Error + Send + Sync>> {
113 Ok(())
114 }
115
116 fn does_connect_proxy_requests(&mut self) -> bool {
117 false
118 }
119
120 async fn websocket_request_handler(
121 &mut self,
122 _websocket: HyperWebsocket,
123 _uri: &hyper::Uri,
124 _config: &ServerConfig,
125 _socket_data: &SocketData,
126 _error_logger: &ErrorLogger,
127 ) -> Result<(), Box<dyn Error + Send + Sync>> {
128 Ok(())
129 }
130
131 fn does_websocket_requests(&mut self, _config: &ServerConfig, _socket_data: &SocketData) -> bool {
132 false
133 }
134}