diff --git a/spring-cloud-gateway-server-webflux/src/main/java/org/springframework/cloud/gateway/filter/ForwardRoutingFilter.java b/spring-cloud-gateway-server-webflux/src/main/java/org/springframework/cloud/gateway/filter/ForwardRoutingFilter.java index 5f9ca039b6..1e1512e3dd 100644 --- a/spring-cloud-gateway-server-webflux/src/main/java/org/springframework/cloud/gateway/filter/ForwardRoutingFilter.java +++ b/spring-cloud-gateway-server-webflux/src/main/java/org/springframework/cloud/gateway/filter/ForwardRoutingFilter.java @@ -30,6 +30,7 @@ import org.springframework.web.server.ServerWebExchange; import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR; +import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.addOriginalRequestUrl; import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.handle; import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.isAlreadyRouted; @@ -72,6 +73,9 @@ public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { if (log.isTraceEnabled()) { log.trace("Forwarding to URI: " + requestUrl); } + + addOriginalRequestUrl(exchange, exchange.getRequest().getURI()); + DispatcherHandler handler = getDispatcherHandler(); Objects.requireNonNull(handler, "DispatcherHandler must not be null"); return handle(handler, exchange); diff --git a/spring-cloud-gateway-server-webflux/src/test/java/org/springframework/cloud/gateway/filter/ForwardRoutingFilterTests.java b/spring-cloud-gateway-server-webflux/src/test/java/org/springframework/cloud/gateway/filter/ForwardRoutingFilterTests.java index 4c9b99c92d..2c4958ff4f 100644 --- a/spring-cloud-gateway-server-webflux/src/test/java/org/springframework/cloud/gateway/filter/ForwardRoutingFilterTests.java +++ b/spring-cloud-gateway-server-webflux/src/test/java/org/springframework/cloud/gateway/filter/ForwardRoutingFilterTests.java @@ -17,6 +17,7 @@ package org.springframework.cloud.gateway.filter; import java.net.URI; +import java.util.LinkedHashSet; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -43,6 +44,7 @@ import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_ALREADY_ROUTED_ATTR; +import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_ORIGINAL_REQUEST_URL_ATTR; import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR; /** @@ -98,6 +100,17 @@ public void shouldFilterWhenGatewayRequestUrlSchemeIsForward() { assertArg(exchange -> assertThat(exchange.getAttributes().get(GATEWAY_ALREADY_ROUTED_ATTR)).isNull())); } + @Test + public void shouldAddOriginalRequestUrlAttributeWhenForwarding() { + URI uri = UriComponentsBuilder.fromUriString("forward://endpoint").build().toUri(); + exchange.getAttributes().put(GATEWAY_REQUEST_URL_ATTR, uri); + + forwardRoutingFilter.filter(exchange, chain); + + LinkedHashSet uris = exchange.getRequiredAttribute(GATEWAY_ORIGINAL_REQUEST_URL_ATTR); + assertThat(uris).containsExactly(exchange.getRequest().getURI()); + } + @Test public void shouldFilterAndKeepHostPathAsSpecified() {