From a7187c4d8bf40be98eb64157a10aa78017ae1795 Mon Sep 17 00:00:00 2001 From: Nikolay Kim Date: Sat, 9 May 2020 21:38:52 +0600 Subject: [PATCH] Handle non-prefix and prefix resources combinations --- ntex-router/CHANGES.txt | 4 ++++ ntex-router/Cargo.toml | 2 +- ntex-router/src/resource.rs | 15 +++++++++++++++ ntex-router/src/tree.rs | 33 ++++++++++++++++++++++++++++++++- 4 files changed, 52 insertions(+), 2 deletions(-) diff --git a/ntex-router/CHANGES.txt b/ntex-router/CHANGES.txt index 3751b34c2..122efd222 100644 --- a/ntex-router/CHANGES.txt +++ b/ntex-router/CHANGES.txt @@ -1,5 +1,9 @@ # Changes +## [0.3.5] - 2020-05-09 + +* Handle non-prefix and prefix resources combinations + ## [0.3.4] - 2020-04-17 * Add ResourcePath impl for &T where T: ResourcePath diff --git a/ntex-router/Cargo.toml b/ntex-router/Cargo.toml index a4f9553f6..ddf47259e 100644 --- a/ntex-router/Cargo.toml +++ b/ntex-router/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ntex-router" -version = "0.3.4" +version = "0.3.5" authors = ["Nikolay Kim "] description = "Path router" keywords = ["ntex"] diff --git a/ntex-router/src/resource.rs b/ntex-router/src/resource.rs index f1e3b3018..c9ae49b57 100644 --- a/ntex-router/src/resource.rs +++ b/ntex-router/src/resource.rs @@ -943,4 +943,19 @@ mod tests { assert_eq!(resource.get("id").unwrap(), "320120"); assert_eq!(resource.get("name").unwrap(), "name"); } + + #[test] + fn test_recursive() { + let mut tree = Tree::new(&ResourceDef::new("/name"), 1); + tree.insert(&ResourceDef::new("/name/"), 2); + tree.insert(&ResourceDef::new("/name/index.html"), 3); + tree.insert(&ResourceDef::prefix("/"), 4); + + assert_eq!(tree.find(&mut Path::new("/name")), Some(1)); + assert_eq!(tree.find(&mut Path::new("/name/")), Some(2)); + assert_eq!(tree.find(&mut Path::new("/name/index.html")), Some(3)); + assert_eq!(tree.find(&mut Path::new("/")), Some(4)); + assert_eq!(tree.find(&mut Path::new("/test")), Some(4)); + assert_eq!(tree.find(&mut Path::new("/test/index.html")), Some(4)); + } } diff --git a/ntex-router/src/tree.rs b/ntex-router/src/tree.rs index 55c82c185..ad1db4458 100644 --- a/ntex-router/src/tree.rs +++ b/ntex-router/src/tree.rs @@ -128,9 +128,16 @@ impl Tree { }; self.children.push(child); } + // update value if key is the same if p == key.len() { - self.value.push(value); + match value { + Value::PrefixSlesh(v) => { + self.children + .push(Tree::child(Vec::new(), Some(Value::Prefix(v)))); + } + value => self.value.push(value), + } } else { // insert into sub tree let mut child = self @@ -316,6 +323,30 @@ impl Tree { R: Resource, F: Fn(usize, &R) -> bool, { + if self.key.is_empty() { + if path.is_empty() { + for val in &self.value { + let v = match val { + Value::Val(v) | Value::Prefix(v) => *v, + _ => continue, + }; + if check(v, resource) { + return Some((v, skip)); + } + } + } else { + for val in &self.value { + let v = match val { + Value::Prefix(v) => *v, + _ => continue, + }; + if check(v, resource) { + return Some((v, skip)); + } + } + } + return None; + } let mut key: &[_] = &self.key; loop {