Fix for encoding issue with MvcUriComponentsBuilder

Provide method for stronger encoding of expanded URI variables when
building links from views.

Issue: SPR-17027
This commit is contained in:
Rossen Stoyanchev 2018-07-19 18:56:08 -04:00
parent 93b7a4838e
commit 07653bfd0c
2 changed files with 26 additions and 2 deletions

View File

@ -868,14 +868,24 @@ public class MvcUriComponentsBuilder {
return this;
}
/**
* Use this method only if you need to apply strong encoding to expanded
* URI variables by quoting all characters with reserved meaning.
* @since 5.0.8
*/
public MethodArgumentBuilder encode() {
this.baseUrl.encode();
return this;
}
public String build() {
return fromMethodInternal(this.baseUrl, this.controllerType, this.method, this.argumentValues)
.build(false).encode().toUriString();
.build().encode().toUriString();
}
public String buildAndExpand(Object... uriVars) {
return fromMethodInternal(this.baseUrl, this.controllerType, this.method, this.argumentValues)
.build(false).expand(uriVars).encode().toString();
.buildAndExpand(uriVars).encode().toString();
}
}

View File

@ -402,6 +402,20 @@ public class MvcUriComponentsBuilderTests {
assertEquals("http://example.org:9999/base/people/123/addresses/DE", url);
}
@Test // SPR-17027
public void fromMappingNameWithEncoding() {
initWebApplicationContext(WebConfig.class);
this.request.setServerName("example.org");
this.request.setServerPort(9999);
this.request.setContextPath("/base");
String mappingName = "PAC#getAddressesForCountry";
String url = fromMappingName(mappingName).arg(0, "DE;FR").encode().buildAndExpand("_+_");
assertEquals("/base/people/_%2B_/addresses/DE%3BFR", url);
}
@Test
public void fromControllerWithPrefix() {