From a54b9b88e56ae3f448b46b64976fbb9d6bd5622f Mon Sep 17 00:00:00 2001 From: themoffster Date: Wed, 11 Mar 2020 20:26:58 +0000 Subject: [PATCH] Fix RemoveRequestParameterGatewayFilterFactory to deal with query params which require encoding (#1613) The RemoveRequestParameterGatewayFilterFactory class builds up a new URI once it removes the request parameter outlined in the filter config, however currently expects the remaining request parameters to all be encoded and the are not. When the request query params are determined, they are decoded in AbstractServerHttpRequest and are not subsequently encoded again before the filter builds up the URI. Currently when the remaining request parameters have a character which requires encoding, you get an "Invalid character ' ' for QUERY_PARAM" error. Co-authored-by: Alan Moffat --- ...eRequestParameterGatewayFilterFactory.java | 2 +- ...rGatewayFilterFactoryIntegrationTests.java | 3 ++- ...estParameterGatewayFilterFactoryTests.java | 23 +++++++++++++++++++ 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/filter/factory/RemoveRequestParameterGatewayFilterFactory.java b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/filter/factory/RemoveRequestParameterGatewayFilterFactory.java index 7e698a11..c82919e8 100644 --- a/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/filter/factory/RemoveRequestParameterGatewayFilterFactory.java +++ b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/filter/factory/RemoveRequestParameterGatewayFilterFactory.java @@ -61,7 +61,7 @@ public class RemoveRequestParameterGatewayFilterFactory URI newUri = UriComponentsBuilder.fromUri(request.getURI()) .replaceQueryParams(unmodifiableMultiValueMap(queryParams)) - .build(true).toUri(); + .build().toUri(); ServerHttpRequest updatedRequest = exchange.getRequest().mutate() .uri(newUri).build(); diff --git a/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/filter/factory/RemoveRequestParameterGatewayFilterFactoryIntegrationTests.java b/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/filter/factory/RemoveRequestParameterGatewayFilterFactoryIntegrationTests.java index 9d8caab3..f22c0f06 100644 --- a/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/filter/factory/RemoveRequestParameterGatewayFilterFactoryIntegrationTests.java +++ b/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/filter/factory/RemoveRequestParameterGatewayFilterFactoryIntegrationTests.java @@ -47,11 +47,12 @@ public class RemoveRequestParameterGatewayFilterFactoryIntegrationTests @Test public void removeResponseHeaderFilterWorks() { - testClient.get().uri("/get?foo=bar&baz=bam") + testClient.get().uri("/get?foo=bar&baz=bam%20bar") .header("Host", "www.removerequestparamjava.org").exchange() .expectStatus().isOk().expectBody(Map.class).consumeWith(result -> { Map params = getMap(result.getResponseBody(), "args"); assertThat(params).doesNotContainKey("foo"); + assertThat(params).containsEntry("baz", "bam%20bar"); }); } diff --git a/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/filter/factory/RemoveRequestParameterGatewayFilterFactoryTests.java b/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/filter/factory/RemoveRequestParameterGatewayFilterFactoryTests.java index 0b2b4192..f432b816 100644 --- a/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/filter/factory/RemoveRequestParameterGatewayFilterFactoryTests.java +++ b/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/filter/factory/RemoveRequestParameterGatewayFilterFactoryTests.java @@ -103,4 +103,27 @@ public class RemoveRequestParameterGatewayFilterFactoryTests { singletonList("xyz")); } + @Test + public void removeRequestParameterFilterShouldHandleRemainingParamsWhichRequiringEncoding() { + MockServerHttpRequest request = MockServerHttpRequest.get("http://localhost") + .queryParam("foo", "bar").queryParam("aaa", "abc xyz") + .queryParam("bbb", "[xyz").queryParam("ccc", ",xyz").build(); + exchange = MockServerWebExchange.from(request); + NameConfig config = new NameConfig(); + config.setName("foo"); + GatewayFilter filter = new RemoveRequestParameterGatewayFilterFactory() + .apply(config); + + filter.filter(exchange, filterChain); + + ServerHttpRequest actualRequest = captor.getValue().getRequest(); + assertThat(actualRequest.getQueryParams()).doesNotContainKey("foo"); + assertThat(actualRequest.getQueryParams()).containsEntry("aaa", + singletonList("abc xyz")); + assertThat(actualRequest.getQueryParams()).containsEntry("bbb", + singletonList("[xyz")); + assertThat(actualRequest.getQueryParams()).containsEntry("ccc", + singletonList(",xyz")); + } + }