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, stream: &mut SslStream) { if url.scheme() != "gemini" { stream.ssl_write(&response::invalid_protocol().to_vec()); return; } 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()); let mut buf_file = BufReader::new(file); let mut buf_stream = BufWriter::new(stream); copy(&mut buf_file, &mut buf_stream); }