commit 8d09b268f962f8e70bf16967ba9806e34c4830bd
parent edec8f08bc178f0c8db725a30a7394ed8c09859a
Author: Matt Brubeck <mbrubeck@limpet.net>
Date: Tue, 19 May 2020 14:52:19 -0700
More error handling
Diffstat:
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()?;