agate

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

commit 8d09b268f962f8e70bf16967ba9806e34c4830bd
parent edec8f08bc178f0c8db725a30a7394ed8c09859a
Author: Matt Brubeck <mbrubeck@limpet.net>
Date:   Tue, 19 May 2020 14:52:19 -0700

More error handling

Diffstat:
Msrc/main.rs | 30+++++++++++++++++++-----------
1 file changed, 19 insertions(+), 11 deletions(-)

diff --git a/src/main.rs b/src/main.rs @@ -4,7 +4,7 @@ use { prelude::*, task, }, - async_tls::TlsAcceptor, + async_tls::{TlsAcceptor, server::TlsStream}, rustls::internal::pemfile::{certs, pkcs8_private_keys}, std::{ error::Error, @@ -49,27 +49,35 @@ fn main() -> Result { } async fn connection(acceptor: TlsAcceptor, stream: TcpStream) -> Result { - let stream = acceptor.accept(stream).await?; - - let mut stream = async_std::io::BufReader::new(stream); - let mut request = String::new(); - stream.read_line(&mut request).await?; - let url = Url::parse(request.trim())?; - eprintln!("Got request: {:?}", url); - - let mut stream = stream.into_inner(); + let mut stream = acceptor.accept(stream).await?; + let url = match parse_request(&mut stream).await { + Ok(url) => url, + Err(e) => { + stream.write_all(b"50 Invalid request.\r\n").await?; + return Err(e) + } + }; match get(&url) { Ok(response) => { stream.write_all(b"20 text/gemini\r\n").await?; stream.write_all(&response).await?; } - Err(_) => { + Err(e) => { stream.write_all(b"40 Not found, sorry.\r\n").await?; + return Err(e) } } Ok(()) } +async fn parse_request(stream: &mut TlsStream<TcpStream>) -> Result<Url> { + let mut stream = async_std::io::BufReader::new(stream); + let mut request = String::new(); + stream.read_line(&mut request).await?; + let url = Url::parse(request.trim())?; + Ok(url) +} + fn get(url: &Url) -> Result<Vec<u8>> { let path: PathBuf = url.path_segments().unwrap().collect(); let path = Path::new(".").join(path).canonicalize()?;