From 426b77b83405b1b4778a96e5dc7075f553d79211 Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Tue, 6 May 2014 19:41:17 -0400 Subject: [PATCH] Support path segment URI var expansion in UrlTag 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 "/": Issue: SPR-11401 --- .../web/servlet/tags/UrlTag.java | 12 +++++++ .../web/servlet/tags/UrlTagTests.java | 36 +++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/UrlTag.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/UrlTag.java index 30b15bf6cf..45fb84102a 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/UrlTag.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/UrlTag.java @@ -295,6 +295,18 @@ public class UrlTag extends HtmlEscapingAwareTag implements ParamAware { 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; } diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/tags/UrlTagTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/tags/UrlTagTests.java index a9d33ebd98..db5ee2cf29 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/tags/UrlTagTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/tags/UrlTagTests.java @@ -431,6 +431,42 @@ public class UrlTagTests extends AbstractTagTests { assertTrue(usedParams.contains("name")); } + // SPR-11401 + + public void testReplaceUriTemplateParamsTemplateWithPathSegment() + throws JspException { + List params = new LinkedList(); + Set usedParams = new HashSet(); + + 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 params = new LinkedList(); + Set usedParams = new HashSet(); + + 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/");