diff options
| author | Fuwn <[email protected]> | 2025-05-27 17:49:25 +0000 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2025-05-27 17:49:25 +0000 |
| commit | ed551415a80e4bc0ce6aba57003c0066a2d57ee8 (patch) | |
| tree | 03efe41e008dd7627597d5ebfc378c53594ae0a1 | |
| parent | docs(Configuration.md): Add missing backtick (diff) | |
| download | september-ed551415a80e4bc0ce6aba57003c0066a2d57ee8.tar.xz september-ed551415a80e4bc0ce6aba57003c0066a2d57ee8.zip | |
fix(response): Robust path pattern matching
| -rw-r--r-- | src/response.rs | 40 |
1 files changed, 25 insertions, 15 deletions
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; } } |