ferron/modules/
default_handler_checks.rs

1use 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}