diff options
Diffstat (limited to 'src/server/mod.rs')
| -rw-r--r-- | src/server/mod.rs | 76 |
1 files changed, 38 insertions, 38 deletions
diff --git a/src/server/mod.rs b/src/server/mod.rs index 545fbeb..696a3a5 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -1,7 +1,6 @@ -use openssl::ssl::{SslAcceptor, SslFiletype, SslMethod, SslStream}; -use std::collections::HashMap; -use std::net::{SocketAddr, TcpListener, TcpStream}; -use std::path::{Path, PathBuf}; +use openssl::ssl::{SslAcceptor, SslFiletype, SslMethod}; +use std::net::{SocketAddr, TcpListener}; +use std::path::PathBuf; use std::sync::Arc; use std::thread; use std::vec::Vec; @@ -13,24 +12,38 @@ pub mod response; #[derive(Clone)] pub struct ServerConfig { default_host: Url, - www_root: PathBuf, + gem_root: PathBuf, addrs: Vec<SocketAddr>, } impl ServerConfig { - pub fn new(default_host: String, www_root: String) -> ServerConfig { - let mut url = Url::parse("gemini://default").unwrap(); - url.set_host(Some(default_host.as_str())); - + pub fn new() -> ServerConfig { ServerConfig { - default_host: url, - www_root: PathBuf::from(www_root), + default_host: Url::parse("gemini://localhost").unwrap(), + gem_root: PathBuf::from(""), addrs: Vec::new(), } } + pub fn set_default_host(&mut self, default_host: String) { + let mut url = Url::parse("gemini://default").unwrap(); + + match url.set_host(Some(default_host.as_str())) { + Ok(_) => {} + Err(e) => panic!(e), + }; + self.default_host = url; + } + + pub fn set_gem_root(&mut self, gem_root: String) { + self.gem_root = PathBuf::from(gem_root); + } + pub fn add_addr(&mut self, addr: String) { - self.addrs.push(addr.parse().unwrap()); + self.addrs.push(match addr.parse() { + Ok(addr) => addr, + Err(e) => panic!(e), + }); } } @@ -42,11 +55,21 @@ pub struct Server { impl Server { pub fn new(config: &ServerConfig) -> Server { Server { - acceptor: build_acceptor(), + acceptor: Server::build_acceptor(), config: config.clone(), } } + 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()); + } + pub fn serve(&self) { let listener = TcpListener::bind(&self.config.addrs[..]).unwrap(); @@ -57,34 +80,11 @@ impl Server { let config = self.config.clone(); thread::spawn(move || { let stream = acceptor.accept(stream).unwrap(); - handle_client(&config, stream); + handler::handle_request(&config, stream); }); } - Err(e) => { /* connection failed */ } + Err(_) => { /* connection failed */ } } } } } - -fn handle_client(config: &ServerConfig, mut stream: SslStream<TcpStream>) { - let mut buffer = [0; 1026]; - stream.ssl_read(&mut buffer); - let request = String::from_utf8(buffer.to_vec()).unwrap(); - - let location = match Url::parse(&request) { - Ok(url) => url, - Err(e) => config.default_host.join(&request).unwrap(), - }; - - handler::handle(config, location, &mut stream); -} - -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()); -} |
