Browse Source

Adds FilterFunctions.setRequestHostHeader()

See gh-2949
pull/3006/head
sgibb 1 year ago
parent
commit
113b23b443
No known key found for this signature in database
GPG Key ID: 7788A47380690861
  1. 15
      spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/FilterFunctions.java
  2. 24
      spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/ServerMvcIntegrationTests.java

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

@ -177,6 +177,21 @@ public interface FilterFunctions { @@ -177,6 +177,21 @@ public interface FilterFunctions {
};
}
@Shortcut
static HandlerFilterFunction<ServerResponse, ServerResponse> setRequestHostHeader(String host) {
return (request, next) -> {
String expandedValue = MvcUtils.expand(request, host);
ServerRequest modified = ServerRequest.from(request).headers(httpHeaders -> {
httpHeaders.remove(HttpHeaders.HOST);
httpHeaders.set(HttpHeaders.HOST, expandedValue);
}).build();
// Make sure the header we just set is preserved
modified.attributes().put(MvcUtils.PRESERVE_HOST_HEADER_ATTRIBUTE, true);
return next.handle(modified);
};
}
static HandlerFilterFunction<ServerResponse, ServerResponse> stripPrefix() {
return stripPrefix(1);
}

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

@ -81,6 +81,7 @@ import static org.springframework.cloud.gateway.server.mvc.filter.FilterFunction @@ -81,6 +81,7 @@ import static org.springframework.cloud.gateway.server.mvc.filter.FilterFunction
import static org.springframework.cloud.gateway.server.mvc.filter.FilterFunctions.routeId;
import static org.springframework.cloud.gateway.server.mvc.filter.FilterFunctions.setPath;
import static org.springframework.cloud.gateway.server.mvc.filter.FilterFunctions.setRequestHeader;
import static org.springframework.cloud.gateway.server.mvc.filter.FilterFunctions.setRequestHostHeader;
import static org.springframework.cloud.gateway.server.mvc.filter.FilterFunctions.setStatus;
import static org.springframework.cloud.gateway.server.mvc.filter.FilterFunctions.stripPrefix;
import static org.springframework.cloud.gateway.server.mvc.filter.LoadBalancerFilterFunctions.lb;
@ -373,13 +374,21 @@ public class ServerMvcIntegrationTests { @@ -373,13 +374,21 @@ public class ServerMvcIntegrationTests {
public void setRequestHeaderWorks() {
restClient.get().uri("/headers").header("test", "setrequestheader").exchange().expectStatus().isOk()
.expectBody(Map.class).consumeWith(res -> {
Map<String, Object> map = res.getResponseBody();
Map<String, Object> headers = getMap(map, "headers");
Map<String, Object> headers = getMap(res.getResponseBody(), "headers");
assertThat(headers).doesNotContainEntry("X-Test", "value1");
assertThat(headers).containsEntry("X-Test", "value2");
});
}
@Test
public void setRequestHeaderHostWorks() {
restClient.get().uri("/headers").header("Host", "www.setrequesthostheader.org").exchange().expectStatus().isOk()
.expectBody(Map.class).consumeWith(res -> {
Map<String, Object> headers = getMap(res.getResponseBody(), "headers");
assertThat(headers).containsEntry("Host", "otherhost.io");
});
}
@SpringBootConfiguration
@EnableAutoConfiguration
@LoadBalancerClient(name = "httpbin", configuration = TestLoadBalancerConfig.Httpbin.class)
@ -635,6 +644,17 @@ public class ServerMvcIntegrationTests { @@ -635,6 +644,17 @@ public class ServerMvcIntegrationTests {
// @formatter:on
}
@Bean
public RouterFunction<ServerResponse> gatewayRouterFunctionsSetRequestHostHeader() {
// @formatter:off
return route("testsetrequestheader")
.route(host("**.setrequesthostheader.org"), http())
.filter(new HttpbinUriResolver())
.filter(setRequestHostHeader("otherhost.io"))
.build();
// @formatter:on
}
}
@RestController

Loading…
Cancel
Save