Skip to content

Commit

Permalink
Support path segment URI var expansion in UrlTag
Browse files Browse the repository at this point in the history
Before this change UrlTag expanded URI vars and encoded them using
UriUtils.encodePath.

This change makes it possible to expand using
UriUtils.encodePathSegment, which means a "/" is encoded as "%2F".

To expand with path segment semantics, prefix the URI var name "/":

<spring:url value="/url/path/{/var}">
    <spring:param name="var" value="my/Id" />
</spring:url>

Issue: SPR-11401
rstoyanchev committed May 6, 2014
1 parent 9d479fe commit 426b77b
Showing 2 changed files with 48 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -295,6 +295,18 @@ protected String replaceUriTemplateParams(String uri, List<Param> params, Set<St
throw new JspException(ex);
}
}
else {
template = URL_TEMPLATE_DELIMITER_PREFIX + "/" + param.getName() + URL_TEMPLATE_DELIMITER_SUFFIX;
if (uri.contains(template)) {
usedParams.add(param.getName());
try {
uri = uri.replace(template, UriUtils.encodePathSegment(param.getValue(), encoding));
}
catch (UnsupportedEncodingException ex) {
throw new JspException(ex);
}
}
}
}
return uri;
}
Original file line number Diff line number Diff line change
@@ -431,6 +431,42 @@ public void testReplaceUriTemplateParamsTemplateWithParamMatchValueEncoded()
assertTrue(usedParams.contains("name"));
}

// SPR-11401

public void testReplaceUriTemplateParamsTemplateWithPathSegment()
throws JspException {
List<Param> params = new LinkedList<Param>();
Set<String> usedParams = new HashSet<String>();

Param param = new Param();
param.setName("name");
param.setValue("my/Id");
params.add(param);

String uri = tag.replaceUriTemplateParams("url/{/name}", params, usedParams);

assertEquals("url/my%2FId", uri);
assertEquals(1, usedParams.size());
assertTrue(usedParams.contains("name"));
}

public void testReplaceUriTemplateParamsTemplateWithPath()
throws JspException {
List<Param> params = new LinkedList<Param>();
Set<String> usedParams = new HashSet<String>();

Param param = new Param();
param.setName("name");
param.setValue("my/Id");
params.add(param);

String uri = tag.replaceUriTemplateParams("url/{name}", params, usedParams);

assertEquals("url/my/Id", uri);
assertEquals(1, usedParams.size());
assertTrue(usedParams.contains("name"));
}

public void testCreateUrlRemoteServer() throws JspException {
tag.setValue("http://www.springframework.org/");

0 comments on commit 426b77b

Please sign in to comment.