Skip to main content

httpward_core/core/context/
context.rs

1use 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    /// Request headers that can be modified by middleware during pipe processing
21    pub request_headers: HeaderMap,
22    /// Extensions map for storing arbitrary data during request lifetime.
23    /// Allows middleware to share serialized objects without modifying context structure.
24    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    /// Set the current site manager
44    pub fn set_current_site(&mut self, site_manager: Arc<SiteManager>) {
45        self.current_site = Some(site_manager);
46    }
47    
48    /// Get route for the given path using current site manager
49    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    /// Check if context has a current site
63    pub fn has_current_site(&self) -> bool {
64        self.current_site.is_some()
65    }
66    
67    /// Get site name if available
68    pub fn site_name(&self) -> Option<&str> {
69        self.current_site.as_ref().map(|sm| sm.site_name())
70    }
71}