Skip to content

Commit 5122fe7

Browse files
committed
refactor: implement RemoteAddr trait
1 parent 6562438 commit 5122fe7

File tree

3 files changed

+29
-6
lines changed

3 files changed

+29
-6
lines changed

src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,11 @@
1313
//!
1414
1515
pub mod middleware;
16+
pub mod remote_addr;
1617
pub mod service;
1718
pub mod types;
1819

1920
pub use middleware::*;
21+
pub use remote_addr::*;
2022
pub use service::*;
2123
pub use types::*;

src/remote_addr.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
//! Module representing the remote (peer) address of a connection.
2+
3+
use hyper::server::conn::AddrStream;
4+
use std::net::SocketAddr;
5+
6+
/// Defines a method to get the remote (peer) address of a connection.
7+
///
8+
/// This trait might be needed to be implemented by for example custom TLS implementations.
9+
pub trait RemoteAddr {
10+
/// Returns the remote (peer) address of this connection.
11+
fn remote_addr(&self) -> Option<SocketAddr>;
12+
}
13+
14+
impl RemoteAddr for AddrStream {
15+
fn remote_addr(&self) -> Option<SocketAddr> {
16+
Some(self.remote_addr())
17+
}
18+
}

src/service.rs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,14 @@
3737
//! }
3838
//! ```
3939
40-
use hyper::server::conn::AddrStream;
4140
use hyper::service::Service as HyperService;
4241
use std::convert::Infallible;
4342
use std::future::{ready, Ready};
4443
use std::task::{Context, Poll};
4544

4645
use self::handler_service::{HandlerService, HandlerServiceBuilder};
4746
use crate::middleware::Handler;
47+
use crate::remote_addr::RemoteAddr;
4848

4949
/// A [Hyper Service][`hyper::service::Service`] entry point which hosts a [`Handler`].
5050
pub struct Service<H> {
@@ -63,9 +63,10 @@ where
6363
}
6464
}
6565

66-
impl<H> HyperService<&AddrStream> for Service<H>
66+
impl<H, T> HyperService<&T> for Service<H>
6767
where
6868
H: Handler,
69+
T: RemoteAddr + Send + 'static,
6970
{
7071
type Response = HandlerService<H>;
7172
type Error = Infallible;
@@ -75,7 +76,7 @@ where
7576
Poll::Ready(Ok(()))
7677
}
7778

78-
fn call(&mut self, conn: &AddrStream) -> Self::Future {
79+
fn call(&mut self, conn: &T) -> Self::Future {
7980
ready(Ok(self.builder.build(conn.remote_addr())))
8081
}
8182
}
@@ -93,7 +94,7 @@ mod handler_service {
9394

9495
pub struct HandlerService<H> {
9596
handler: Arc<H>,
96-
remote_addr: SocketAddr,
97+
remote_addr: Option<SocketAddr>,
9798
}
9899

99100
impl<H> HyperService<Request> for HandlerService<H>
@@ -109,7 +110,9 @@ mod handler_service {
109110
}
110111

111112
fn call(&mut self, mut req: Request) -> Self::Future {
112-
req.extensions_mut().insert(self.remote_addr);
113+
if let Some(remote_addr) = self.remote_addr {
114+
req.extensions_mut().insert(remote_addr);
115+
}
113116
let res = self.handler.handle(&mut req);
114117
Box::pin(async { res })
115118
}
@@ -129,7 +132,7 @@ mod handler_service {
129132
}
130133
}
131134

132-
pub fn build(&self, remote_addr: SocketAddr) -> HandlerService<H> {
135+
pub fn build(&self, remote_addr: Option<SocketAddr>) -> HandlerService<H> {
133136
HandlerService {
134137
handler: self.handler.clone(),
135138
remote_addr,

0 commit comments

Comments
 (0)