conduit_hyper/
server.rs

1use crate::{BlockingHandler, Service};
2
3use std::future::Future;
4use std::net::SocketAddr;
5use std::sync::Arc;
6
7use hyper::server::conn::AddrStream;
8use hyper::service;
9use service::make_service_fn;
10
11/// A builder for a `hyper::Server` (behind an opaque `impl Future`).
12#[derive(Debug)]
13pub struct Server;
14
15impl Server {
16    /// Bind a handler to an address.
17    ///
18    /// This returns an opaque `impl Future` so while it can be directly spawned on a
19    /// `tokio::Runtime` it is not possible to furter configure the `hyper::Server`.  If more
20    /// control, such as configuring a graceful shutdown is necessary, then call
21    /// `Service::from_blocking` instead.
22    pub fn serve<H: conduit::Handler>(addr: &SocketAddr, handler: H) -> impl Future {
23        let handler = Arc::new(BlockingHandler::new(handler));
24        let make_service = make_service_fn(move |socket: &AddrStream| {
25            let handler = handler.clone();
26            let remote_addr = socket.remote_addr();
27            async move { Service::from_blocking(handler, remote_addr) }
28        });
29
30        hyper::Server::bind(addr).serve(make_service)
31    }
32}