fix: properly handle trailing / in more routes (#1900)

This commit is contained in:
PianoPrinter 2023-10-18 01:45:22 +09:00 committed by GitHub
parent 4a4e16c206
commit 0d6ddfb71e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -57,13 +57,14 @@ impl Matcher {
let loc_len = loc_segments.len();
let len_diff: i32 = loc_len as i32 - self.len as i32;
let trailing_iter = location.chars().rev().take_while(|n| *n == '/');
// quick path: not a match if
// 1) matcher has add'l segments not found in location
// 2) location has add'l segments, there's no splat, and partial matches not allowed
if loc_len < self.len
|| (len_diff > 0 && self.splat.is_none() && !self.partial)
|| (self.splat.is_none()
&& location.split('/').count() > (2 * (loc_segments.len() + 1)))
|| (self.splat.is_none() && trailing_iter.clone().count() > 1)
{
None
}
@ -95,12 +96,8 @@ impl Matcher {
};
// add trailing slashes to splat
let trailing_slashes = location
.chars()
.rev()
.take_while(|n| *n == '/')
.skip(1)
.collect::<String>();
let trailing_slashes =
trailing_iter.skip(1).collect::<String>();
value.push_str(&trailing_slashes);
params.insert(splat.into(), value);