Skip to content

Commit bb4c5e2

Browse files
yoshuawuytsseanmonstar
authored andcommitted
feat(server): add Server::from_tcp constructor
Adds a constructor to build a `Server` from an `std::net::TcpListener`. Closes #1602
1 parent 6e8417e commit bb4c5e2

File tree

2 files changed

+28
-3
lines changed

2 files changed

+28
-3
lines changed

src/server/mod.rs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,18 +54,20 @@ pub mod conn;
5454
#[cfg(feature = "runtime")] mod tcp;
5555

5656
use 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

6061
use futures::{Future, Stream, Poll};
6162
use tokio_io::{AsyncRead, AsyncWrite};
63+
#[cfg(feature = "runtime")] use tokio_reactor;
6264

6365
use body::{Body, Payload};
6466
use 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...
6769
use 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-

src/server/tcp.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,20 @@ impl AddrIncoming {
4444
})
4545
}
4646

47+
pub(super) fn from_tcp(std_listener: StdTcpListener, handle: &Handle) -> ::Result<Self>{
48+
let listener = TcpListener::from_std(std_listener, &handle)
49+
.map_err(::Error::new_listen)?;
50+
let addr = listener.local_addr().map_err(::Error::new_listen)?;
51+
Ok(AddrIncoming {
52+
listener,
53+
addr: addr,
54+
sleep_on_errors: true,
55+
tcp_keepalive_timeout: None,
56+
tcp_nodelay: false,
57+
timeout: None,
58+
})
59+
}
60+
4761
/// Get the local address bound to this listener.
4862
pub fn local_addr(&self) -> SocketAddr {
4963
self.addr

0 commit comments

Comments
 (0)