diff --git a/spring-cloud-gateway-mvc/src/main/java/org/springframework/cloud/gateway/mvc/ProxyExchange.java b/spring-cloud-gateway-mvc/src/main/java/org/springframework/cloud/gateway/mvc/ProxyExchange.java
index e1bb63f86a..b52e970988 100644
--- a/spring-cloud-gateway-mvc/src/main/java/org/springframework/cloud/gateway/mvc/ProxyExchange.java
+++ b/spring-cloud-gateway-mvc/src/main/java/org/springframework/cloud/gateway/mvc/ProxyExchange.java
@@ -55,6 +55,7 @@
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.util.ClassUtils;
+import org.springframework.util.MultiValueMap;
import org.springframework.util.StringUtils;
import org.springframework.validation.BindingResult;
import org.springframework.web.HttpMediaTypeNotAcceptableException;
@@ -133,6 +134,7 @@
*
*
* @author Dave Syer
+ * @author Stefan Berger
*
*/
public class ProxyExchange {
@@ -251,11 +253,23 @@ public ProxyExchange uri(String uri) {
}
}
+ /**
+ * Returns the request path without any query parameters.
+ * @return the URI path
+ * @see ProxyExchange#path(String)
+ * @see ProxyExchange#queryParams
+ */
public String path() {
- return (String) this.webRequest.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE,
- WebRequest.SCOPE_REQUEST);
+ return exchange.getRequest().getPath().pathWithinApplication().value();
}
+ /**
+ * Returns the request path without the provided path prefix and without any query parameters.
+ * @param prefix the path prefix to remove
+ * @return the URI path
+ * @see ProxyExchange#path(String)
+ * @see ProxyExchange#queryParams
+ */
public String path(String prefix) {
String path = path();
if (!path.startsWith(prefix)) {
@@ -264,6 +278,14 @@ public String path(String prefix) {
return path.substring(prefix.length());
}
+ /**
+ * Returns the original query parameters.
+ * @return the query parameters
+ */
+ public MultiValueMap queryParams() {
+ return exchange.getRequest().getQueryParams();
+ }
+
public void forward(String path) {
HttpServletRequest request = this.webRequest.getNativeRequest(HttpServletRequest.class);
HttpServletResponse response = this.webRequest.getNativeResponse(HttpServletResponse.class);
diff --git a/spring-cloud-gateway-webflux/src/main/java/org/springframework/cloud/gateway/webflux/ProxyExchange.java b/spring-cloud-gateway-webflux/src/main/java/org/springframework/cloud/gateway/webflux/ProxyExchange.java
index 62cb7f0721..113abbc5b0 100644
--- a/spring-cloud-gateway-webflux/src/main/java/org/springframework/cloud/gateway/webflux/ProxyExchange.java
+++ b/spring-cloud-gateway-webflux/src/main/java/org/springframework/cloud/gateway/webflux/ProxyExchange.java
@@ -38,6 +38,7 @@
import org.springframework.http.RequestEntity.BodyBuilder;
import org.springframework.http.ResponseEntity;
import org.springframework.http.converter.HttpMessageConverter;
+import org.springframework.util.MultiValueMap;
import org.springframework.util.StringUtils;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestBody;
@@ -107,6 +108,7 @@
*
*
* @author Dave Syer
+ * @author Stefan Berger
*
*/
public class ProxyExchange {
@@ -229,10 +231,23 @@ public ProxyExchange uri(String uri) {
return this;
}
+ /**
+ * Returns the request path without any query parameters.
+ * @return the URI path
+ * @see ProxyExchange#path(String)
+ * @see ProxyExchange#queryParams
+ */
public String path() {
return exchange.getRequest().getPath().pathWithinApplication().value();
}
+ /**
+ * Returns the request path without the provided path prefix and without any query parameters.
+ * @param prefix the path prefix to remove
+ * @return the URI path
+ * @see ProxyExchange#path(String)
+ * @see ProxyExchange#queryParams
+ */
public String path(String prefix) {
String path = path();
if (!path.startsWith(prefix)) {
@@ -241,6 +256,14 @@ public String path(String prefix) {
return path.substring(prefix.length());
}
+ /**
+ * Returns the original query parameters.
+ * @return the query parameters
+ */
+ public MultiValueMap queryParams() {
+ return exchange.getRequest().getQueryParams();
+ }
+
public Mono> get() {
RequestEntity> requestEntity = headers((BodyBuilder) RequestEntity.get(uri)).build();
return exchange(requestEntity);