pharos_runtime_core/
render.rs1use crate::http::HttpRequest;
2
3#[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}