From d33c678e3f4647b012e2fad74571838414cb02c9 Mon Sep 17 00:00:00 2001 From: yggverse Date: Sat, 22 Feb 2025 06:24:58 +0200 Subject: [PATCH] draft `gemini` request handler --- src/main.rs | 55 +++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 41 insertions(+), 14 deletions(-) diff --git a/src/main.rs b/src/main.rs index f8a3b28..260a752 100644 --- a/src/main.rs +++ b/src/main.rs @@ -60,7 +60,38 @@ fn handle(argument: Arc, peer: SocketAddr, stream: &mut TlsStream { match request { - Request::Gemini(gemini) => println!("request: {}", gemini.url), // @TODO + Request::Gemini(gemini) => { + match storage::Item::from_url(&gemini.url.as_str(), &argument.directory) + { + Ok(item) => send( + &response::success::Default { + mime: "text/gemini".to_string(), + //data: item.file.read(vec![1000]), + } + .into_bytes(), + stream, + |result| match result { + Ok(()) => println!( + "[{}] [error] [{peer}] Request: {}", + now(), + gemini.url + ), + Err(e) => println!("[{}] [error] [{peer}] {e}", now()), + }, + ), + Err(e) => send( + &response::failure::permanent::NotFound { + message: Some("Not found".to_string()), + } + .into_bytes(), + stream, + |result| match result { + Ok(()) => println!("[{}] [error] [{peer}] {e}", now()), + Err(e) => println!("[{}] [error] [{peer}] {e}", now()), + }, + ), + } + } Request::Titan(titan) => { // init memory pool let mut data: Vec = Vec::with_capacity(titan.size); @@ -68,12 +99,10 @@ fn handle(argument: Arc, peer: SocketAddr, stream: &mut TlsStream { - println!( - "[{}] [warning] [{peer}] Connection closed by peer", - now() - ) - } + Ok(0) => println!( + "[{}] [warning] [{peer}] Connection closed by peer", + now() + ), Ok(l) => { data.extend(&input[..l]); @@ -91,12 +120,10 @@ fn handle(argument: Arc, peer: SocketAddr, stream: &mut TlsStream { - println!( - "[{}] [warning] [{peer}] {MESSAGE}", - now() - ) - } + Ok(()) => println!( + "[{}] [warning] [{peer}] {MESSAGE}", + now() + ), Err(e) => { println!("[{}] [error] [{peer}] {e}", now()) } @@ -277,7 +304,7 @@ fn send(data: &[u8], stream: &mut TlsStream, callback: impl FnOnce(Re callback((|| { stream.write_all(data)?; stream.flush()?; - // Close connection gracefully + // close connection gracefully // https://geminiprotocol.net/docs/protocol-specification.gmi#closing-connections stream.shutdown()?; Ok(())