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(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}