agate

Simple gemini server for static files
git clone https://github.com/mbrubeck/agate.git
Log | Files | Refs | README

commit a165e8e142daeacac9c2ee03beb2bbb71046965f
parent 8d09b268f962f8e70bf16967ba9806e34c4830bd
Author: Matt Brubeck <mbrubeck@limpet.net>
Date:   Tue, 19 May 2020 15:10:55 -0700

Make TLS config global

Diffstat:
MCargo.lock | 1+
MCargo.toml | 1+
Msrc/main.rs | 35+++++++++++++++++++----------------
3 files changed, 21 insertions(+), 16 deletions(-)

diff --git a/Cargo.lock b/Cargo.lock @@ -6,6 +6,7 @@ version = "1.0.0" dependencies = [ "async-std", "async-tls", + "lazy_static", "rustls", "url", ] diff --git a/Cargo.toml b/Cargo.toml @@ -13,6 +13,7 @@ edition = "2018" [dependencies] async-tls = "0.7.0" async-std = "1.5" +lazy_static = "1.4" rustls = "0.17.0" url = "2.1" diff --git a/src/main.rs b/src/main.rs @@ -5,6 +5,7 @@ use { task, }, async_tls::{TlsAcceptor, server::TlsStream}, + lazy_static::lazy_static, rustls::internal::pemfile::{certs, pkcs8_private_keys}, std::{ error::Error, @@ -19,37 +20,25 @@ use { pub type Result<T=()> = std::result::Result<T, Box<dyn Error + Send + Sync>>; fn main() -> Result { - let certs = certs(&mut BufReader::new(File::open("tests/cert.pem")?)) - .expect("Error reading certificate file"); - let mut keys = pkcs8_private_keys(&mut BufReader::new(File::open("tests/key.rsa")?)) - .expect("Error reading private key file"); - - let mut config = rustls::ServerConfig::new(rustls::NoClientAuth::new()); - config.set_single_cert(certs, keys.remove(0))?; - let acceptor = TlsAcceptor::from(Arc::new(config)); - let addr = "localhost:1965"; task::block_on(async { let listener = TcpListener::bind(addr).await?; let mut incoming = listener.incoming(); - while let Some(stream) = incoming.next().await { - let acceptor = acceptor.clone(); - let stream = stream?; + while let Some(Ok(stream)) = incoming.next().await { task::spawn(async { - if let Err(e) = connection(acceptor, stream).await { + if let Err(e) = connection(stream).await { eprintln!("Error: {:?}", e); } }); } - Ok(()) }) } -async fn connection(acceptor: TlsAcceptor, stream: TcpStream) -> Result { - let mut stream = acceptor.accept(stream).await?; +async fn connection(stream: TcpStream) -> Result { + let mut stream = TLS_ACCEPTOR.accept(stream).await?; let url = match parse_request(&mut stream).await { Ok(url) => url, Err(e) => { @@ -70,6 +59,20 @@ async fn connection(acceptor: TlsAcceptor, stream: TcpStream) -> Result { Ok(()) } +lazy_static! { + static ref TLS_ACCEPTOR: TlsAcceptor = { + let cert_file = File::open("tests/cert.pem").unwrap(); + let certs = certs(&mut BufReader::new(cert_file)).unwrap(); + + let key_file = File::open("tests/key.rsa").unwrap(); + let mut keys = pkcs8_private_keys(&mut BufReader::new(key_file)).unwrap(); + + let mut config = rustls::ServerConfig::new(rustls::NoClientAuth::new()); + config.set_single_cert(certs, keys.remove(0)).unwrap(); + TlsAcceptor::from(Arc::new(config)) + }; +} + async fn parse_request(stream: &mut TlsStream<TcpStream>) -> Result<Url> { let mut stream = async_std::io::BufReader::new(stream); let mut request = String::new();