From 735d605f6d8b48bf9db9661d3d4c7f34392d8fb7 Mon Sep 17 00:00:00 2001 From: Taqman-probe Date: Sat, 6 Jun 2026 22:32:32 +0900 Subject: [PATCH 1/2] prevent panic when parsing invalid address without port --- src/web/webserver.rs | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/src/web/webserver.rs b/src/web/webserver.rs index 81784e0..50eb108 100644 --- a/src/web/webserver.rs +++ b/src/web/webserver.rs @@ -18,6 +18,7 @@ use prometheus::{gather, Encoder, TextEncoder}; use serde::Serialize; use signal_hook::{consts::SIGQUIT, iterator::Signals}; use std::collections::HashMap; +use std::net::SocketAddr; use std::sync::Arc; use std::time::{Duration, SystemTime, UNIX_EPOCH}; use tokio::net::TcpListener; @@ -67,16 +68,14 @@ pub async fn run_server(config: &APIUpstreamProvider, mut to_return: Sender> = None; 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_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() })); 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 = TcpListener::bind(config.address.clone()).await.unwrap(); + let listener = port_is_available("Config API", &config.address).await; info!("Starting the API server on: {}", config.address); let api_server = tokio::spawn(async move { axum::serve(listener, app).await.unwrap() }); @@ -227,20 +226,18 @@ async fn status(State(st): State, Query(params): Query>(); +pub async fn port_is_available(name: &str, address: &str) -> TcpListener { + let addr: SocketAddr = address.parse().expect("Invalid address format"); let t = Duration::from_secs(2); - let mut a = addr_port[0]; - if address == "0.0.0.0" { - a = "127.0.0.1"; - } - let p = addr_port[1].parse::().unwrap(); - + //if addr.ip() == IpAddr::V4(Ipv4Addr::UNSPECIFIED) { + // addr.set_ip(IpAddr::V4(Ipv4Addr::LOCALHOST)); + //} + let p = addr.port(); loop { - match TcpListener::bind((a, p)).await { - Ok(_) => { - break; + match TcpListener::bind(addr).await { + Ok(listener) => { + return listener; } Err(_) => { warn!("{} port is not available: {} will try again in {:?}", name, p, t); From c09efab9fdeeb597778323347a455a3901973e39 Mon Sep 17 00:00:00 2001 From: Taqman-probe Date: Sun, 7 Jun 2026 00:47:43 +0900 Subject: [PATCH 2/2] prevent panic when parsing invalid address without port --- src/web/webserver.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/web/webserver.rs b/src/web/webserver.rs index 50eb108..51445ae 100644 --- a/src/web/webserver.rs +++ b/src/web/webserver.rs @@ -19,6 +19,7 @@ use serde::Serialize; use signal_hook::{consts::SIGQUIT, iterator::Signals}; use std::collections::HashMap; use std::net::SocketAddr; +use std::str::FromStr; use std::sync::Arc; use std::time::{Duration, SystemTime, UNIX_EPOCH}; use tokio::net::TcpListener; @@ -227,7 +228,8 @@ async fn status(State(st): State, Query(params): Query TcpListener { - let addr: SocketAddr = address.parse().expect("Invalid address format"); + let addr = SocketAddr::from_str(address) + .unwrap_or_else(|e| panic!("{}: Invalid address format: {:?}", name, e)); let t = Duration::from_secs(2); //if addr.ip() == IpAddr::V4(Ipv4Addr::UNSPECIFIED) {