From 515e1089b106071498b72d33e51f2271570b0455 Mon Sep 17 00:00:00 2001 From: Ali MJ Al-Nasrawy Date: Sat, 26 Jun 2021 22:06:44 +0300 Subject: [PATCH] remove unnecessary len This is used to strore the number of static chrs after the last capture group. However, we don't need this to calculate the totalmatched length, we can inseted use the 0th capture group. --- actix-router/src/resource.rs | 77 ++++++++---------------------------- 1 file changed, 17 insertions(+), 60 deletions(-) diff --git a/actix-router/src/resource.rs b/actix-router/src/resource.rs index c6bdd24b..a36740f1 100644 --- a/actix-router/src/resource.rs +++ b/actix-router/src/resource.rs @@ -38,8 +38,8 @@ enum PatternElement { enum PatternType { Static(String), Prefix(String), - Dynamic(Regex, Vec<&'static str>, usize), - DynamicSet(RegexSet, Vec<(Regex, Vec<&'static str>, usize)>), + Dynamic(Regex, Vec<&'static str>), + DynamicSet(RegexSet, Vec<(Regex, Vec<&'static str>)>), } impl ResourceDef { @@ -56,7 +56,7 @@ impl ResourceDef { let mut re_set = Vec::new(); for path in set { - let (pattern, _, _, len) = ResourceDef::parse(&path, false); + let (pattern, _, _) = ResourceDef::parse(&path, false); let re = match Regex::new(&pattern) { Ok(re) => re, @@ -69,7 +69,7 @@ impl ResourceDef { name.map(|name| Box::leak(Box::new(name.to_owned())).as_str()) }) .collect(); - data.push((re, names, len)); + data.push((re, names)); re_set.push(pattern); } @@ -116,7 +116,7 @@ impl ResourceDef { /// Parse path pattern and create new `Pattern` instance with custom prefix fn with_prefix(path: &str, for_prefix: bool) -> Self { let path = path.to_owned(); - let (pattern, elements, is_dynamic, len) = ResourceDef::parse(&path, for_prefix); + let (pattern, elements, is_dynamic) = ResourceDef::parse(&path, for_prefix); let tp = if is_dynamic { let re = match Regex::new(&pattern) { @@ -130,7 +130,7 @@ impl ResourceDef { name.map(|name| Box::leak(Box::new(name.to_owned())).as_str()) }) .collect(); - PatternType::Dynamic(re, names, len) + PatternType::Dynamic(re, names) } else if for_prefix { PatternType::Prefix(pattern) } else { @@ -167,7 +167,7 @@ impl ResourceDef { match self.tp { PatternType::Static(ref s) => s == path, PatternType::Prefix(ref s) => path.starts_with(s), - PatternType::Dynamic(ref re, _, _) => re.is_match(path), + PatternType::Dynamic(ref re, _) => re.is_match(path), PatternType::DynamicSet(ref re, _) => re.is_match(path), } } @@ -185,25 +185,7 @@ impl ResourceDef { None } } - PatternType::Dynamic(ref re, _, len) => { - if let Some(captures) = re.captures(path) { - let mut pos = 0; - let mut passed = false; - for capture in captures.iter() { - if let Some(ref m) = capture { - if !passed { - passed = true; - continue; - } - - pos = m.end(); - } - } - Some(pos + len) - } else { - None - } - } + PatternType::Dynamic(ref re, _) => re.find(path).map(|m| m.end()), PatternType::Prefix(ref s) => { let len = if path == s { s.len() @@ -222,24 +204,8 @@ impl ResourceDef { } PatternType::DynamicSet(ref re, ref params) => { if let Some(idx) = re.matches(path).into_iter().next() { - let (ref pattern, _, len) = params[idx]; - if let Some(captures) = pattern.captures(path) { - let mut pos = 0; - let mut passed = false; - for capture in captures.iter() { - if let Some(ref m) = capture { - if !passed { - passed = true; - continue; - } - - pos = m.end(); - } - } - Some(pos + len) - } else { - None - } + let (ref pattern, _) = params[idx]; + pattern.find(path).map(|m| m.end()) } else { None } @@ -293,13 +259,10 @@ impl ResourceDef { }; (min(path.len(), len), None) } - PatternType::Dynamic(ref re, ref names, len) => { - let mut pos = 0; - + PatternType::Dynamic(ref re, ref names) => { if let Some(captures) = re.captures(path.path()) { for (no, name) in names.iter().enumerate() { if let Some(m) = captures.name(&name) { - pos = m.end(); segments[no] = PathItem::Segment(m.start() as u16, m.end() as u16); } else { log::error!( @@ -309,21 +272,19 @@ impl ResourceDef { return false; } } + (captures[0].len(), Some(names)) } else { return false; } - (pos + len, Some(names)) } PatternType::DynamicSet(ref re, ref params) => { let path = path.path(); if let Some(idx) = re.matches(path).into_iter().next() { - let (ref pattern, ref names, len) = params[idx]; - let mut pos = 0; + let (ref pattern, ref names) = params[idx]; if let Some(captures) = pattern.captures(path) { for (no, name) in names.iter().enumerate() { if let Some(m) = captures.name(&name) { - pos = m.end(); segments[no] = PathItem::Segment(m.start() as u16, m.end() as u16); } else { @@ -334,10 +295,10 @@ impl ResourceDef { return false; } } + (captures[0].len(), Some(names)) } else { return false; } - (pos + len, Some(names)) } else { return false; } @@ -451,20 +412,16 @@ impl ResourceDef { ) } - fn parse( - mut pattern: &str, - mut for_prefix: bool, - ) -> (String, Vec, bool, usize) { + fn parse(mut pattern: &str, mut for_prefix: bool) -> (String, Vec, bool) { if pattern.find('{').is_none() { return if let Some(path) = pattern.strip_suffix('*') { let re = format!("{}^{}(.*)", REGEX_FLAGS, path); - (re, vec![PatternElement::Const(String::from(path))], true, 0) + (re, vec![PatternElement::Const(String::from(path))], true) } else { ( String::from(pattern), vec![PatternElement::Const(String::from(pattern))], false, - pattern.chars().count(), ) }; } @@ -501,7 +458,7 @@ impl ResourceDef { if !for_prefix { re.push('$'); } - (re, elements, true, pattern.chars().count()) + (re, elements, true) } }