diff --git a/tonic/src/request.rs b/tonic/src/request.rs index 46a2d486d..64dd042cf 100644 --- a/tonic/src/request.rs +++ b/tonic/src/request.rs @@ -202,8 +202,8 @@ impl Request { /// Get the remote address of this connection. /// /// This will return `None` if the `IO` type used - /// does not implement `Connected`. This currently, - /// only works on the server side. + /// does not implement `Connected` or when using a unix domain socket. + /// This currently only works on the server side. pub fn remote_addr(&self) -> Option { #[cfg(feature = "transport")] { diff --git a/tonic/src/transport/server/mod.rs b/tonic/src/transport/server/mod.rs index adba6f896..6a391cd62 100644 --- a/tonic/src/transport/server/mod.rs +++ b/tonic/src/transport/server/mod.rs @@ -6,6 +6,8 @@ mod recover_error; #[cfg(feature = "tls")] #[cfg_attr(docsrs, doc(cfg(feature = "tls")))] mod tls; +#[cfg(unix)] +mod unix; pub use conn::{Connected, TcpConnectInfo}; #[cfg(feature = "tls")] @@ -17,6 +19,9 @@ pub use conn::TlsConnectInfo; #[cfg(feature = "tls")] use super::service::TlsAcceptor; +#[cfg(unix)] +pub use unix::UdsConnectInfo; + use incoming::TcpIncoming; #[cfg(feature = "tls")] diff --git a/tonic/src/transport/server/unix.rs b/tonic/src/transport/server/unix.rs new file mode 100644 index 000000000..31454b7d1 --- /dev/null +++ b/tonic/src/transport/server/unix.rs @@ -0,0 +1,31 @@ +use super::Connected; +use std::sync::Arc; + +/// Connection info for Unix domain socket streams. +/// +/// This type will be accessible through [request extensions][ext] if you're using +/// a unix stream. +/// +/// See [Connected] for more details. +/// +/// [ext]: crate::Request::extensions +/// [Connected]: crate::transport::server::Connected +#[cfg_attr(docsrs, doc(cfg(unix)))] +#[derive(Clone, Debug)] +pub struct UdsConnectInfo { + /// Peer address. This will be "unnamed" for client unix sockets. + pub peer_addr: Option>, + /// Process credentials for the unix socket. + pub peer_cred: Option, +} + +impl Connected for tokio::net::UnixStream { + type ConnectInfo = UdsConnectInfo; + + fn connect_info(&self) -> Self::ConnectInfo { + UdsConnectInfo { + peer_addr: self.peer_addr().ok().map(Arc::new), + peer_cred: self.peer_cred().ok(), + } + } +}