diff --git a/src/main.rs b/src/main.rs index 504358c..e850b4f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -103,19 +103,22 @@ async fn handle_connection(mut con: conn::Connection) -> Result<(), io::Error> { println!("{} New Connection: {}", now, con.peer_addr); let mut buffer = [0; 1024]; con.stream.read(&mut buffer).await?; - let request = match String::from_utf8(buffer[..].to_vec()) { + let mut request = match String::from_utf8(buffer[..].to_vec()) { Ok(request) => request, Err(_) => { println!("Bad Request"); - con.send_status(status::Status::BadRequest, "Bad Request!\r\n").await?; + con.send_status(status::Status::BadRequest, "Bad Request!").await?; return Ok(()) } }; + if request.starts_with("//") { + request = request.replacen("//", "gemini://", 1); + } println!("Request: {}", request); let url = match Url::parse(&request) { Ok(url) => url, - Err(_) => { con.send_status(status::Status::BadRequest, "Bad Request!\r\n").await?; + Err(_) => { con.send_status(status::Status::BadRequest, "Bad Request!").await?; return Ok(()) } }; @@ -124,11 +127,18 @@ async fn handle_connection(mut con: conn::Connection) -> Result<(), io::Error> { con.send_status(status::Status::ProxyRequestRefused, "Url doesn't match certificate!").await?; return Ok(()); } + // TODO get port from config + match url.port() { + Some(p) => { if p != 1965 { + con.send_status(status::Status::ProxyRequestRefused, "Wrong Port!").await?; + }}, + None => {} + } if url.scheme() != "gemini" { con.send_status( status::Status::ProxyRequestRefused, - "Not a gemini scheme!\r\n", + "Not a gemini scheme!", ) .await?; return Ok(()); @@ -154,7 +164,7 @@ async fn handle_connection(mut con: conn::Connection) -> Result<(), io::Error> { } if !path.exists() { - con.send_status(status::Status::NotFound, "Not found!\r\n").await?; + con.send_status(status::Status::NotFound, "Not found!").await?; return Ok(()); } @@ -165,7 +175,7 @@ async fn handle_connection(mut con: conn::Connection) -> Result<(), io::Error> { if !url.path().ends_with("/") { con.send_status( status::Status::RedirectPermanent, - format!("{}/\r\n", url).as_str(), + format!("{}/", url).as_str(), ) .await?; return Ok(()); @@ -184,14 +194,14 @@ async fn handle_connection(mut con: conn::Connection) -> Result<(), io::Error> { return Ok(()); } else { con.send_status( - status::Status::CGIError, "CGI Error!\r\n").await?; + status::Status::CGIError, "CGI Error!").await?; return Ok(()); } } if perm.mode() & 0o0444 != 0o0444 { con.send_status( - status::Status::NotFound, "Not Found!\r\n").await?; + status::Status::NotFound, "Not Found!").await?; return Ok(()); }