summaryrefslogtreecommitdiff
path: root/src/server/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/mod.rs')
-rw-r--r--src/server/mod.rs76
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());
-}