diff --git a/examples/hyper-server.rs b/examples/hyper-server.rs index 41fd254..8541941 100644 --- a/examples/hyper-server.rs +++ b/examples/hyper-server.rs @@ -39,7 +39,7 @@ async fn listen(listener: Async, tls: Option) -> Resul println!("Listening on {}", host); // Start a hyper server. - Server::builder(SmolListener::new(listener, tls)) + Server::builder(SmolListener::new(&listener, tls)) .executor(SmolExecutor) .serve(make_service_fn(move |_| { let host = host.clone(); @@ -78,28 +78,29 @@ impl hyper::rt::Executor for SmolExecutor { } /// Listens for incoming connections. -struct SmolListener { - listener: Async, +struct SmolListener<'a> { tls: Option, + incoming: Pin>> + Send + 'a>>, } -impl SmolListener { - fn new(listener: Async, tls: Option) -> Self { - Self { listener, tls } +impl<'a> SmolListener<'a> { + fn new(listener: &'a Async, tls: Option) -> Self { + Self { + incoming: Box::pin(listener.incoming()), + tls, + } } } -impl hyper::server::accept::Accept for SmolListener { +impl hyper::server::accept::Accept for SmolListener<'_> { type Conn = SmolStream; type Error = Error; fn poll_accept( - self: Pin<&mut Self>, + mut self: Pin<&mut Self>, cx: &mut Context, ) -> Poll>> { - let incoming = self.listener.incoming(); - smol::pin!(incoming); - let stream = smol::ready!(incoming.poll_next(cx)).unwrap()?; + let stream = smol::ready!(self.incoming.as_mut().poll_next(cx)).unwrap()?; let stream = match &self.tls { None => SmolStream::Plain(stream), @@ -151,7 +152,7 @@ impl tokio::io::AsyncRead for SmolStream { .map_ok(|size| { buf.advance(size); () - }) + }); } SmolStream::Tls(s) => { return Pin::new(s) @@ -159,7 +160,7 @@ impl tokio::io::AsyncRead for SmolStream { .map_ok(|size| { buf.advance(size); () - }) + }); } SmolStream::Handshake(f) => { let s = smol::ready!(f.as_mut().poll(cx))?;