From b38499e049fbc046c7eda58fd0ca4d39056a6371 Mon Sep 17 00:00:00 2001 From: sgibb Date: Wed, 6 Mar 2024 13:59:18 -0500 Subject: [PATCH] Allow for non-encoded special characters in urls Fixes gh-3185 --- .../mvc/handler/ProxyExchangeHandlerFunction.java | 12 +++++++----- .../server/mvc/ServerMvcIntegrationTests.java | 15 +++++++++++++++ 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/handler/ProxyExchangeHandlerFunction.java b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/handler/ProxyExchangeHandlerFunction.java index 416793db..67c655b4 100644 --- a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/handler/ProxyExchangeHandlerFunction.java +++ b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/handler/ProxyExchangeHandlerFunction.java @@ -29,6 +29,7 @@ import org.springframework.cloud.gateway.server.mvc.filter.HttpHeadersFilter; import org.springframework.cloud.gateway.server.mvc.filter.HttpHeadersFilter.RequestHttpHeadersFilter; import org.springframework.cloud.gateway.server.mvc.filter.HttpHeadersFilter.ResponseHttpHeadersFilter; import org.springframework.http.HttpHeaders; +import org.springframework.util.MultiValueMap; import org.springframework.web.servlet.function.HandlerFunction; import org.springframework.web.servlet.function.ServerRequest; import org.springframework.web.servlet.function.ServerResponse; @@ -66,7 +67,7 @@ public class ProxyExchangeHandlerFunction implements HandlerFunction params) { + String rawQuery = uri.getRawQuery(); + boolean encoded = (rawQuery != null && rawQuery.contains("%")) || (uri.getRawPath() != null && uri.getRawPath().contains("%")); // Verify if it is really fully encoded. Treat partial encoded as unencoded. if (encoded) { try { - UriComponentsBuilder.fromUri(uri).build(true); + UriComponentsBuilder.fromUri(uri).replaceQueryParams(params).build(true); return true; } catch (IllegalArgumentException ignored) { @@ -132,7 +134,7 @@ public class ProxyExchangeHandlerFunction implements HandlerFunction { diff --git a/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/ServerMvcIntegrationTests.java b/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/ServerMvcIntegrationTests.java index ee28356e..9f1fd415 100644 --- a/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/ServerMvcIntegrationTests.java +++ b/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/ServerMvcIntegrationTests.java @@ -670,6 +670,21 @@ public class ServerMvcIntegrationTests { }); } + @SuppressWarnings("rawtypes") + @Test + public void queryParamWithSpecialCharactersWorks() { + restClient.get().uri("/get?myparam= &intlparam=æøå").exchange().expectStatus().isOk().expectBody(Map.class) + .consumeWith(result -> { + Map responseBody = result.getResponseBody(); + assertThat(responseBody).containsKey("args"); + Map args = getMap(responseBody, "args"); + assertThat(args).containsKey("myparam"); + assertThat(args.get("myparam")).isEqualTo(" "); + assertThat(args).containsKey("intlparam"); + assertThat(args.get("intlparam")).isEqualTo("æøå"); + }); + } + @SpringBootConfiguration @EnableAutoConfiguration @LoadBalancerClient(name = "httpbin", configuration = TestLoadBalancerConfig.Httpbin.class)