|
2 | 2 | //! |
3 | 3 | //! First parameter is the mandatory port to use. |
4 | 4 | //! Certificate and private key are hardcoded to sample files. |
5 | | -#![feature(async_await)] |
6 | | -use futures::{Stream, StreamExt, TryFutureExt, TryStreamExt}; |
| 5 | +use core::task::{Context, Poll}; |
| 6 | +use futures_util::{ |
| 7 | + stream::{Stream, StreamExt}, |
| 8 | + try_future::TryFutureExt, |
| 9 | + try_stream::TryStreamExt, |
| 10 | +}; |
7 | 11 | use hyper::service::{make_service_fn, service_fn}; |
8 | 12 | use hyper::{Body, Method, Request, Response, Server, StatusCode}; |
9 | 13 | use rustls::internal::pemfile; |
@@ -66,14 +70,33 @@ async fn run_server() -> Result<(), Box<dyn std::error::Error + Send + Sync>> { |
66 | 70 | .boxed(); |
67 | 71 |
|
68 | 72 | let service = make_service_fn(|_| async { Ok::<_, io::Error>(service_fn(echo)) }); |
69 | | - let server = Server::builder(incoming_tls_stream).serve(service); |
| 73 | + let server = Server::builder(HyperAcceptor { |
| 74 | + acceptor: incoming_tls_stream, |
| 75 | + }) |
| 76 | + .serve(service); |
70 | 77 |
|
71 | 78 | // Run the future, keep going until an error occurs. |
72 | 79 | println!("Starting to serve on https://{}.", addr); |
73 | 80 | server.await?; |
74 | 81 | Ok(()) |
75 | 82 | } |
76 | 83 |
|
| 84 | +struct HyperAcceptor { |
| 85 | + acceptor: Pin<Box<dyn Stream<Item = Result<TlsStream<TcpStream>, io::Error>>>>, |
| 86 | +} |
| 87 | + |
| 88 | +impl hyper::server::accept::Accept for HyperAcceptor { |
| 89 | + type Conn = TlsStream<TcpStream>; |
| 90 | + type Error = io::Error; |
| 91 | + |
| 92 | + fn poll_accept( |
| 93 | + mut self: Pin<&mut Self>, |
| 94 | + cx: &mut Context, |
| 95 | + ) -> Poll<Option<Result<Self::Conn, Self::Error>>> { |
| 96 | + Pin::new(&mut self.acceptor).poll_next(cx) |
| 97 | + } |
| 98 | +} |
| 99 | + |
77 | 100 | // Custom echo service, handling two different routes and a |
78 | 101 | // catch-all 404 responder. |
79 | 102 | async fn echo(req: Request<Body>) -> Result<Response<Body>, hyper::Error> { |
|
0 commit comments