use openssl::ssl::{SslMethod, SslAcceptor, SslStream, SslFiletype}; use std::net::{TcpListener, TcpStream, SocketAddr}; use std::sync::Arc; use std::thread; mod response; fn build_acceptor() -> std::sync::Arc { let mut acceptor = SslAcceptor::mozilla_intermediate_v5(SslMethod::tls()).unwrap(); acceptor.set_private_key_file("doc/key.pem", SslFiletype::PEM).unwrap(); acceptor.set_certificate_chain_file("doc/cert.pem").unwrap(); acceptor.check_private_key().unwrap(); return Arc::new(acceptor.build()); } fn handle_client(mut stream: SslStream) { let mut buffer = [0; 1026]; stream.ssl_read(&mut buffer); let request = String::from_utf8(buffer.to_vec()).unwrap(); let header = response::Header::new(response::Status::Success, "text/gemini".to_string()); let response = response::Response::new(header, [].to_vec()); stream.ssl_write(&response.format()); } fn main() { let addrs = [ SocketAddr::from(([127, 0, 0, 1], 1965)), ]; let acceptor = build_acceptor(); let listener = TcpListener::bind(&addrs[..]).unwrap(); for stream in listener.incoming() { match stream { Ok(stream) => { let acceptor = acceptor.clone(); thread::spawn(move || { let stream = acceptor.accept(stream).unwrap(); handle_client(stream); }); } Err(e) => { /* connection failed */ } } } }