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 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 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}