commit b5ce7382403e038551f1a986da1df01262caa910
parent 7eeba3959e4b18b90ceb618235f044653990a4f3
Author: Matt Brubeck <mbrubeck@limpet.net>
Date: Sun, 17 May 2020 18:17:46 -0700
File serving
Diffstat:
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)
+}