diff --git a/spring-integration-http/src/main/java/org/springframework/integration/http/outbound/AbstractHttpRequestExecutingMessageHandler.java b/spring-integration-http/src/main/java/org/springframework/integration/http/outbound/AbstractHttpRequestExecutingMessageHandler.java index ae5d131e40..ce76cf5625 100644 --- a/spring-integration-http/src/main/java/org/springframework/integration/http/outbound/AbstractHttpRequestExecutingMessageHandler.java +++ b/spring-integration-http/src/main/java/org/springframework/integration/http/outbound/AbstractHttpRequestExecutingMessageHandler.java @@ -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); diff --git a/spring-integration-http/src/test/java/org/springframework/integration/http/outbound/HttpRequestExecutingMessageHandlerTests.java b/spring-integration-http/src/test/java/org/springframework/integration/http/outbound/HttpRequestExecutingMessageHandlerTests.java index fad55b6775..8a06b141e7 100644 --- a/spring-integration-http/src/test/java/org/springframework/integration/http/outbound/HttpRequestExecutingMessageHandlerTests.java +++ b/spring-integration-http/src/test/java/org/springframework/integration/http/outbound/HttpRequestExecutingMessageHandlerTests.java @@ -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();