HTTP Outbound: Call encode() for URIs

* Encoding in `AbstractHttpRequestExecutingMessageHandler` is now done when flag is set

* Added test for URI Encoding

* Fixed checkstyle violations

**Cherry-pick to 5.1.x**

* Resolve conflicts in the `HttpRequestExecutingMessageHandlerTests`
This commit is contained in:
Florian Schöffl
2019-05-16 19:50:02 +02:00
committed by Artem Bilan
parent 5c1b776df4
commit c2fe7d788b
2 changed files with 51 additions and 1 deletions

View File

@@ -69,6 +69,7 @@ import org.springframework.web.util.UriComponentsBuilder;
* @author Artem Bilan
* @author Wallace Wadge
* @author Shiliang Li
* @author Florian Schöffl
*
* @since 5.0
*/
@@ -303,7 +304,7 @@ public abstract class AbstractHttpRequestExecutingMessageHandler extends Abstrac
: UriComponentsBuilder.fromUri((URI) uri);
UriComponents uriComponents = uriComponentsBuilder.buildAndExpand(uriVariables);
try {
return this.encodeUri ? uriComponents.toUri() : new URI(uriComponents.toUriString());
return this.encodeUri ? uriComponents.encode().toUri() : new URI(uriComponents.toUriString());
}
catch (URISyntaxException e) {
throw new MessageHandlingException(requestMessage, "Invalid URI [" + uri + "]", e);

View File

@@ -78,6 +78,7 @@ import org.springframework.web.client.RestTemplate;
* @author Artem Bilan
* @author Gary Russell
* @author Gunnar Hillert
* @author Florian Schöffl
*/
public class HttpRequestExecutingMessageHandlerTests {
@@ -751,6 +752,54 @@ public class HttpRequestExecutingMessageHandlerTests {
assertEquals(theURL, restTemplate.actualUrl.get());
}
@Test
public void testUriEncoded() {
SpelExpressionParser parser = new SpelExpressionParser();
MockRestTemplate restTemplate = new MockRestTemplate();
HttpRequestExecutingMessageHandler handler = new HttpRequestExecutingMessageHandler(
"http://example.com?query={query}",
restTemplate
);
// This flag is set by default to true, but for sake of clarity for the reader we explicitly set it here again
handler.setEncodeUri(true);
handler.setUriVariableExpressions(Collections.singletonMap("query", parser.parseExpression("payload")));
setBeanFactory(handler);
handler.afterPropertiesSet();
Message<?> message = new GenericMessage<>("test-äöü&%");
try {
handler.handleMessage(message);
}
catch (Exception ignored) {
}
assertEquals("http://example.com?query=test-%C3%A4%C3%B6%C3%BC%26%25", restTemplate.actualUrl.get());
}
@Test
public void testUriEncodedDisabled() {
SpelExpressionParser parser = new SpelExpressionParser();
MockRestTemplate restTemplate = new MockRestTemplate();
HttpRequestExecutingMessageHandler handler = new HttpRequestExecutingMessageHandler(
"http://example.com?query={query}",
restTemplate
);
handler.setEncodeUri(false);
handler.setUriVariableExpressions(Collections.singletonMap("query", parser.parseExpression("payload")));
setBeanFactory(handler);
handler.afterPropertiesSet();
Message<?> message = new GenericMessage<>("test-äöü");
try {
handler.handleMessage(message);
}
catch (Exception ignored) {
}
assertEquals("http://example.com?query=test-äöü", restTemplate.actualUrl.get());
}
@Test
public void testInt2455UriNotEncoded() {
MockRestTemplate restTemplate = new MockRestTemplate();