httpward_core/core/context/
context.rs1use std::net::{IpAddr, SocketAddr};
2use std::sync::Arc;
3use crate::core::server_models::SiteManager;
4use crate::core::server_models::server_instance::ServerInstance;
5use rama::http::headers::ContentType;
6use rama::http::HeaderMap;
7use crate::core::context::ExtensionsMap;
8
9
10
11#[derive(Debug, Clone)]
12pub struct HttpWardContext {
13 pub client_ip: IpAddr,
14 pub current_site: Option<Arc<SiteManager>>,
15 pub server_instance: Arc<ServerInstance>,
16 pub request_content_type: ContentType,
17 pub response_content_type: ContentType,
18 pub header_fp: Option<String>,
19 pub ja4_fp: Option<String>,
20 pub request_headers: HeaderMap,
22 pub extensions: ExtensionsMap,
25}
26
27impl HttpWardContext {
28 pub fn new(client_addr: SocketAddr, server_instance: Arc<ServerInstance>) -> Self {
29 let client_ip = client_addr.ip();
30 Self {
31 client_ip,
32 request_content_type: ContentType::text(),
33 response_content_type: ContentType::text(),
34 current_site: None,
35 server_instance,
36 header_fp: None,
37 ja4_fp: None,
38 request_headers: HeaderMap::new(),
39 extensions: ExtensionsMap::new(),
40 }
41 }
42
43 pub fn set_current_site(&mut self, site_manager: Arc<SiteManager>) {
45 self.current_site = Some(site_manager);
46 }
47
48 pub fn get_route(&self, path: &str) -> Result<Option<crate::core::server_models::MatchedRoute>, crate::core::server_models::SiteManagerError> {
50 match &self.current_site {
51 Some(site_manager) => {
52 match site_manager.get_route(path) {
53 Ok(route) => Ok(Some(route)),
54 Err(crate::core::server_models::SiteManagerError::NoMatch) => Ok(None),
55 Err(e) => Err(e),
56 }
57 }
58 None => Ok(None),
59 }
60 }
61
62 pub fn has_current_site(&self) -> bool {
64 self.current_site.is_some()
65 }
66
67 pub fn site_name(&self) -> Option<&str> {
69 self.current_site.as_ref().map(|sm| sm.site_name())
70 }
71}