Refine UriTemplate match pattern
The match/matches methods of UriTemplate use a regex with (.*) in place of URI variables, which work fine except in the end where such a pattern can match greedily more than one segment. This commit updates the regex to use ([^/]*) instead since URI variables are only meant to be used within a single path segment. Issue: SPR-16169
This commit is contained in:
parent
84b8ceca0f
commit
c60313de3f
|
@ -212,7 +212,7 @@ public class UriTemplate implements Serializable {
|
||||||
String variable = builder.toString();
|
String variable = builder.toString();
|
||||||
int idx = variable.indexOf(':');
|
int idx = variable.indexOf(':');
|
||||||
if (idx == -1) {
|
if (idx == -1) {
|
||||||
pattern.append("(.*)");
|
pattern.append("([^/]*)");
|
||||||
variableNames.add(variable);
|
variableNames.add(variable);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
|
@ -153,9 +153,7 @@ public class UriTemplateTests {
|
||||||
assertEquals("Invalid match", expected, result);
|
assertEquals("Invalid match", expected, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
// SPR-13627
|
@Test // SPR-13627
|
||||||
|
|
||||||
@Test
|
|
||||||
public void matchCustomRegexWithNestedCurlyBraces() throws Exception {
|
public void matchCustomRegexWithNestedCurlyBraces() throws Exception {
|
||||||
UriTemplate template = new UriTemplate("/site.{domain:co.[a-z]{2}}");
|
UriTemplate template = new UriTemplate("/site.{domain:co.[a-z]{2}}");
|
||||||
Map<String, String> result = template.match("/site.co.eu");
|
Map<String, String> result = template.match("/site.co.eu");
|
||||||
|
@ -180,6 +178,12 @@ public class UriTemplateTests {
|
||||||
assertEquals("Invalid match", expected, result);
|
assertEquals("Invalid match", expected, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test // SPR-16169
|
||||||
|
public void matchWithMultipleSegmentsAtTheEnd() {
|
||||||
|
UriTemplate template = new UriTemplate("/account/{accountId}");
|
||||||
|
assertFalse(template.matches("/account/15/alias/5"));
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void queryVariables() throws Exception {
|
public void queryVariables() throws Exception {
|
||||||
UriTemplate template = new UriTemplate("/search?q={query}");
|
UriTemplate template = new UriTemplate("/search?q={query}");
|
||||||
|
@ -195,9 +199,7 @@ public class UriTemplateTests {
|
||||||
assertTrue(template.matches("/search?query=foo#bar"));
|
assertTrue(template.matches("/search?query=foo#bar"));
|
||||||
}
|
}
|
||||||
|
|
||||||
// SPR-13705
|
@Test // SPR-13705
|
||||||
|
|
||||||
@Test
|
|
||||||
public void matchesWithSlashAtTheEnd() {
|
public void matchesWithSlashAtTheEnd() {
|
||||||
UriTemplate uriTemplate = new UriTemplate("/test/");
|
UriTemplate uriTemplate = new UriTemplate("/test/");
|
||||||
assertTrue(uriTemplate.matches("/test/"));
|
assertTrue(uriTemplate.matches("/test/"));
|
||||||
|
|
Loading…
Reference in New Issue