From bb1f53ef30a3dd0fcc2abce3870a20ca00799ef3 Mon Sep 17 00:00:00 2001 From: sunhao1256 Date: Thu, 1 Feb 2024 10:35:57 +0800 Subject: [PATCH 1/6] feat: add condition replaceQueryParams for ProxyExchangeHandlerFunction constructor --- .../handler/ProxyExchangeHandlerFunction.java | 27 +++++++++++++++---- 1 file 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 416793db99..d6c4ac7a70 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 @@ -34,6 +34,8 @@ import org.springframework.web.servlet.function.ServerResponse; import org.springframework.web.util.UriComponentsBuilder; +import javax.xml.transform.URIResolver; + public class ProxyExchangeHandlerFunction implements HandlerFunction { private static final Log log = LogFactory.getLog(ProxyExchangeHandlerFunction.class); @@ -46,6 +48,8 @@ public class ProxyExchangeHandlerFunction implements HandlerFunction requestHttpHeadersFilters, ObjectProvider responseHttpHeadersFilters) { @@ -57,10 +61,18 @@ public ProxyExchangeHandlerFunction(ProxyExchange proxyExchange, public ProxyExchangeHandlerFunction(ProxyExchange proxyExchange, ObjectProvider requestHttpHeadersFilters, ObjectProvider responseHttpHeadersFilters, URIResolver uriResolver) { + this(proxyExchange,requestHttpHeadersFilters,responseHttpHeadersFilters,uriResolver,true); + } + + public ProxyExchangeHandlerFunction(ProxyExchange proxyExchange, + ObjectProvider requestHttpHeadersFilters, + ObjectProvider responseHttpHeadersFilters, URIResolver uriResolver, + Boolean replaceQueryParams) { this.proxyExchange = proxyExchange; this.requestHttpHeadersFilters = requestHttpHeadersFilters; this.responseHttpHeadersFilters = responseHttpHeadersFilters; this.uriResolver = uriResolver; + this.replaceQueryParams = replaceQueryParams; } @Override @@ -68,13 +80,18 @@ public ServerResponse handle(ServerRequest serverRequest) { URI uri = uriResolver.apply(serverRequest); boolean encoded = containsEncodedQuery(serverRequest.uri()); // @formatter:off - URI url = UriComponentsBuilder.fromUri(serverRequest.uri()) + UriComponentsBuilder builder= UriComponentsBuilder.fromUri(serverRequest.uri()) .scheme(uri.getScheme()) .host(uri.getHost()) - .port(uri.getPort()) - .replaceQueryParams(serverRequest.params()) - .build(encoded) - .toUri(); + .port(uri.getPort()); + + if (replaceQueryParams){ + builder.replaceQueryParams(serverRequest.params()); + } + + URI url = builder + .build(encoded) + .toUri(); // @formatter:on // TODO: Streams.collect()? From 6fae7dc66c48ef1700e7003d8343e08136cd6391 Mon Sep 17 00:00:00 2001 From: sunhao1256 Date: Thu, 1 Feb 2024 10:39:02 +0800 Subject: [PATCH 2/6] Revert "feat: add condition replaceQueryParams for ProxyExchangeHandlerFunction constructor" This reverts commit bb1f53ef30a3dd0fcc2abce3870a20ca00799ef3. --- .../handler/ProxyExchangeHandlerFunction.java | 27 ++++--------------- 1 file changed, 5 insertions(+), 22 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 d6c4ac7a70..416793db99 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 @@ -34,8 +34,6 @@ import org.springframework.web.servlet.function.ServerResponse; import org.springframework.web.util.UriComponentsBuilder; -import javax.xml.transform.URIResolver; - public class ProxyExchangeHandlerFunction implements HandlerFunction { private static final Log log = LogFactory.getLog(ProxyExchangeHandlerFunction.class); @@ -48,8 +46,6 @@ public class ProxyExchangeHandlerFunction implements HandlerFunction requestHttpHeadersFilters, ObjectProvider responseHttpHeadersFilters) { @@ -61,18 +57,10 @@ public ProxyExchangeHandlerFunction(ProxyExchange proxyExchange, public ProxyExchangeHandlerFunction(ProxyExchange proxyExchange, ObjectProvider requestHttpHeadersFilters, ObjectProvider responseHttpHeadersFilters, URIResolver uriResolver) { - this(proxyExchange,requestHttpHeadersFilters,responseHttpHeadersFilters,uriResolver,true); - } - - public ProxyExchangeHandlerFunction(ProxyExchange proxyExchange, - ObjectProvider requestHttpHeadersFilters, - ObjectProvider responseHttpHeadersFilters, URIResolver uriResolver, - Boolean replaceQueryParams) { this.proxyExchange = proxyExchange; this.requestHttpHeadersFilters = requestHttpHeadersFilters; this.responseHttpHeadersFilters = responseHttpHeadersFilters; this.uriResolver = uriResolver; - this.replaceQueryParams = replaceQueryParams; } @Override @@ -80,18 +68,13 @@ public ServerResponse handle(ServerRequest serverRequest) { URI uri = uriResolver.apply(serverRequest); boolean encoded = containsEncodedQuery(serverRequest.uri()); // @formatter:off - UriComponentsBuilder builder= UriComponentsBuilder.fromUri(serverRequest.uri()) + URI url = UriComponentsBuilder.fromUri(serverRequest.uri()) .scheme(uri.getScheme()) .host(uri.getHost()) - .port(uri.getPort()); - - if (replaceQueryParams){ - builder.replaceQueryParams(serverRequest.params()); - } - - URI url = builder - .build(encoded) - .toUri(); + .port(uri.getPort()) + .replaceQueryParams(serverRequest.params()) + .build(encoded) + .toUri(); // @formatter:on // TODO: Streams.collect()? From 375a94d9fc082ae67c9b176f4e2c2b450d45a210 Mon Sep 17 00:00:00 2001 From: sunhao1256 Date: Thu, 1 Feb 2024 10:39:55 +0800 Subject: [PATCH 3/6] feat: add condition replaceQueryParams for ProxyExchangeHandlerFunction constructor --- .../handler/ProxyExchangeHandlerFunction.java | 25 +++++++++++++++---- 1 file changed, 20 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 416793db99..44ce6f029d 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 @@ -46,6 +46,8 @@ public class ProxyExchangeHandlerFunction implements HandlerFunction requestHttpHeadersFilters, ObjectProvider responseHttpHeadersFilters) { @@ -57,10 +59,18 @@ public ProxyExchangeHandlerFunction(ProxyExchange proxyExchange, public ProxyExchangeHandlerFunction(ProxyExchange proxyExchange, ObjectProvider requestHttpHeadersFilters, ObjectProvider responseHttpHeadersFilters, URIResolver uriResolver) { + this(proxyExchange,requestHttpHeadersFilters,responseHttpHeadersFilters,uriResolver,true); + } + + public ProxyExchangeHandlerFunction(ProxyExchange proxyExchange, + ObjectProvider requestHttpHeadersFilters, + ObjectProvider responseHttpHeadersFilters, URIResolver uriResolver, + Boolean replaceQueryParams) { this.proxyExchange = proxyExchange; this.requestHttpHeadersFilters = requestHttpHeadersFilters; this.responseHttpHeadersFilters = responseHttpHeadersFilters; this.uriResolver = uriResolver; + this.replaceQueryParams = replaceQueryParams; } @Override @@ -68,13 +78,18 @@ public ServerResponse handle(ServerRequest serverRequest) { URI uri = uriResolver.apply(serverRequest); boolean encoded = containsEncodedQuery(serverRequest.uri()); // @formatter:off - URI url = UriComponentsBuilder.fromUri(serverRequest.uri()) + UriComponentsBuilder builder= UriComponentsBuilder.fromUri(serverRequest.uri()) .scheme(uri.getScheme()) .host(uri.getHost()) - .port(uri.getPort()) - .replaceQueryParams(serverRequest.params()) - .build(encoded) - .toUri(); + .port(uri.getPort()); + + if (replaceQueryParams){ + builder.replaceQueryParams(serverRequest.params()); + } + + URI url = builder + .build(encoded) + .toUri(); // @formatter:on // TODO: Streams.collect()? From 64641db5d5c8c92c188ddab392d390f2a7a6e957 Mon Sep 17 00:00:00 2001 From: sunhao1256 Date: Thu, 1 Feb 2024 10:51:28 +0800 Subject: [PATCH 4/6] fix: combine the form map and queryParams to pass to RequestWrapper --- .../gateway/server/mvc/filter/FormFilter.java | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/FormFilter.java b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/FormFilter.java index 9191f5ae70..e1ab54528d 100644 --- a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/FormFilter.java +++ b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/FormFilter.java @@ -24,13 +24,7 @@ import java.net.URLEncoder; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; -import java.util.Arrays; -import java.util.Collections; -import java.util.Enumeration; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import jakarta.servlet.Filter; import jakarta.servlet.FilterChain; @@ -48,6 +42,7 @@ import org.springframework.http.HttpMethod; import org.springframework.http.MediaType; import org.springframework.lang.Nullable; +import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.util.StringUtils; import org.springframework.web.util.UriComponentsBuilder; @@ -151,9 +146,15 @@ static HttpServletRequest getRequestWithBodyFromRequestParameters(HttpServletReq } writer.flush(); + MultiValueMap combineQueryParams = new LinkedMultiValueMap<>(); + for (Map.Entry entry : form.entrySet()) { + combineQueryParams.put(entry.getKey(),new ArrayList<>(Arrays.asList(entry.getValue()))); + } + combineQueryParams.addAll(queryParams); + ByteArrayServletInputStream servletInputStream = new ByteArrayServletInputStream( new ByteArrayInputStream(bos.toByteArray())); - return new FormContentRequestWrapper(request, queryParams) { + return new FormContentRequestWrapper(request, combineQueryParams) { @Override public ServletInputStream getInputStream() throws IOException { return servletInputStream; From 6107a19afce8963600e37230628d89e38364ac84 Mon Sep 17 00:00:00 2001 From: sunhao1256 Date: Thu, 1 Feb 2024 10:55:37 +0800 Subject: [PATCH 5/6] Revert "fix: combine the form map and queryParams to pass to RequestWrapper" This reverts commit 64641db5d5c8c92c188ddab392d390f2a7a6e957. --- .../gateway/server/mvc/filter/FormFilter.java | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/FormFilter.java b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/FormFilter.java index e1ab54528d..9191f5ae70 100644 --- a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/FormFilter.java +++ b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/FormFilter.java @@ -24,7 +24,13 @@ import java.net.URLEncoder; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; -import java.util.*; +import java.util.Arrays; +import java.util.Collections; +import java.util.Enumeration; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; import jakarta.servlet.Filter; import jakarta.servlet.FilterChain; @@ -42,7 +48,6 @@ import org.springframework.http.HttpMethod; import org.springframework.http.MediaType; import org.springframework.lang.Nullable; -import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.util.StringUtils; import org.springframework.web.util.UriComponentsBuilder; @@ -146,15 +151,9 @@ static HttpServletRequest getRequestWithBodyFromRequestParameters(HttpServletReq } writer.flush(); - MultiValueMap combineQueryParams = new LinkedMultiValueMap<>(); - for (Map.Entry entry : form.entrySet()) { - combineQueryParams.put(entry.getKey(),new ArrayList<>(Arrays.asList(entry.getValue()))); - } - combineQueryParams.addAll(queryParams); - ByteArrayServletInputStream servletInputStream = new ByteArrayServletInputStream( new ByteArrayInputStream(bos.toByteArray())); - return new FormContentRequestWrapper(request, combineQueryParams) { + return new FormContentRequestWrapper(request, queryParams) { @Override public ServletInputStream getInputStream() throws IOException { return servletInputStream; From 6c03279d3764a2f96936e23be38229196682ee42 Mon Sep 17 00:00:00 2001 From: sunhao1256 Date: Thu, 1 Feb 2024 14:10:53 +0800 Subject: [PATCH 6/6] fix: fix checkstyle error --- .../handler/ProxyExchangeHandlerFunction.java | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 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 44ce6f029d..1c6152a6b7 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 @@ -59,13 +59,13 @@ public ProxyExchangeHandlerFunction(ProxyExchange proxyExchange, public ProxyExchangeHandlerFunction(ProxyExchange proxyExchange, ObjectProvider requestHttpHeadersFilters, ObjectProvider responseHttpHeadersFilters, URIResolver uriResolver) { - this(proxyExchange,requestHttpHeadersFilters,responseHttpHeadersFilters,uriResolver,true); + this(proxyExchange, requestHttpHeadersFilters, responseHttpHeadersFilters, uriResolver, true); } public ProxyExchangeHandlerFunction(ProxyExchange proxyExchange, - ObjectProvider requestHttpHeadersFilters, - ObjectProvider responseHttpHeadersFilters, URIResolver uriResolver, - Boolean replaceQueryParams) { + ObjectProvider requestHttpHeadersFilters, + ObjectProvider responseHttpHeadersFilters, URIResolver uriResolver, + Boolean replaceQueryParams) { this.proxyExchange = proxyExchange; this.requestHttpHeadersFilters = requestHttpHeadersFilters; this.responseHttpHeadersFilters = responseHttpHeadersFilters; @@ -78,18 +78,17 @@ public ServerResponse handle(ServerRequest serverRequest) { URI uri = uriResolver.apply(serverRequest); boolean encoded = containsEncodedQuery(serverRequest.uri()); // @formatter:off - UriComponentsBuilder builder= UriComponentsBuilder.fromUri(serverRequest.uri()) + UriComponentsBuilder builder = UriComponentsBuilder + .fromUri(serverRequest.uri()) .scheme(uri.getScheme()) .host(uri.getHost()) .port(uri.getPort()); - if (replaceQueryParams){ - builder.replaceQueryParams(serverRequest.params()); - } + if (replaceQueryParams) { + builder.replaceQueryParams(serverRequest.params()); + } - URI url = builder - .build(encoded) - .toUri(); + URI url = builder.build(encoded).toUri(); // @formatter:on // TODO: Streams.collect()?