Skip to content

Commit 5787fc1

Browse files
committed
PathPatternRouteMatcher should use custom separator
Prior to this commit, the `PathPatternRouteMatcher` would always use the default path pattern separator when parsing incoming route strings to `RouteMatcher.Route` instances. When the `PathPatternRouteMatcher` is configured with a `PathPatternParser` that has a custom separator (e.g., `.`), then the matching algorithm can't match routes against parsed patterns. This commit ensures that the route matcher uses the configured separator at all times. Fixes gh-23167
1 parent f56c54d commit 5787fc1

File tree

2 files changed

+53
-1
lines changed

2 files changed

+53
-1
lines changed

spring-web/src/main/java/org/springframework/web/util/pattern/PathPatternRouteMatcher.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,18 +36,21 @@ public class PathPatternRouteMatcher implements RouteMatcher {
3636

3737
private final PathPatternParser parser;
3838

39+
private final String separator;
40+
3941
private final Map<String, PathPattern> pathPatternCache = new ConcurrentHashMap<>();
4042

4143

4244
public PathPatternRouteMatcher(PathPatternParser parser) {
4345
Assert.notNull(parser, "PathPatternParser must not be null");
4446
this.parser = parser;
47+
this.separator = String.valueOf(parser.getSeparator());
4548
}
4649

4750

4851
@Override
4952
public Route parseRoute(String routeValue) {
50-
return new PathContainerRoute(PathContainer.parsePath(routeValue));
53+
return new PathContainerRoute(PathContainer.parsePath(routeValue, this.separator));
5154
}
5255

5356
@Override
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
/*
2+
* Copyright 2002-2019 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.springframework.web.util.pattern;
18+
19+
import org.junit.Test;
20+
21+
import org.springframework.util.RouteMatcher;
22+
23+
import static org.assertj.core.api.Assertions.assertThat;
24+
25+
26+
/**
27+
* Tests for the {@link PathPatternRouteMatcher}
28+
* @author Brian Clozel
29+
*/
30+
public class PathPatternRouteMatcherTest {
31+
32+
PathPatternRouteMatcher routeMatcher = new PathPatternRouteMatcher(new PathPatternParser());
33+
34+
@Test
35+
public void matchRoute() {
36+
RouteMatcher.Route route = routeMatcher.parseRoute("/projects/spring-framework");
37+
assertThat(routeMatcher.match("/projects/{name}", route)).isTrue();
38+
}
39+
40+
@Test
41+
public void matchRouteCustomSeparator() {
42+
PathPatternParser pathPatternParser = new PathPatternParser();
43+
pathPatternParser.setSeparator('.');
44+
PathPatternRouteMatcher routeMatcher = new PathPatternRouteMatcher(pathPatternParser);
45+
RouteMatcher.Route route = routeMatcher.parseRoute("projects.spring-framework");
46+
assertThat(routeMatcher.match("projects.{name}", route)).isTrue();
47+
}
48+
49+
}

0 commit comments

Comments
 (0)