Browse Source

Adds BeforeFilterFunctions.mapRequestHeader()

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

11
spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/BeforeFilterFunctions.java

@ -19,6 +19,7 @@ package org.springframework.cloud.gateway.server.mvc.filter; @@ -19,6 +19,7 @@ package org.springframework.cloud.gateway.server.mvc.filter;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.regex.Pattern;
@ -70,6 +71,16 @@ public abstract class BeforeFilterFunctions { @@ -70,6 +71,16 @@ public abstract class BeforeFilterFunctions {
};
}
public static Function<ServerRequest, ServerRequest> mapRequestHeader(String fromHeader, String toHeader) {
return request -> {
if (request.headers().asHttpHeaders().containsKey(fromHeader)) {
List<String> values = request.headers().header(fromHeader);
return ServerRequest.from(request).header(toHeader, values.toArray(new String[0])).build();
}
return request;
};
}
public static Function<ServerRequest, ServerRequest> prefixPath(String prefix) {
final UriTemplate uriTemplate = new UriTemplate(prefix);

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

@ -50,6 +50,11 @@ public interface FilterFunctions { @@ -50,6 +50,11 @@ public interface FilterFunctions {
return ofResponseProcessor(AfterFilterFunctions.addResponseHeader(name, values));
}
@Shortcut
static HandlerFilterFunction<ServerResponse, ServerResponse> mapRequestHeader(String fromHeader, String toHeader) {
return ofRequestProcessor(BeforeFilterFunctions.mapRequestHeader(fromHeader, toHeader));
}
@Shortcut
static HandlerFilterFunction<ServerResponse, ServerResponse> prefixPath(String prefix) {
return ofRequestProcessor(BeforeFilterFunctions.prefixPath(prefix));

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

@ -74,6 +74,7 @@ import static org.springframework.cloud.gateway.server.mvc.filter.AfterFilterFun @@ -74,6 +74,7 @@ import static org.springframework.cloud.gateway.server.mvc.filter.AfterFilterFun
import static org.springframework.cloud.gateway.server.mvc.filter.AfterFilterFunctions.rewriteResponseHeader;
import static org.springframework.cloud.gateway.server.mvc.filter.AfterFilterFunctions.setResponseHeader;
import static org.springframework.cloud.gateway.server.mvc.filter.AfterFilterFunctions.setStatus;
import static org.springframework.cloud.gateway.server.mvc.filter.BeforeFilterFunctions.mapRequestHeader;
import static org.springframework.cloud.gateway.server.mvc.filter.BeforeFilterFunctions.preserveHost;
import static org.springframework.cloud.gateway.server.mvc.filter.BeforeFilterFunctions.removeRequestParameter;
import static org.springframework.cloud.gateway.server.mvc.filter.BeforeFilterFunctions.requestHeaderSize;
@ -465,6 +466,15 @@ public class ServerMvcIntegrationTests { @@ -465,6 +466,15 @@ public class ServerMvcIntegrationTests {
.exchange().expectStatus().isOk().expectBody(String.class).isEqualTo("Hello");
}
@Test
public void mapRequestHeaderWorks() {
restClient.get().uri("/anything/maprequestheader").header("X-Foo", "fooval").exchange().expectStatus().isOk()
.expectBody(Map.class).consumeWith(res -> {
Map<String, Object> headers = getMap(res.getResponseBody(), "headers");
assertThat(headers).containsEntry("X-Bar", "fooval");
});
}
@SpringBootConfiguration
@EnableAutoConfiguration
@LoadBalancerClient(name = "httpbin", configuration = TestLoadBalancerConfig.Httpbin.class)
@ -833,6 +843,17 @@ public class ServerMvcIntegrationTests { @@ -833,6 +843,17 @@ public class ServerMvcIntegrationTests {
// @formatter:on
}
@Bean
public RouterFunction<ServerResponse> gatewayRouterFunctionsMapRequestHeader() {
// @formatter:off
return route("testmaprequestheader")
.GET("/anything/maprequestheader", http())
.before(new HttpbinUriResolver())
.before(mapRequestHeader("X-Foo", "X-Bar"))
.build();
// @formatter:on
}
}
@RestController

Loading…
Cancel
Save