@@ -54,18 +54,20 @@ pub mod conn;
5454#[ cfg( feature = "runtime" ) ] mod tcp;
5555
5656use std:: fmt;
57- #[ cfg( feature = "runtime" ) ] use std:: net:: SocketAddr ;
57+ #[ cfg( feature = "runtime" ) ] use std:: net:: { SocketAddr , TcpListener as StdTcpListener } ;
58+
5859#[ cfg( feature = "runtime" ) ] use std:: time:: Duration ;
5960
6061use futures:: { Future , Stream , Poll } ;
6162use tokio_io:: { AsyncRead , AsyncWrite } ;
63+ #[ cfg( feature = "runtime" ) ] use tokio_reactor;
6264
6365use body:: { Body , Payload } ;
6466use service:: { NewService , Service } ;
6567// Renamed `Http` as `Http_` for now so that people upgrading don't see an
6668// error that `hyper::server::Http` is private...
6769use self :: conn:: { Http as Http_ , SpawnAll } ;
68- #[ cfg( feature = "runtime" ) ] use self :: tcp:: { AddrIncoming } ;
70+ #[ cfg( feature = "runtime" ) ] use self :: tcp:: AddrIncoming ;
6971
7072/// A listening HTTP server that accepts connections in both HTTP1 and HTTP2 by default.
7173///
@@ -117,6 +119,16 @@ impl Server<AddrIncoming, ()> {
117119 AddrIncoming :: new ( addr, None )
118120 . map ( Server :: builder)
119121 }
122+
123+ /// Create a new instance from a `std::net::TcpListener` instance.
124+ pub fn from_tcp (
125+ listener : StdTcpListener ,
126+ ) -> Result < Builder < AddrIncoming > , :: Error > {
127+ let handle = tokio_reactor:: Handle :: current ( ) ;
128+ let incoming = AddrIncoming :: from_tcp ( listener, & handle)
129+ . map_err ( |err| :: Error :: new_listen ( err) ) ?;
130+ Ok ( Self :: builder ( incoming) )
131+ }
120132}
121133
122134#[ cfg( feature = "runtime" ) ]
@@ -275,4 +287,3 @@ impl Builder<AddrIncoming> {
275287 self
276288 }
277289}
278-
0 commit comments