Empty path should match the "/" PathPattern
This commit makes both slash "/" and empty "" request paths match the "/" `PathPattern`. Issue: SPR-15653
This commit is contained in:
		
							parent
							
								
									b85764c7db
								
							
						
					
					
						commit
						07b961caa6
					
				| 
						 | 
				
			
			@ -156,7 +156,6 @@ public class PathPattern implements Comparable<PathPattern> {
 | 
			
		|||
		return this.patternString;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Whether this pattern matches the given path.
 | 
			
		||||
	 * @param pathContainer the candidate path to attempt to match against
 | 
			
		||||
| 
						 | 
				
			
			@ -164,7 +163,8 @@ public class PathPattern implements Comparable<PathPattern> {
 | 
			
		|||
	 */
 | 
			
		||||
	public boolean matches(PathContainer pathContainer) {
 | 
			
		||||
		if (this.head == null) {
 | 
			
		||||
			return !hasLength(pathContainer);
 | 
			
		||||
			return !hasLength(pathContainer) || 
 | 
			
		||||
				(this.matchOptionalTrailingSeparator && pathContainerIsJustSeparator(pathContainer));
 | 
			
		||||
		}
 | 
			
		||||
		else if (!hasLength(pathContainer)) {
 | 
			
		||||
			if (this.head instanceof WildcardTheRestPathElement || this.head instanceof CaptureTheRestPathElement) {
 | 
			
		||||
| 
						 | 
				
			
			@ -187,7 +187,9 @@ public class PathPattern implements Comparable<PathPattern> {
 | 
			
		|||
	@Nullable
 | 
			
		||||
	public PathMatchInfo matchAndExtract(PathContainer pathContainer) {
 | 
			
		||||
		if (this.head == null) {
 | 
			
		||||
			return hasLength(pathContainer) ? null : PathMatchInfo.EMPTY;
 | 
			
		||||
			return hasLength(pathContainer) &&
 | 
			
		||||
				!(this.matchOptionalTrailingSeparator && pathContainerIsJustSeparator(pathContainer))
 | 
			
		||||
				? null : PathMatchInfo.EMPTY;
 | 
			
		||||
		}
 | 
			
		||||
		else if (!hasLength(pathContainer)) {
 | 
			
		||||
			if (this.head instanceof WildcardTheRestPathElement || this.head instanceof CaptureTheRestPathElement) {
 | 
			
		||||
| 
						 | 
				
			
			@ -708,5 +710,10 @@ public class PathPattern implements Comparable<PathPattern> {
 | 
			
		|||
	private static int scoreByNormalizedLength(PathPattern pattern) {
 | 
			
		||||
		return -pattern.getNormalizedLength();
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	private boolean pathContainerIsJustSeparator(PathContainer pathContainer) {
 | 
			
		||||
		return pathContainer.value().length() == 1 && 
 | 
			
		||||
				pathContainer.value().charAt(0) == separator;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -77,6 +77,7 @@ public class PathPatternTests {
 | 
			
		|||
	@Test
 | 
			
		||||
	public void basicMatching() {
 | 
			
		||||
		checkMatches("", "");
 | 
			
		||||
		checkMatches("", "/");
 | 
			
		||||
		checkMatches("", null);
 | 
			
		||||
		checkNoMatch("/abc", "/");
 | 
			
		||||
		checkMatches("/", "/");
 | 
			
		||||
| 
						 | 
				
			
			@ -1113,9 +1114,13 @@ public class PathPatternTests {
 | 
			
		|||
		result = matchAndExtract("/abc/{var}","/abc/one");
 | 
			
		||||
		assertEquals("one",result.getUriVariables().get("var"));
 | 
			
		||||
		assertNull(result.getMatrixVariables().get("var"));
 | 
			
		||||
		
 | 
			
		||||
		result = matchAndExtract("","");
 | 
			
		||||
		assertNotNull(result);
 | 
			
		||||
		result = matchAndExtract("","/");
 | 
			
		||||
		assertNotNull(result);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	private PathPattern.PathMatchInfo matchAndExtract(String pattern, String path) {
 | 
			
		||||
		 return parse(pattern).matchAndExtract(PathPatternTests.toPathContainer(path));
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue