use crate::web_server::WebServerSettings;
use actix_web::middleware::Logger;
use actix_web::{get, App, HttpServer, Responder};
use log::info;
#[get("/health")]
async fn health() -> impl Responder {
"Ok"
}
pub async fn start_web_server(
web_server_settings: WebServerSettings,
configure: fn(&mut actix_web::web::ServiceConfig),
) {
info!("创建Web服务器({:?})并运行...", web_server_settings);
let port = web_server_settings.port.unwrap();
let listens = web_server_settings.listen.unwrap_or_default();
let support_health_check = web_server_settings.support_health_check;
let mut server = HttpServer::new(move || {
let mut app = App::new().wrap(Logger::default()).configure(configure);
if support_health_check {
app = app.service(health);
}
app
});
if let Some(binds) = web_server_settings.bind {
for bind in binds {
server = server
.bind((bind.clone(), port))
.expect(&format!("绑定地址失败: {}", bind));
}
} else if listens.is_empty() {
server = server.bind(("::", port)).expect("绑定地址失败: \"::\"");
}
for listen in listens {
let parts: Vec<&str> = listen.rsplitn(2, ':').collect();
match parts.len() {
1 => {
let port: u16 = listen
.parse()
.expect(&format!("listen的端口解析失败: {}", listen));
server = server.bind(("::", port)).unwrap();
}
2 => {
let port: u16 = parts[0]
.parse()
.expect(&format!("listen的端口解析失败: {}", listen));
let mut bind = parts[1].to_string();
if bind.starts_with('[') && bind.ends_with(']') {
bind = bind[1..bind.len() - 1].to_string();
}
server = server.bind((bind, port)).unwrap();
}
_ => panic!("listen格式错误: {}", listen),
}
}
let addrs = server.addrs();
for addr in addrs {
info!("服务器监听地址: {}", addr);
}
server.run().await.expect("服务器启动失败");
}