From 740cb0fd3364f8bed832bfe31130dd80c020ded5 Mon Sep 17 00:00:00 2001 From: Nikolay Kim Date: Mon, 6 Apr 2020 12:51:50 +0600 Subject: [PATCH] Fix IdxSegment item for paths with no root --- ntex-router/CHANGES.txt | 4 ++++ ntex-router/Cargo.toml | 2 +- ntex-router/src/resource.rs | 40 +++++++++++++++++++++++++++++++++++++ ntex-router/src/tree.rs | 10 ++++++---- 4 files changed, 51 insertions(+), 5 deletions(-) diff --git a/ntex-router/CHANGES.txt b/ntex-router/CHANGES.txt index 69011d66f..890600213 100644 --- a/ntex-router/CHANGES.txt +++ b/ntex-router/CHANGES.txt @@ -1,5 +1,9 @@ # Changes +## [0.3.2] - 2020-04-06 + +* Fix IdxSegment item for paths with no root + ## [0.3.1] - 2020-04-06 * Fix url quoter diff --git a/ntex-router/Cargo.toml b/ntex-router/Cargo.toml index f90d56295..3f94bd671 100644 --- a/ntex-router/Cargo.toml +++ b/ntex-router/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ntex-router" -version = "0.3.1" +version = "0.3.2" authors = ["Nikolay Kim "] description = "Path router" keywords = ["ntex"] diff --git a/ntex-router/src/resource.rs b/ntex-router/src/resource.rs index 7488d580d..207a3f2f7 100644 --- a/ntex-router/src/resource.rs +++ b/ntex-router/src/resource.rs @@ -890,9 +890,49 @@ mod tests { assert_eq!(tree.find(&mut Path::new("/user/profile")), Some(1)); assert_eq!(tree.find(&mut Path::new("/user/profile/profile")), None); + let tree = Tree::new(&ResourceDef::new("{id}"), 1); + assert_eq!(tree.find(&mut Path::new("profile")), Some(1)); + assert_eq!(tree.find(&mut Path::new("2345")), Some(1)); + assert_eq!(tree.find(&mut Path::new("/2345/")), None); + assert_eq!(tree.find(&mut Path::new("/2345/sdg")), None); + let tree = Tree::new(&ResourceDef::new("{user}/profile/{no}"), 1); assert_eq!(tree.find(&mut Path::new("user/profile/123")), Some(1)); assert_eq!(tree.find(&mut Path::new("/user/profile/123")), Some(1)); assert_eq!(tree.find(&mut Path::new("/user/profile/p/test/")), None); + + let tree = Tree::new(&ResourceDef::new("v{version}/resource/{id}/test"), 1); + assert_eq!( + tree.find(&mut Path::new("v1/resource/320120/test")), + Some(1) + ); + assert_eq!(tree.find(&mut Path::new("v/resource/1/test")), None); + + let mut resource = Path::new("v151/resource/adahg32/test"); + assert_eq!(tree.find(&mut resource), Some(1)); + assert_eq!(resource.get("version").unwrap(), "151"); + assert_eq!(resource.get("id").unwrap(), "adahg32"); + + let re = ResourceDef::new("v/{id:[[:digit:]]{6}}"); + let tree = Tree::new(&re, 1); + assert_eq!(tree.find(&mut Path::new("v/012345")), Some(1)); + assert_eq!(tree.find(&mut Path::new("v/012345/")), None); + assert_eq!(tree.find(&mut Path::new("v/012345/index")), None); + assert_eq!(tree.find(&mut Path::new("v/012")), None); + assert_eq!(tree.find(&mut Path::new("v/01234567")), None); + assert_eq!(tree.find(&mut Path::new("v/XXXXXX")), None); + + let mut resource = Path::new("v/012345"); + assert_eq!(tree.find(&mut resource), Some(1)); + assert_eq!(resource.get("id").unwrap(), "012345"); + + let re = ResourceDef::new("u/test/v{version}-no-{minor}xx/resource/{id}/{name}"); + let tree = Tree::new(&re, 1); + let mut resource = Path::new("u/test/v1-no-3xx/resource/320120/name"); + assert_eq!(tree.find(&mut resource), Some(1)); + assert_eq!(resource.get("version").unwrap(), "1"); + assert_eq!(resource.get("minor").unwrap(), "3"); + assert_eq!(resource.get("id").unwrap(), "320120"); + assert_eq!(resource.get("name").unwrap(), "name"); } } diff --git a/ntex-router/src/tree.rs b/ntex-router/src/tree.rs index 7352b1de4..d03b5c044 100644 --- a/ntex-router/src/tree.rs +++ b/ntex-router/src/tree.rs @@ -200,7 +200,7 @@ impl Tree { F: Fn(usize, &R) -> bool, { let path = resource.resource_path(); - let base_skip = path.skip; + let mut base_skip = path.skip as isize; let mut segments = mem::take(&mut path.segments); let path = resource.path(); @@ -230,6 +230,7 @@ impl Tree { let path = if path.starts_with('/') { &path[1..] } else { + base_skip -= 1; path }; @@ -267,6 +268,7 @@ impl Tree { let path = if path.starts_with('/') { &path[1..] } else { + base_skip -= 1; path }; @@ -296,7 +298,7 @@ impl Tree { mut skip: usize, segments: &mut Vec<(&'static str, PathItem)>, insensitive: bool, - base_skip: u16, + base_skip: isize, ) -> Option<(usize, usize)> where T: ResourcePath, @@ -344,8 +346,8 @@ impl Tree { PathItem::Segment(m.as_str().to_string()) } else { PathItem::IdxSegment( - base_skip + (skip + m.start()) as u16, - base_skip + (skip + m.end()) as u16, + (base_skip + (skip + m.start()) as isize) as u16, + (base_skip + (skip + m.end()) as isize) as u16, ) }; segments.push((name, item));