Browse Source

Adds preserveHost filter.

See gh-2949
pull/3006/head
sgibb 2 years ago
parent
commit
ba0dfb4999
No known key found for this signature in database
GPG Key ID: 7788A47380690861
  1. 5
      spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/common/MvcUtils.java
  2. 8
      spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/FilterFunctions.java
  3. 9
      spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/handler/ProxyExchangeHandlerFunction.java
  4. 12
      spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/ServerMvcIntegrationTests.java

5
spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/common/MvcUtils.java

@ -44,6 +44,11 @@ public abstract class MvcUtils { @@ -44,6 +44,11 @@ public abstract class MvcUtils {
*/
public static final String GATEWAY_ROUTE_ID_ATTR = qualify("gatewayRouteId");
/**
* Preserve-Host header attribute name.
*/
public static final String PRESERVE_HOST_HEADER_ATTRIBUTE = qualify("preserveHostHeader");
private MvcUtils() {
}

8
spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/FilterFunctions.java

@ -84,6 +84,14 @@ public interface FilterFunctions { @@ -84,6 +84,14 @@ public interface FilterFunctions {
};
}
@Shortcut
static HandlerFilterFunction<ServerResponse, ServerResponse> preserveHost() {
return (request, next) -> {
request.attributes().put(MvcUtils.PRESERVE_HOST_HEADER_ATTRIBUTE, true);
return next.handle(request);
};
}
@Shortcut
static HandlerFilterFunction<ServerResponse, ServerResponse> rewritePath(String regexp, String replacement) {
String normalizedReplacement = replacement.replace("$\\", "$");

9
spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/handler/ProxyExchangeHandlerFunction.java

@ -83,6 +83,15 @@ public class ProxyExchangeHandlerFunction implements HandlerFunction<ServerRespo @@ -83,6 +83,15 @@ public class ProxyExchangeHandlerFunction implements HandlerFunction<ServerRespo
this.requestHttpHeadersFilters.orderedStream().map(Function.identity()),
serverRequest.headers().asHttpHeaders(), serverRequest);
boolean preserveHost = (boolean) serverRequest.attributes()
.getOrDefault(MvcUtils.PRESERVE_HOST_HEADER_ATTRIBUTE, false);
if (preserveHost) {
filteredRequestHeaders.set(HttpHeaders.HOST, serverRequest.headers().firstHeader(HttpHeaders.HOST));
}
else {
filteredRequestHeaders.remove(HttpHeaders.HOST);
}
// @formatter:off
ProxyExchange.Request proxyRequest = proxyExchange.request(serverRequest).uri(url)
.headers(filteredRequestHeaders)

12
spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/ServerMvcIntegrationTests.java

@ -70,6 +70,7 @@ import static org.springframework.cloud.gateway.server.mvc.filter.FilterFunction @@ -70,6 +70,7 @@ import static org.springframework.cloud.gateway.server.mvc.filter.FilterFunction
import static org.springframework.cloud.gateway.server.mvc.filter.FilterFunctions.addRequestParameter;
import static org.springframework.cloud.gateway.server.mvc.filter.FilterFunctions.addResponseHeader;
import static org.springframework.cloud.gateway.server.mvc.filter.FilterFunctions.prefixPath;
import static org.springframework.cloud.gateway.server.mvc.filter.FilterFunctions.preserveHost;
import static org.springframework.cloud.gateway.server.mvc.filter.FilterFunctions.rewritePath;
import static org.springframework.cloud.gateway.server.mvc.filter.FilterFunctions.setPath;
import static org.springframework.cloud.gateway.server.mvc.filter.FilterFunctions.setStatus;
@ -207,8 +208,14 @@ public class ServerMvcIntegrationTests { @@ -207,8 +208,14 @@ public class ServerMvcIntegrationTests {
@Test
public void hostPredicateWorks() {
restClient.get().uri("/anything/hostpredicate").header("Host", "www1.myjavadslhost.com").exchange()
.expectStatus().isOk().expectHeader().valueEquals("X-SubDomain", "www1");
String host = "www1.myjavadslhost.com";
restClient.get().uri("/anything/hostpredicate").header("Host", host).exchange().expectStatus().isOk()
.expectHeader().valueEquals("X-SubDomain", "www1").expectBody(Map.class).consumeWith(res -> {
Map<String, Object> map = res.getResponseBody();
assertThat(map).isNotEmpty().containsKey("headers");
Map<String, Object> headers = (Map<String, Object>) map.get("headers");
assertThat(headers).containsEntry("host", host);
});
}
@Test
@ -486,6 +493,7 @@ public class ServerMvcIntegrationTests { @@ -486,6 +493,7 @@ public class ServerMvcIntegrationTests {
return route(host("{sub}.myjavadslhost.com").and(path("/anything/hostpredicate")), http())
.filter(new LocalServerPortUriResolver())
.filter(prefixPath("/httpbin"))
.filter(preserveHost())
.filter(addResponseHeader("X-SubDomain", "{sub}"))
.withAttribute(MvcUtils.GATEWAY_ROUTE_ID_ATTR, "testhostpredicate");
// @formatter:on

Loading…
Cancel
Save