Skip to main content

pharos_runtime_core/
render.rs

1use crate::http::HttpRequest;
2
3/// App-neutral request data needed by root render adapters.
4#[derive(Debug, Clone, Eq, PartialEq)]
5pub struct RuntimeRenderRequest {
6    pub method: String,
7    pub absolute_target: String,
8    pub relative_target: String,
9    pub relative_path: String,
10    pub cookie: Option<String>,
11    pub csrf_token: String,
12    pub actor_id: i64,
13    pub has_user: bool,
14}
15
16impl RuntimeRenderRequest {
17    pub fn from_request(
18        request: &HttpRequest,
19        app_base_path: Option<&str>,
20        csrf_token: String,
21        actor_id: i64,
22    ) -> Self {
23        let relative_target = crate::relative_target(app_base_path, &request.target);
24        let relative_path = relative_target.split('?').next().unwrap_or("/").to_owned();
25        Self {
26            method: request.method.clone(),
27            absolute_target: request.target.clone(),
28            relative_target,
29            relative_path,
30            cookie: request.cookie.clone(),
31            csrf_token,
32            actor_id,
33            has_user: actor_id > 0,
34        }
35    }
36
37    pub fn relative_http_request(&self, request: &HttpRequest) -> HttpRequest {
38        let mut relative_request = request.clone();
39        relative_request.target.clone_from(&self.relative_target);
40        relative_request
41    }
42}
43
44#[cfg(test)]
45mod tests {
46    use super::*;
47
48    #[test]
49    fn render_request_preserves_query_and_extracts_path() {
50        let request = HttpRequest {
51            method: "GET".to_owned(),
52            target: "/app/items/?page=2".to_owned(),
53            cookie: Some("pharos_session=abc".to_owned()),
54            ..HttpRequest::default()
55        };
56        let render =
57            RuntimeRenderRequest::from_request(&request, Some("/app"), "csrf-token".to_owned(), 42);
58        assert_eq!(render.relative_target, "/items/?page=2");
59        assert_eq!(render.relative_path, "/items/");
60        assert!(render.has_user);
61        assert_eq!(render.cookie.as_deref(), Some("pharos_session=abc"));
62    }
63
64    #[test]
65    fn render_request_rebases_http_request_without_touching_original() {
66        let request = HttpRequest {
67            method: "POST".to_owned(),
68            target: "/app/save/".to_owned(),
69            body: b"name=value".to_vec(),
70            ..HttpRequest::default()
71        };
72        let render = RuntimeRenderRequest::from_request(&request, Some("/app"), String::new(), 0);
73        let relative = render.relative_http_request(&request);
74        assert_eq!(request.target, "/app/save/");
75        assert_eq!(relative.target, "/save/");
76        assert_eq!(relative.body, b"name=value".to_vec());
77        assert!(!render.has_user);
78    }
79}