diff --git a/.bleep b/.bleep index 21f357840..700b347e4 100644 --- a/.bleep +++ b/.bleep @@ -1 +1 @@ -cab68d4c24c82270ceffef312efc99a3bbc8aaa9 \ No newline at end of file +e8c45299beef05e26f59b620d998b98d31139aac \ No newline at end of file diff --git a/pingora-core/src/protocols/l4/socket.rs b/pingora-core/src/protocols/l4/socket.rs index 186fbecb3..93d334ed5 100644 --- a/pingora-core/src/protocols/l4/socket.rs +++ b/pingora-core/src/protocols/l4/socket.rs @@ -15,6 +15,7 @@ //! Generic socket type use crate::{Error, OrErr}; +use log::warn; use nix::sys::socket::{getpeername, getsockname, SockaddrStorage}; use std::cmp::Ordering; use std::hash::{Hash, Hasher}; @@ -174,14 +175,23 @@ impl std::str::FromStr for SocketAddr { type Err = Box; // This is very basic parsing logic, it might treat invalid IP:PORT str as UDS path - // TODO: require UDS to have some prefix fn from_str(s: &str) -> Result { - match StdSockAddr::from_str(s) { - Ok(addr) => Ok(SocketAddr::Inet(addr)), - Err(_) => { - let uds_socket = StdUnixSockAddr::from_pathname(s) - .or_err(crate::BindError, "invalid UDS path")?; - Ok(SocketAddr::Unix(uds_socket)) + if s.starts_with("unix:") { + // format unix:/tmp/server.socket + let path = s.trim_start_matches("unix:"); + let uds_socket = StdUnixSockAddr::from_pathname(path) + .or_err(crate::BindError, "invalid UDS path")?; + Ok(SocketAddr::Unix(uds_socket)) + } else { + match StdSockAddr::from_str(s) { + Ok(addr) => Ok(SocketAddr::Inet(addr)), + Err(_) => { + // Try to parse as UDS for backward compatibility + let uds_socket = StdUnixSockAddr::from_pathname(s) + .or_err(crate::BindError, "invalid UDS path")?; + warn!("Raw Unix domain socket path support will be deprecated, add 'unix:' prefix instead"); + Ok(SocketAddr::Unix(uds_socket)) + } } } } @@ -246,4 +256,10 @@ mod test { let uds: SocketAddr = "/tmp/my.sock".parse().unwrap(); assert!(uds.as_unix().is_some()); } + + #[test] + fn parse_uds_with_prefix() { + let uds: SocketAddr = "unix:/tmp/my.sock".parse().unwrap(); + assert!(uds.as_unix().is_some()); + } }