From e8afa00bafb187a37a2707eb9a5b868f4f5688c0 Mon Sep 17 00:00:00 2001 From: Daniel Gushchyan Date: Thu, 23 Nov 2023 01:30:49 -0800 Subject: [PATCH] Auto-switch port when getting AddrInUse error --- crates/re_web_viewer_server/src/lib.rs | 11 +++++++++++ crates/re_ws_comms/src/server.rs | 14 +++++++++++--- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/crates/re_web_viewer_server/src/lib.rs b/crates/re_web_viewer_server/src/lib.rs index 6e03322ad4e8..f4761fc32984 100644 --- a/crates/re_web_viewer_server/src/lib.rs +++ b/crates/re_web_viewer_server/src/lib.rs @@ -207,9 +207,20 @@ impl WebViewerServer { /// ``` pub fn new(bind_ip: &str, port: WebViewerServerPort) -> Result { let bind_addr = format!("{bind_ip}:{port}").parse()?; + let server = hyper::Server::try_bind(&bind_addr) + .or_else(|hyper_err| { + if hyper_err.to_string().contains("Address already in use") { + let fallback_addr = format!("{bind_ip}:0").parse().map_err(|_err| hyper_err)?; + + hyper::Server::try_bind(&fallback_addr) + } else { + Err(hyper_err) + } + }) .map_err(|err| WebViewerServerError::BindFailed(port, err))? .serve(MakeSvc); + Ok(Self { server }) } diff --git a/crates/re_ws_comms/src/server.rs b/crates/re_ws_comms/src/server.rs index 6b6533d87f2b..3cc5d41d42b6 100644 --- a/crates/re_ws_comms/src/server.rs +++ b/crates/re_ws_comms/src/server.rs @@ -33,9 +33,17 @@ impl RerunServer { pub async fn new(bind_ip: String, port: RerunServerPort) -> Result { let bind_addr = format!("{bind_ip}:{port}"); - let listener = TcpListener::bind(&bind_addr) - .await - .map_err(|err| RerunServerError::BindFailed(port, err))?; + let listener = match TcpListener::bind(&bind_addr).await { + Ok(listener) => listener, + Err(err) if err.kind() == std::io::ErrorKind::AddrInUse => { + let bind_addr = format!("{bind_ip}:0"); + + TcpListener::bind(&bind_addr) + .await + .map_err(|err| RerunServerError::BindFailed(RerunServerPort(0), err))? + } + Err(err) => return Err(RerunServerError::BindFailed(port, err)), + }; let slf = Self { local_addr: listener.local_addr()?,