37
37
//! }
38
38
//! ```
39
39
40
- use hyper:: server:: conn:: AddrStream ;
41
40
use hyper:: service:: Service as HyperService ;
42
41
use std:: convert:: Infallible ;
43
42
use std:: future:: { ready, Ready } ;
44
43
use std:: task:: { Context , Poll } ;
45
44
46
45
use self :: handler_service:: { HandlerService , HandlerServiceBuilder } ;
47
46
use crate :: middleware:: Handler ;
47
+ use crate :: remote_addr:: RemoteAddr ;
48
48
49
49
/// A [Hyper Service][`hyper::service::Service`] entry point which hosts a [`Handler`].
50
50
pub struct Service < H > {
63
63
}
64
64
}
65
65
66
- impl < H > HyperService < & AddrStream > for Service < H >
66
+ impl < H , T > HyperService < & T > for Service < H >
67
67
where
68
68
H : Handler ,
69
+ T : RemoteAddr + Send + ' static ,
69
70
{
70
71
type Response = HandlerService < H > ;
71
72
type Error = Infallible ;
75
76
Poll :: Ready ( Ok ( ( ) ) )
76
77
}
77
78
78
- fn call ( & mut self , conn : & AddrStream ) -> Self :: Future {
79
+ fn call ( & mut self , conn : & T ) -> Self :: Future {
79
80
ready ( Ok ( self . builder . build ( conn. remote_addr ( ) ) ) )
80
81
}
81
82
}
@@ -93,7 +94,7 @@ mod handler_service {
93
94
94
95
pub struct HandlerService < H > {
95
96
handler : Arc < H > ,
96
- remote_addr : SocketAddr ,
97
+ remote_addr : Option < SocketAddr > ,
97
98
}
98
99
99
100
impl < H > HyperService < Request > for HandlerService < H >
@@ -109,7 +110,9 @@ mod handler_service {
109
110
}
110
111
111
112
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
+ }
113
116
let res = self . handler . handle ( & mut req) ;
114
117
Box :: pin ( async { res } )
115
118
}
@@ -129,7 +132,7 @@ mod handler_service {
129
132
}
130
133
}
131
134
132
- pub fn build ( & self , remote_addr : SocketAddr ) -> HandlerService < H > {
135
+ pub fn build ( & self , remote_addr : Option < SocketAddr > ) -> HandlerService < H > {
133
136
HandlerService {
134
137
handler : self . handler . clone ( ) ,
135
138
remote_addr,
0 commit comments