sys/sysmod/http/
priv_index.rs1use std::collections::BTreeMap;
2
3use super::{HttpConfig, priv_camera};
4use actix_web::{HttpRequest, HttpResponse, Responder, http::header::ContentType, web};
5use utils::netutil;
6
7pub(super) fn server_config() -> impl Fn(&mut web::ServiceConfig, &HttpConfig) + Clone {
8 move |cfg: &mut web::ServiceConfig, http_config: &HttpConfig| {
9 if !http_config.priv_enabled {
10 return;
11 }
12 cfg.service(index_get);
13 cfg.service(priv_camera::take_post);
14 cfg.service(priv_camera::history_get);
15 cfg.service(priv_camera::archive_get);
16 cfg.service(priv_camera::history_post);
17 cfg.service(priv_camera::archive_post);
18 cfg.service(priv_camera::pic_history_get);
19 cfg.service(priv_camera::pic_archive_get);
20 cfg.service(priv_camera::index_get);
21 }
22}
23
24#[actix_web::get("/")]
25async fn index_get(req: HttpRequest) -> impl Responder {
26 let mut sorted = BTreeMap::new();
27 for (k, v) in req.headers() {
28 sorted.insert(k.as_str(), v.to_str().unwrap_or_default());
29 }
30
31 let mut header_str = String::new();
32 for (k, v) in sorted {
33 let k = netutil::html_escape(k);
34 let v = netutil::html_escape(v);
35 header_str.push_str(&format!(" <li>{k}: {v}</li>\n"));
36 }
37
38 let body = format!(
39 r#"<!DOCTYPE html>
40<html lang="en">
41 <head>
42 <title>(Privileged) House Management System Web Interface</title>
43 </head>
44 <body>
45 <h1>(Privileged) House Management System Web Interface</h1>
46
47 <h2>Caution</h2>
48 <p>This backend program does not provide any security schemes.</p>
49 <p>Check again the front server settings for client authentication.</p>
50
51 <h2>HTTP Headers</h2>
52 <ul>
53 {}
54 </ul>
55
56 <h2>Camera</h2>
57 <p><a href="./camera/">Camera Main Page</a></p>
58 </body>
59</html>
60"#,
61 header_str.trim()
62 );
63
64 HttpResponse::Ok()
65 .content_type(ContentType::html())
66 .body(body)
67}