feat(transport): Addlocal_addr to Request o (#1327)
This commit is contained in:
@@ -14,6 +14,7 @@ async fn getting_connect_info() {
|
|||||||
#[tonic::async_trait]
|
#[tonic::async_trait]
|
||||||
impl test_server::Test for Svc {
|
impl test_server::Test for Svc {
|
||||||
async fn unary_call(&self, req: Request<Input>) -> Result<Response<Output>, Status> {
|
async fn unary_call(&self, req: Request<Input>) -> Result<Response<Output>, Status> {
|
||||||
|
assert!(req.local_addr().is_some());
|
||||||
assert!(req.remote_addr().is_some());
|
assert!(req.remote_addr().is_some());
|
||||||
assert!(req.extensions().get::<TcpConnectInfo>().is_some());
|
assert!(req.extensions().get::<TcpConnectInfo>().is_some());
|
||||||
|
|
||||||
@@ -73,6 +74,7 @@ pub mod unix {
|
|||||||
let conn_info = req.extensions().get::<UdsConnectInfo>().unwrap();
|
let conn_info = req.extensions().get::<UdsConnectInfo>().unwrap();
|
||||||
|
|
||||||
// Client-side unix sockets are unnamed.
|
// Client-side unix sockets are unnamed.
|
||||||
|
assert!(req.local_addr().is_none());
|
||||||
assert!(req.remote_addr().is_none());
|
assert!(req.remote_addr().is_none());
|
||||||
assert!(conn_info.peer_addr.as_ref().unwrap().is_unnamed());
|
assert!(conn_info.peer_addr.as_ref().unwrap().is_unnamed());
|
||||||
// This should contain process credentials for the client socket.
|
// This should contain process credentials for the client socket.
|
||||||
|
|||||||
@@ -203,6 +203,40 @@ impl<T> Request<T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Get the local address of this connection.
|
||||||
|
///
|
||||||
|
/// This will return `None` if the `IO` type used
|
||||||
|
/// does not implement `Connected` or when using a unix domain socket.
|
||||||
|
/// This currently only works on the server side.
|
||||||
|
pub fn local_addr(&self) -> Option<SocketAddr> {
|
||||||
|
#[cfg(feature = "transport")]
|
||||||
|
{
|
||||||
|
#[cfg(feature = "tls")]
|
||||||
|
{
|
||||||
|
self.extensions()
|
||||||
|
.get::<TcpConnectInfo>()
|
||||||
|
.and_then(|i| i.local_addr())
|
||||||
|
.or_else(|| {
|
||||||
|
self.extensions()
|
||||||
|
.get::<TlsConnectInfo<TcpConnectInfo>>()
|
||||||
|
.and_then(|i| i.get_ref().local_addr())
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(not(feature = "tls"))]
|
||||||
|
{
|
||||||
|
self.extensions()
|
||||||
|
.get::<TcpConnectInfo>()
|
||||||
|
.and_then(|i| i.local_addr())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(not(feature = "transport"))]
|
||||||
|
{
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Get the remote address of this connection.
|
/// Get the remote address of this connection.
|
||||||
///
|
///
|
||||||
/// This will return `None` if the `IO` type used
|
/// This will return `None` if the `IO` type used
|
||||||
|
|||||||
@@ -68,10 +68,16 @@ pub trait Connected {
|
|||||||
/// [ext]: crate::Request::extensions
|
/// [ext]: crate::Request::extensions
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct TcpConnectInfo {
|
pub struct TcpConnectInfo {
|
||||||
|
local_addr: Option<SocketAddr>,
|
||||||
remote_addr: Option<SocketAddr>,
|
remote_addr: Option<SocketAddr>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl TcpConnectInfo {
|
impl TcpConnectInfo {
|
||||||
|
/// Return the local address the IO resource is connected.
|
||||||
|
pub fn local_addr(&self) -> Option<SocketAddr> {
|
||||||
|
self.local_addr
|
||||||
|
}
|
||||||
|
|
||||||
/// Return the remote address the IO resource is connected too.
|
/// Return the remote address the IO resource is connected too.
|
||||||
pub fn remote_addr(&self) -> Option<SocketAddr> {
|
pub fn remote_addr(&self) -> Option<SocketAddr> {
|
||||||
self.remote_addr
|
self.remote_addr
|
||||||
@@ -83,6 +89,7 @@ impl Connected for AddrStream {
|
|||||||
|
|
||||||
fn connect_info(&self) -> Self::ConnectInfo {
|
fn connect_info(&self) -> Self::ConnectInfo {
|
||||||
TcpConnectInfo {
|
TcpConnectInfo {
|
||||||
|
local_addr: Some(self.local_addr()),
|
||||||
remote_addr: Some(self.remote_addr()),
|
remote_addr: Some(self.remote_addr()),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -93,6 +100,7 @@ impl Connected for TcpStream {
|
|||||||
|
|
||||||
fn connect_info(&self) -> Self::ConnectInfo {
|
fn connect_info(&self) -> Self::ConnectInfo {
|
||||||
TcpConnectInfo {
|
TcpConnectInfo {
|
||||||
|
local_addr: self.local_addr().ok(),
|
||||||
remote_addr: self.peer_addr().ok(),
|
remote_addr: self.peer_addr().ok(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user