agate

Simple gemini server for static files
git clone https://github.com/mbrubeck/agate.git
Log | Files | Refs | README

commit b5ce7382403e038551f1a986da1df01262caa910
parent 7eeba3959e4b18b90ceb618235f044653990a4f3
Author: Matt Brubeck <mbrubeck@limpet.net>
Date:   Sun, 17 May 2020 18:17:46 -0700

File serving

Diffstat:
Msrc/main.rs | 35+++++++++++++++++++++--------------
1 file changed, 21 insertions(+), 14 deletions(-)

diff --git 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<T=()> = std::result::Result<T, Box<dyn Error>>; +pub type Result<T=()> = std::result::Result<T, Box<dyn Error + Send + Sync>>; 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<Vec<u8>> { + 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) +}