From b5ce7382403e038551f1a986da1df01262caa910 Mon Sep 17 00:00:00 2001 From: Matt Brubeck Date: Sun, 17 May 2020 18:17:46 -0700 Subject: [PATCH] File serving --- src/main.rs | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/src/main.rs b/src/main.rs index c57d5ba..312b71f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -8,7 +8,7 @@ use { rustls::internal::pemfile::{certs, rsa_private_keys}, std::{ error::Error, - fs::File, + fs::{File, read}, io::BufReader, path::{Path, PathBuf}, sync::Arc, @@ -16,7 +16,7 @@ use { url::Url, }; -pub type Result = std::result::Result>; +pub type Result = std::result::Result>; fn main() -> Result { let certs = certs(&mut BufReader::new(File::open("tests/cert.pem")?)) @@ -57,18 +57,25 @@ async fn connection(acceptor: TlsAcceptor, stream: TcpStream) -> Result { let url = Url::parse(request.trim())?; eprintln!("Got request: {:?}", url); - let path: PathBuf = url.path_segments().unwrap().collect(); - eprintln!("Path: {:?}", path); - let path = Path::new(".").join(path).canonicalize()?; - eprintln!("Path: {:?}", path); - - // TODO: Return a not found error - assert!(path.starts_with(std::env::current_dir()?)); - let mut stream = stream.into_inner(); - stream.write_all(b"20 text/gemini\r\n").await?; - stream.write_all(b"=> ").await?; - stream.write_all(url.as_str().as_bytes()).await?; - stream.write_all(b" Reload\r\n").await?; + match get(&url) { + Ok(response) => { + stream.write_all(b"20 text/gemini\r\n").await?; + stream.write_all(&response).await?; + } + Err(_) => { + stream.write_all(b"40 Not found, sorry.\r\n").await?; + } + } Ok(()) } + +fn get(url: &Url) -> Result> { + let path: PathBuf = url.path_segments().unwrap().collect(); + let path = Path::new(".").join(path).canonicalize()?; + if !path.starts_with(std::env::current_dir()?) { + Err("invalid path")? + } + let response = read(path)?; + Ok(response) +}