diff --git a/src/com/googlecode/utterlyidle/UriTemplate.java b/src/com/googlecode/utterlyidle/UriTemplate.java index ddfd9829..8b7bed17 100644 --- a/src/com/googlecode/utterlyidle/UriTemplate.java +++ b/src/com/googlecode/utterlyidle/UriTemplate.java @@ -10,6 +10,7 @@ import java.util.List; import java.util.regex.MatchResult; import java.util.regex.Pattern; +import java.util.stream.Collectors; import static com.googlecode.totallylazy.regex.Regex.regex; import static com.googlecode.utterlyidle.PathParameters.pathParameters; @@ -44,7 +45,10 @@ public boolean matches(final String uri) { } public PathParameters extract(String uri) { - List values = groupValues(templateRegex.findMatches(UrlEncodedMessage.decode(trimSlashes(uri))).head()); + List values = groupValues(templateRegex.findMatches(trimSlashes(uri)).head()) + .stream() + .map(UrlEncodedMessage::decode) + .collect(Collectors.toList()); return pathParameters(names.zip(values)); } diff --git a/test/com/googlecode/utterlyidle/UriTemplateTest.java b/test/com/googlecode/utterlyidle/UriTemplateTest.java index 82f6f55b..23998a1c 100644 --- a/test/com/googlecode/utterlyidle/UriTemplateTest.java +++ b/test/com/googlecode/utterlyidle/UriTemplateTest.java @@ -134,6 +134,14 @@ public void canExtractFromUriWithEncodedSpace() { assertThat(template.extract("path/foo+bar").getValue("id1"), is("foo bar")); } + @Test + public void canExtractFromUriWithEncodedSlash() { + UriTemplate template = uriTemplate("path/{id1}"); + PathParameters pathParameters = template.extract("path/foo%2Fbar"); + String id1 = pathParameters.getValue("id1"); + assertThat(id1, is("foo/bar")); + } + @Test public void canGenerateUri() { UriTemplate template = uriTemplate("path/{id}");