feat(server): introduce Accept trait

The `Accept` trait is used by the server types to asynchronously accept
incoming connections. This replaces the previous usage of `Stream`.

BREAKING CHANGE: Passing a `Stream` to `Server::builder` or
  `Http::serve_incoming` must be changed to pass an `Accept` instead. The
  `stream` optional feature can be enabled, and the a stream can be
  converted using `hyper::server:🉑:from_stream`.
This commit is contained in:
Sean McArthur
2019-09-05 10:54:50 -07:00
parent 0867ad5c15
commit b3e5506261
7 changed files with 189 additions and 71 deletions

View File

@@ -322,7 +322,18 @@ pub fn __run_test(cfg: __TestConfig) {
let serve_handles = Arc::new(Mutex::new(
cfg.server_msgs
));
let expected_connections = cfg.connections;
let mut cnt = 0;
let new_service = make_service_fn(move |_| {
cnt += 1;
assert!(
cnt <= expected_connections,
"server expected {} connections, received {}",
expected_connections,
cnt
);
// Move a clone into the service_fn
let serve_handles = serve_handles.clone();
future::ok::<_, hyper::Error>(service_fn(move |req: Request<Body>| {
@@ -352,36 +363,15 @@ pub fn __run_test(cfg: __TestConfig) {
}))
});
let serve = hyper::server::conn::Http::new()
let server = hyper::Server::bind(&SocketAddr::from(([127, 0, 0, 1], 0)))
.http2_only(cfg.server_version == 2)
.serve_addr(
&SocketAddr::from(([127, 0, 0, 1], 0)),
new_service,
)
.expect("serve_addr");
.serve(new_service);
let mut addr = serve.incoming_ref().local_addr();
let expected_connections = cfg.connections;
let server = serve
.try_fold(0, move |cnt, connecting| {
let cnt = cnt + 1;
assert!(
cnt <= expected_connections,
"server expected {} connections, received {}",
expected_connections,
cnt
);
let fut = connecting
.then(|res| res.expect("connecting"))
.map(|conn_res| conn_res.expect("server connection error"));
tokio::spawn(fut);
future::ok::<_, hyper::Error>(cnt)
})
.map(|res| {
let _ = res.expect("serve error");
});
let mut addr = server.local_addr();
rt.spawn(server);
rt.spawn(server.map(|result| {
let _ = result.expect("server error");
}));
if cfg.proxy {
let (proxy_addr, proxy) = naive_proxy(ProxyConfig {
@@ -393,7 +383,6 @@ pub fn __run_test(cfg: __TestConfig) {
addr = proxy_addr;
}
let make_request = Arc::new(move |client: &Client<HttpConnector>, creq: __CReq, cres: __CRes| {
let uri = format!("http://{}{}", addr, creq.uri);
let mut req = Request::builder()