From 45fd36db3d76d880f5a7c192ed28a6817999cd85 Mon Sep 17 00:00:00 2001 From: Pete Mertz Date: Thu, 17 Oct 2019 07:20:01 -0400 Subject: [PATCH] feat(server): Add an ssl example Adds an example using hyper + ssl for a server. Should resolve the closed issue #1942 --- Cargo.toml | 7 ++++ examples/README.md | 0 examples/client.rs | 0 examples/client_json.rs | 0 examples/echo.rs | 0 examples/hello.rs | 0 examples/multi_server.rs | 0 examples/params.rs | 0 examples/proxy.rs | 0 examples/send_file.rs | 0 examples/send_file_index.html | 0 examples/single_threaded.rs | 0 examples/ssl_server.p12 | Bin 0 -> 3957 bytes examples/ssl_server.rs | 69 ++++++++++++++++++++++++++++++++++ examples/state.rs | 0 examples/tower_client.rs | 0 examples/tower_server.rs | 0 examples/upgrades.rs | 0 examples/web_api.rs | 0 19 files changed, 76 insertions(+) mode change 100644 => 100755 examples/README.md mode change 100644 => 100755 examples/client.rs mode change 100644 => 100755 examples/client_json.rs mode change 100644 => 100755 examples/echo.rs mode change 100644 => 100755 examples/hello.rs mode change 100644 => 100755 examples/multi_server.rs mode change 100644 => 100755 examples/params.rs mode change 100644 => 100755 examples/proxy.rs mode change 100644 => 100755 examples/send_file.rs mode change 100644 => 100755 examples/send_file_index.html mode change 100644 => 100755 examples/single_threaded.rs create mode 100644 examples/ssl_server.p12 create mode 100644 examples/ssl_server.rs mode change 100644 => 100755 examples/state.rs mode change 100644 => 100755 examples/tower_client.rs mode change 100644 => 100755 examples/tower_server.rs mode change 100644 => 100755 examples/upgrades.rs mode change 100644 => 100755 examples/web_api.rs diff --git a/Cargo.toml b/Cargo.toml index 8ea63cfaf5..d3a6cef7c3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -58,6 +58,8 @@ serde_json = "1.0" tokio = "=0.2.0-alpha.6" # using #[tokio::test] attributes tokio-fs = "=0.2.0-alpha.6" tokio-test = "=0.2.0-alpha.6" +tokio-tls = "=0.3.0-alpha.6" +native-tls = "0.2" url = "1.0" [features] @@ -148,6 +150,11 @@ name = "state" path = "examples/state.rs" required-features = ["runtime"] +[[example]] +name = "ssl_server" +path = "examples/ssl_server.rs" +required-features = ["runtime", "unstable-stream"] + [[example]] name = "tower_client" path = "examples/tower_client.rs" diff --git a/examples/README.md b/examples/README.md old mode 100644 new mode 100755 diff --git a/examples/client.rs b/examples/client.rs old mode 100644 new mode 100755 diff --git a/examples/client_json.rs b/examples/client_json.rs old mode 100644 new mode 100755 diff --git a/examples/echo.rs b/examples/echo.rs old mode 100644 new mode 100755 diff --git a/examples/hello.rs b/examples/hello.rs old mode 100644 new mode 100755 diff --git a/examples/multi_server.rs b/examples/multi_server.rs old mode 100644 new mode 100755 diff --git a/examples/params.rs b/examples/params.rs old mode 100644 new mode 100755 diff --git a/examples/proxy.rs b/examples/proxy.rs old mode 100644 new mode 100755 diff --git a/examples/send_file.rs b/examples/send_file.rs old mode 100644 new mode 100755 diff --git a/examples/send_file_index.html b/examples/send_file_index.html old mode 100644 new mode 100755 diff --git a/examples/single_threaded.rs b/examples/single_threaded.rs old mode 100644 new mode 100755 diff --git a/examples/ssl_server.p12 b/examples/ssl_server.p12 new file mode 100644 index 0000000000000000000000000000000000000000..f6644d634614b088ae89749470563ed4097bd0e1 GIT binary patch literal 3957 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 LJ2Lx!TH1dA2b^*@ literal 0 HcmV?d00001 diff --git a/examples/ssl_server.rs b/examples/ssl_server.rs new file mode 100644 index 0000000000..441f562632 --- /dev/null +++ b/examples/ssl_server.rs @@ -0,0 +1,69 @@ +use std::net::SocketAddr; +use futures_util::stream::StreamExt; + +use hyper::{Body, Response, Request}; +use hyper::service::{make_service_fn, service_fn}; +use hyper::server::conn::Http; +use hyper::server::Builder; +use std::sync::Arc; +use tokio::net::TcpListener; + +use native_tls; +use native_tls::Identity; +use tokio_tls; +use std::convert::Infallible; + +async fn hello(_: Request) -> Result, Infallible> { + Ok(Response::new(Body::from("Hello World!"))) +} + +#[tokio::main] +async fn main() -> Result<(), Box> { + let addr: SocketAddr = ([127, 0, 0, 1], 8443).into(); + + let cert = include_bytes!("./ssl_server.p12").to_vec(); + let cert_pass = "password"; + let cert = Identity::from_pkcs12(&cert, cert_pass) + .expect("Could not decrypt p12 file"); + let tls_acceptor = + tokio_tls::TlsAcceptor::from( + native_tls::TlsAcceptor::builder(cert) + .build() + .expect("Could not create TLS acceptor.") + ); + let _arc_acceptor = Arc::new(tls_acceptor); + + let service = make_service_fn(|_| { + async { + Ok::<_, Infallible>(service_fn(hello)) + } + }); + + let listener = TcpListener::bind(&addr).await.unwrap(); + let incoming = listener.incoming(); + let server = Builder + ::new(hyper::server::accept::from_stream(incoming.filter_map(|socket| { + async { + match socket { + Ok(stream) => { + match _arc_acceptor.clone().accept(stream).await { + Ok(val) => Some(Ok::<_, hyper::Error>(val)), + Err(e) => { + println!("TLS error: {}", e); + None + } + } + }, + Err(e) => { + println!("TCP socket error: {}", e); + None + } + } + } + })), Http::new()) + .serve(service); + + server.await?; + + Ok(()) +} diff --git a/examples/state.rs b/examples/state.rs old mode 100644 new mode 100755 diff --git a/examples/tower_client.rs b/examples/tower_client.rs old mode 100644 new mode 100755 diff --git a/examples/tower_server.rs b/examples/tower_server.rs old mode 100644 new mode 100755 diff --git a/examples/upgrades.rs b/examples/upgrades.rs old mode 100644 new mode 100755 diff --git a/examples/web_api.rs b/examples/web_api.rs old mode 100644 new mode 100755