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
  • Loading branch information
rstoyanchev committed May 6, 2014
1 parent 9d479fe commit 426b77b
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 0 deletions.
Expand Up @@ -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;
}
Expand Down
Expand Up @@ -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/");

Expand Down

0 comments on commit 426b77b

Please sign in to comment.