Skip to content

Commit

Permalink
update low-level-rustls example (tokio-rs#465)
Browse files Browse the repository at this point in the history
  • Loading branch information
programatik29 authored Nov 5, 2021
1 parent 0764145 commit 394ba31
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 19 deletions.
5 changes: 4 additions & 1 deletion examples/low-level-rustls/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,11 @@ publish = false

[dependencies]
axum = { path = "../../axum" }
futures-util = "0.3"
hyper = { version = "0.14", features = ["full"] }
rustls-pemfile = "0.2"
tokio = { version = "1", features = ["full"] }
tokio-rustls = "0.22"
tokio-rustls = "0.23"
tower = { version = "0.4", features = ["make"] }
tracing = "0.1"
tracing-subscriber = "0.2"
53 changes: 35 additions & 18 deletions examples/low-level-rustls/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,20 @@
//! cargo run -p example-low-level-rustls
//! ```
use axum::{routing::get, Router};
use hyper::server::conn::Http;
use std::{fs::File, io::BufReader, sync::Arc};
use axum::{extract::ConnectInfo, routing::get, Router};
use futures_util::future::poll_fn;
use hyper::server::{
accept::Accept,
conn::{AddrIncoming, Http},
};
use rustls_pemfile::{certs, pkcs8_private_keys};
use std::{fs::File, io::BufReader, net::SocketAddr, pin::Pin, sync::Arc};
use tokio::net::TcpListener;
use tokio_rustls::{
rustls::{
internal::pemfile::{certs, pkcs8_private_keys},
NoClientAuth, ServerConfig,
},
rustls::{Certificate, PrivateKey, ServerConfig},
TlsAcceptor,
};
use tower::MakeService;

#[tokio::main]
async fn main() {
Expand All @@ -30,15 +33,23 @@ async fn main() {
);

let acceptor = TlsAcceptor::from(rustls_config);

let listener = TcpListener::bind("127.0.0.1:3000").await.unwrap();
let mut listener = AddrIncoming::from_listener(listener).unwrap();

let app = Router::new().route("/", get(handler));
let mut app = Router::new()
.route("/", get(handler))
.into_make_service_with_connect_info::<SocketAddr, _>();

loop {
let (stream, _addr) = listener.accept().await.unwrap();
let stream = poll_fn(|cx| Pin::new(&mut listener).poll_accept(cx))
.await
.unwrap()
.unwrap();

let acceptor = acceptor.clone();

let app = app.clone();
let app = app.make_service(&stream).await.unwrap();

tokio::spawn(async move {
if let Ok(stream) = acceptor.accept(stream).await {
Expand All @@ -48,22 +59,28 @@ async fn main() {
}
}

async fn handler() -> &'static str {
"Hello, World!"
async fn handler(ConnectInfo(addr): ConnectInfo<SocketAddr>) -> String {
addr.to_string()
}

fn rustls_server_config(key: &str, cert: &str) -> Arc<ServerConfig> {
let mut config = ServerConfig::new(NoClientAuth::new());

let mut key_reader = BufReader::new(File::open(key).unwrap());
let mut cert_reader = BufReader::new(File::open(cert).unwrap());

let key = pkcs8_private_keys(&mut key_reader).unwrap().remove(0);
let certs = certs(&mut cert_reader).unwrap();
let key = PrivateKey(pkcs8_private_keys(&mut key_reader).unwrap().remove(0));
let certs = certs(&mut cert_reader)
.unwrap()
.into_iter()
.map(Certificate)
.collect();

config.set_single_cert(certs, key).unwrap();
let mut config = ServerConfig::builder()
.with_safe_defaults()
.with_no_client_auth()
.with_single_cert(certs, key)
.expect("bad certificate/key");

config.set_protocols(&[b"h2".to_vec(), b"http/1.1".to_vec()]);
config.alpn_protocols = vec![b"h2".to_vec(), b"http/1.1".to_vec()];

Arc::new(config)
}

0 comments on commit 394ba31

Please sign in to comment.