From ed551415a80e4bc0ce6aba57003c0066a2d57ee8 Mon Sep 17 00:00:00 2001 From: Fuwn Date: Tue, 27 May 2025 17:49:25 +0000 Subject: fix(response): Robust path pattern matching --- src/response.rs | 40 +++++++++++++++++++++++++--------------- 1 file changed, 25 insertions(+), 15 deletions(-) (limited to 'src') diff --git a/src/response.rs b/src/response.rs index 9a86f65..75fdb3b 100644 --- a/src/response.rs +++ b/src/response.rs @@ -269,32 +269,42 @@ pub async fn default( } fn path_matches_pattern(pattern: &str, path: &str) -> bool { + if !pattern.contains('*') { + return path == pattern; + } + let parts: Vec<&str> = pattern.split('*').collect(); - let mut position = 0; + let mut position = if pattern.starts_with('*') { + 0 + } else { + let first = parts.first().unwrap(); - if !pattern.starts_with('*') { - if let Some(part) = parts.first() { - if !path.starts_with(part) { - return false; - } + if !path.starts_with(first) { + return false; + } - position = part.len(); + first.len() + }; + + let mid_end = parts.len().saturating_sub(1); + + for part in &parts[1..mid_end] { + if part.is_empty() { + continue; } - } - for part in &parts[1..parts.len() - 1] { - if let Some(found_position) = path[position..].find(part) { - position += found_position + part.len(); + if let Some(found) = path[position..].find(part) { + position += found + part.len(); } else { return false; } } if !pattern.ends_with('*') { - if let Some(part) = parts.last() { - if !path[position..].ends_with(part) { - return false; - } + let last = parts.last().unwrap(); + + if !path[position..].ends_with(last) { + return false; } } -- cgit v1.2.3