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 09c787c30f..9ad7a5bb4f 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 @@ -73,6 +73,7 @@ import org.springframework.web.util.UriComponentsBuilder; * @author Artem Bilan * @author Wallace Wadge * @author Shiliang Li + * @author Florian Schöffl * * @since 5.0 */ @@ -301,7 +302,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 b7dc9020c8..9fb845f90d 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 @@ -73,6 +73,7 @@ import org.springframework.web.client.RestTemplate; * @author Artem Bilan * @author Gary Russell * @author Gunnar Hillert + * @author Florian Schöffl */ public class HttpRequestExecutingMessageHandlerTests { @@ -746,6 +747,54 @@ public class HttpRequestExecutingMessageHandlerTests { assertThat(restTemplate.actualUrl.get()).isEqualTo(theURL); } + @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) { + } + assertThat(restTemplate.actualUrl.get()).isEqualTo("http://example.com?query=test-%C3%A4%C3%B6%C3%BC%26%25"); + } + + @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) { + } + assertThat(restTemplate.actualUrl.get()).isEqualTo("http://example.com?query=test-äöü"); + } + @Test public void testInt2455UriNotEncoded() { MockRestTemplate restTemplate = new MockRestTemplate();