Skip to main content

ozone_ws/web/
mod.rs

1use std::net::TcpListener;
2
3use actix_web::dev::Server;
4use actix_web::web::Data;
5use actix_web::{App as ActixApp, HttpServer};
6
7mod health_check;
8mod scan;
9
10pub struct WebServer {
11    server: Server,
12}
13
14struct WebserverData {
15    pub clamav_address: String,
16    pub max_upload_size: usize,
17}
18
19impl WebServer {
20    /// Initialize web server
21    pub async fn init(
22        clamav_address: &str,
23        max_upload_size: usize,
24        web_port: u16,
25    ) -> anyhow::Result<Self> {
26        info!("webserver initialized");
27        info!("protobuf url: {clamav_address}");
28        info!("web port: {web_port}");
29
30        let listener = TcpListener::bind(format!("0.0.0.0:{web_port}"))?;
31
32        let server = {
33            let clamav_address = clamav_address.to_string();
34            HttpServer::new(move || {
35                let web_data = Data::new(WebserverData {
36                    clamav_address: clamav_address.to_string(),
37                    max_upload_size,
38                });
39                ActixApp::new()
40                    .service(health_check::check_action)
41                    .service(scan::scan)
42                    .app_data(web_data)
43            })
44            .listen(listener)?
45            .run()
46        };
47
48        info!("web server initialized");
49        Ok(Self { server })
50    }
51
52    /// Run web server
53    pub async fn run(self) -> anyhow::Result<()> {
54        info!("running web server");
55        self.server.await?;
56        info!("web server stopped");
57        Ok(())
58    }
59}