prevent panic when parsing invalid address without port

This commit is contained in:
Taqman-probe
2026-06-06 22:32:32 +09:00
parent 3c99ed0c44
commit 735d605f6d

View File

@@ -18,6 +18,7 @@ use prometheus::{gather, Encoder, TextEncoder};
use serde::Serialize; use serde::Serialize;
use signal_hook::{consts::SIGQUIT, iterator::Signals}; use signal_hook::{consts::SIGQUIT, iterator::Signals};
use std::collections::HashMap; use std::collections::HashMap;
use std::net::SocketAddr;
use std::sync::Arc; use std::sync::Arc;
use std::time::{Duration, SystemTime, UNIX_EPOCH}; use std::time::{Duration, SystemTime, UNIX_EPOCH};
use tokio::net::TcpListener; use tokio::net::TcpListener;
@@ -67,16 +68,14 @@ pub async fn run_server(config: &APIUpstreamProvider, mut to_return: Sender<Conf
let mut static_handle: Option<tokio::task::JoinHandle<()>> = None; let mut static_handle: Option<tokio::task::JoinHandle<()>> = None;
if let (Some(address), Some(folder)) = (&config.file_server_address, &config.file_server_folder) { if let (Some(address), Some(folder)) = (&config.file_server_address, &config.file_server_folder) {
port_is_available("File Server", &address).await; let static_listen = port_is_available("File Server", &address).await;
let static_files = ServeDir::new(folder); let static_files = ServeDir::new(folder);
let static_serve: Router = Router::new().fallback_service(static_files); let static_serve: Router = Router::new().fallback_service(static_files);
let static_listen = TcpListener::bind(address).await.unwrap();
// drop(tokio::spawn(async move { axum::serve(static_listen, static_serve).await.unwrap() })); // drop(tokio::spawn(async move { axum::serve(static_listen, static_serve).await.unwrap() }));
static_handle = Some(tokio::spawn(async move { axum::serve(static_listen, static_serve).await.unwrap() })) static_handle = Some(tokio::spawn(async move { axum::serve(static_listen, static_serve).await.unwrap() }))
} }
port_is_available("Config API", &config.address).await; let listener = port_is_available("Config API", &config.address).await;
let listener = TcpListener::bind(config.address.clone()).await.unwrap();
info!("Starting the API server on: {}", config.address); info!("Starting the API server on: {}", config.address);
let api_server = tokio::spawn(async move { axum::serve(listener, app).await.unwrap() }); let api_server = tokio::spawn(async move { axum::serve(listener, app).await.unwrap() });
@@ -227,20 +226,18 @@ async fn status(State(st): State<AppState>, Query(params): Query<HashMap<String,
.unwrap() .unwrap()
} }
pub async fn port_is_available(name: &str, address: &str) { pub async fn port_is_available(name: &str, address: &str) -> TcpListener {
let addr_port = address.split(":").collect::<Vec<&str>>(); let addr: SocketAddr = address.parse().expect("Invalid address format");
let t = Duration::from_secs(2); let t = Duration::from_secs(2);
let mut a = addr_port[0]; //if addr.ip() == IpAddr::V4(Ipv4Addr::UNSPECIFIED) {
if address == "0.0.0.0" { // addr.set_ip(IpAddr::V4(Ipv4Addr::LOCALHOST));
a = "127.0.0.1"; //}
} let p = addr.port();
let p = addr_port[1].parse::<u16>().unwrap();
loop { loop {
match TcpListener::bind((a, p)).await { match TcpListener::bind(addr).await {
Ok(_) => { Ok(listener) => {
break; return listener;
} }
Err(_) => { Err(_) => {
warn!("{} port is not available: {} will try again in {:?}", name, p, t); warn!("{} port is not available: {} will try again in {:?}", name, p, t);