From 66a77b6b4cafb56f5bfadcb74a04bef8bb0b0b57 Mon Sep 17 00:00:00 2001 From: Ali MJ Al-Nasrawy Date: Sun, 27 Jun 2021 12:12:16 +0300 Subject: [PATCH] fix --- actix-router/src/resource.rs | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/actix-router/src/resource.rs b/actix-router/src/resource.rs index f4641555..6c6c0b0d 100644 --- a/actix-router/src/resource.rs +++ b/actix-router/src/resource.rs @@ -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, _, _, len) = ResourceDef::parse(&path, false, true); let re = match Regex::new(&pattern) { Ok(re) => re, @@ -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, len) = ResourceDef::parse(&path, for_prefix, false); let tp = if is_dynamic { let re = match Regex::new(&pattern) { @@ -573,19 +573,15 @@ impl ResourceDef { fn parse( mut pattern: &str, mut for_prefix: bool, + force_dynamic: bool, ) -> (String, Vec, bool, usize) { - if pattern.find('{').is_none() { - return if let Some(path) = pattern.strip_suffix('*') { - let re = format!("{}^{}(.*)", REGEX_FLAGS, path); - (re, vec![PatternElement::Str(String::from(path))], true, 0) - } else { - ( - String::from(pattern), - vec![PatternElement::Str(String::from(pattern))], - false, - pattern.chars().count(), - ) - }; + if !force_dynamic && pattern.find('{').is_none() && !pattern.ends_with('*') { + return ( + String::from(pattern), + vec![PatternElement::Str(String::from(pattern))], + false, + pattern.chars().count(), + ); } let mut elements = Vec::new(); @@ -607,6 +603,13 @@ impl ResourceDef { dyn_elements += 1; } + if let Some(path) = pattern.strip_suffix('*') { + elements.push(PatternElement::Str(String::from(path))); + re.push_str(&escape(path)); + re.push_str("(.*)"); + pattern = ""; + } + elements.push(PatternElement::Str(String::from(pattern))); re.push_str(&escape(pattern));