fix(server): add remote_addr back to Request when using Http::bind
The `Request::remote_addr()` method has been deprecated. Closes #1410
This commit is contained in:
		| @@ -58,13 +58,9 @@ impl<B> Request<B> { | ||||
|     #[inline] | ||||
|     pub fn body_ref(&self) -> Option<&B> { self.body.as_ref() } | ||||
|  | ||||
|     /// The remote socket address of this request | ||||
|     /// | ||||
|     /// This is an `Option`, because some underlying transports may not have | ||||
|     /// a socket address, such as Unix Sockets. | ||||
|     /// | ||||
|     /// This field is not used for outgoing requests. | ||||
|     #[doc(hidden)] | ||||
|     #[inline] | ||||
|     #[deprecated(since="0.11.12", note="This method will be gone in future versions.")] | ||||
|     pub fn remote_addr(&self) -> Option<SocketAddr> { self.remote_addr } | ||||
|  | ||||
|     /// The target path of this Request. | ||||
| @@ -196,6 +192,10 @@ pub fn split<B>(req: Request<B>) -> (RequestHead, Option<B>) { | ||||
|     (head, req.body) | ||||
| } | ||||
|  | ||||
| pub fn addr<B>(req: &mut Request<B>, addr: SocketAddr) { | ||||
|     req.remote_addr = Some(addr); | ||||
| } | ||||
|  | ||||
| #[cfg(test)] | ||||
| mod tests { | ||||
|     /* | ||||
|   | ||||
| @@ -352,8 +352,9 @@ impl<S, B> Server<S, B> | ||||
|  | ||||
|         // Future for our server's execution | ||||
|         let srv = listener.incoming().for_each(|(socket, addr)| { | ||||
|             let addr_service = SocketAddrService::new(addr, new_service.new_service()?); | ||||
|             let s = NotifyService { | ||||
|                 inner: try!(new_service.new_service()), | ||||
|                 inner: addr_service, | ||||
|                 info: Rc::downgrade(&info), | ||||
|             }; | ||||
|             info.borrow_mut().active += 1; | ||||
| @@ -644,6 +645,41 @@ mod addr_stream { | ||||
|     } | ||||
| } | ||||
|  | ||||
| // ===== SocketAddrService | ||||
|  | ||||
| // This is used from `Server::run`, which captures the remote address | ||||
| // in this service, and then injects it into each `Request`. | ||||
| struct SocketAddrService<S> { | ||||
|     addr: SocketAddr, | ||||
|     inner: S, | ||||
| } | ||||
|  | ||||
| impl<S> SocketAddrService<S> { | ||||
|     fn new(addr: SocketAddr, service: S) -> SocketAddrService<S> { | ||||
|         SocketAddrService { | ||||
|             addr: addr, | ||||
|             inner: service, | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| impl<S> Service for SocketAddrService<S> | ||||
| where | ||||
|     S: Service<Request=Request>, | ||||
| { | ||||
|     type Request = S::Request; | ||||
|     type Response = S::Response; | ||||
|     type Error = S::Error; | ||||
|     type Future = S::Future; | ||||
|  | ||||
|     fn call(&self, mut req: Self::Request) -> Self::Future { | ||||
|         proto::request::addr(&mut req, self.addr); | ||||
|         self.inner.call(req) | ||||
|     } | ||||
| } | ||||
|  | ||||
| // ===== NotifyService ===== | ||||
|  | ||||
| struct NotifyService<S> { | ||||
|     inner: S, | ||||
|     info: Weak<RefCell<Info>>, | ||||
|   | ||||
		Reference in New Issue
	
	Block a user