diff options
Diffstat (limited to 'src/main.rs')
| -rw-r--r-- | src/main.rs | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..8181b92 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,45 @@ +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<SslAcceptor> { + 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<TcpStream>) { + 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 */ } + } + } +} |
