ignore trailing slashes and query params

This commit is contained in:
2026-05-28 17:46:19 +01:00
parent 5e92bc00e5
commit 27a76fcef7

View File

@@ -13,6 +13,22 @@ enum ResponseCode {
NotFound, NotFound,
} }
/// Remove query parameters and trailing slashes.
/// Makes all paths lowercase.
fn normalise_path(path: &str) -> String {
let mut path = path
.split('?')
.next()
.expect("split operation returns at least one substring");
if path.len() > 1
&& let Some('/') = path.chars().next_back()
{
path = &path[0..path.len() - 1];
}
path.to_lowercase()
}
async fn simple_response(mut socket: BufStream<TcpStream>, rc: ResponseCode) { async fn simple_response(mut socket: BufStream<TcpStream>, rc: ResponseCode) {
let rc = match rc { let rc = match rc {
ResponseCode::BadRequest => "400 Bad Request", ResponseCode::BadRequest => "400 Bad Request",
@@ -46,7 +62,8 @@ async fn process_socket(mut socket: BufStream<TcpStream>, urlmap: Arc<HashMap<St
simple_response(socket, ResponseCode::BadRequest).await; simple_response(socket, ResponseCode::BadRequest).await;
return; return;
}; };
let path = path.to_lowercase();
let path = normalise_path(path);
if http_method != "GET" { if http_method != "GET" {
println!("process_request: forbidden method"); println!("process_request: forbidden method");
@@ -103,7 +120,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
if url_pair if url_pair
.chars() .chars()
.next() .next()
.expect("String is longer than 1 character") .expect("String at least 1 character")
!= '/' != '/'
{ {
continue; continue;
@@ -115,7 +132,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
Err(format!("Unable to parse line: '{}'", url_pair))? Err(format!("Unable to parse line: '{}'", url_pair))?
}; };
urlmap.insert(slug.to_lowercase(), redirect.to_string()); urlmap.insert(normalise_path(slug), redirect.to_string());
} }
let urlmap = Arc::new(urlmap); let urlmap = Arc::new(urlmap);