From 92bbeb11390a6e6205fb577571f4307f0627eb83 Mon Sep 17 00:00:00 2001 From: Yuchen Wu Date: Fri, 21 Jun 2024 16:04:22 -0700 Subject: [PATCH] Parse UDS with prefix Now UDS can be parsed from string with prefix "unix:". The raw path support will be deprecated. From https://github.com/cloudflare/pingora/pull/141 Co-authored-by: blackanger --- .bleep | 2 +- pingora-core/src/protocols/l4/socket.rs | 30 +++++++++++++++++++------ 2 files changed, 24 insertions(+), 8 deletions(-) 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()); + } }