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