diff options
Diffstat (limited to 'src/server/handler.rs')
| -rw-r--r-- | src/server/handler.rs | 29 |
1 files changed, 22 insertions, 7 deletions
diff --git a/src/server/handler.rs b/src/server/handler.rs index ceb6551..4a593e8 100644 --- a/src/server/handler.rs +++ b/src/server/handler.rs @@ -1,17 +1,32 @@ use crate::server::response; use crate::server::ServerConfig; +use openssl::ssl::{SslAcceptor, SslFiletype, SslMethod, SslStream}; +use std::fs::File; +use std::io::{copy, BufReader, BufWriter}; +use std::net::TcpStream; use std::path::Path; use url::Url; -pub fn handle(config: &ServerConfig, url: Url) -> Option<response::Response> { +pub fn handle(config: &ServerConfig, url: Url, stream: &mut SslStream<TcpStream>) { if url.scheme() != "gemini" { - return Some(response::invalid_protocol()); + stream.ssl_write(&response::invalid_protocol().to_vec()); + return; } - let path = Path::new(url.path()); - if !path.has_root() { - return Some(response::not_understood()); - } + let rel_path = Path::new(url.path()).strip_prefix("/").unwrap(); + let path = config.www_root.join(rel_path); + + let file = match File::open(&path) { + Ok(file) => file, + Err(_) => { + stream.ssl_write(&response::not_found().to_vec()); + return; + } + }; + + stream.ssl_write(&response::Header::new(response::Status::Success, "text/gemini").to_vec()); - None + let mut buf_file = BufReader::new(file); + let mut buf_stream = BufWriter::new(stream); + copy(&mut buf_file, &mut buf_stream); } |
