3737//! }
3838//! ```
3939
40- use hyper:: server:: conn:: AddrStream ;
4140use hyper:: service:: Service as HyperService ;
4241use std:: convert:: Infallible ;
4342use std:: future:: { ready, Ready } ;
4443use std:: task:: { Context , Poll } ;
4544
4645use self :: handler_service:: { HandlerService , HandlerServiceBuilder } ;
4746use crate :: middleware:: Handler ;
47+ use crate :: remote_addr:: RemoteAddr ;
4848
4949/// A [Hyper Service][`hyper::service::Service`] entry point which hosts a [`Handler`].
5050pub struct Service < H > {
6363 }
6464}
6565
66- impl < H > HyperService < & AddrStream > for Service < H >
66+ impl < H , T > HyperService < & T > for Service < H >
6767where
6868 H : Handler ,
69+ T : RemoteAddr + Send + ' static ,
6970{
7071 type Response = HandlerService < H > ;
7172 type Error = Infallible ;
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