Allow separator configuration in PathPatternParser

This commit allows to configure a custom path separator when parsing and
matching path patterns with `PathPatternParser`, but also when parsing
incoming paths as `PathContainer` instances.

Closes gh-23092
This commit is contained in:
Brian Clozel
2019-06-06 11:39:53 +02:00
parent ec91934730
commit 33becd8258
5 changed files with 63 additions and 18 deletions

View File

@@ -27,6 +27,7 @@ import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
/**
* Unit tests for {@link DefaultPathContainer}.
@@ -111,15 +112,18 @@ public class DefaultPathContainerTests {
testPath("//%20/%20", "//%20/%20", Arrays.asList("/", "/", "%20", "/", "%20"));
}
private void testPath(String input, String value, List<String> expectedElements) {
PathContainer path = PathContainer.parsePath(input);
private void testPath(String input, String separator, String value, List<String> expectedElements) {
PathContainer path = PathContainer.parsePath(input, separator);
assertThat(path.value()).as("value: '" + input + "'").isEqualTo(value);
assertThat(path.elements().stream()
.map(PathContainer.Element::value).collect(Collectors.toList())).as("elements: " + input).isEqualTo(expectedElements);
}
private void testPath(String input, String value, List<String> expectedElements) {
testPath(input, "/", value, expectedElements);
}
@Test
public void subPath() throws Exception {
// basic
@@ -137,4 +141,14 @@ public class DefaultPathContainerTests {
assertThat(path.subPath(2).value()).isEqualTo("/b/");
}
@Test
public void pathWithCustomSeparator() throws Exception {
testPath("a.b.c", ".", "a.b.c", Arrays.asList("a", ".", "b", ".", "c"));
}
@Test
public void emptySeparator() {
assertThatIllegalArgumentException().isThrownBy(() -> PathContainer.parsePath("path", ""));
}
}

View File

@@ -408,6 +408,15 @@ public class PathPatternParserTests {
assertThat(patterns.get(1)).isEqualTo(p2);
}
@Test
public void separatorTests() {
PathPatternParser parser = new PathPatternParser();
parser.setSeparator('.');
String rawPattern = "first.second.{last}";
PathPattern pattern = parser.parse(rawPattern);
assertThat(pattern.computePatternString()).isEqualTo(rawPattern);
}
private PathPattern parse(String pattern) {
PathPatternParser patternParser = new PathPatternParser();
return patternParser.parse(pattern);