Add SetResponseHeader filter

This commit is contained in:
Spencer Gibb
2017-01-13 22:47:29 -07:00
parent 10581de7ae
commit 916ece75b8
4 changed files with 59 additions and 0 deletions

View File

@@ -16,6 +16,7 @@ import org.springframework.cloud.gateway.filter.RouteToRequestUrlFilter;
import org.springframework.cloud.gateway.filter.factory.RemoveRequestHeaderFilterFactory;
import org.springframework.cloud.gateway.filter.factory.RemoveResponseHeaderFilterFactory;
import org.springframework.cloud.gateway.filter.factory.RewritePathFilterFactory;
import org.springframework.cloud.gateway.filter.factory.SetResponseHeaderFilterFactory;
import org.springframework.cloud.gateway.handler.GatewayFilteringWebHandler;
import org.springframework.cloud.gateway.handler.GatewayPredicateHandlerMapping;
import org.springframework.cloud.gateway.handler.GatewayWebHandler;
@@ -138,6 +139,11 @@ public class GatewayAutoConfiguration {
return new RewritePathFilterFactory();
}
@Bean
public SetResponseHeaderFilterFactory setResponseHeaderFilterFactory() {
return new SetResponseHeaderFilterFactory();
}
@Configuration
@ConditionalOnClass(Endpoint.class)
protected static class GatewayActuatorConfiguration {

View File

@@ -0,0 +1,21 @@
package org.springframework.cloud.gateway.filter.factory;
import org.springframework.cloud.gateway.filter.GatewayFilter;
/**
* @author Spencer Gibb
*/
public class SetResponseHeaderFilterFactory implements FilterFactory {
@Override
public GatewayFilter apply(String header, String[] args) {
validate(args, 1);
//TODO: caching can happen here
return (exchange, chain) -> {
exchange.getResponse().getHeaders().set(header, args[0]);
return chain.filter(exchange);
};
}
}

View File

@@ -234,6 +234,27 @@ public class GatewayIntegrationTests {
);
}
@Test
public void setResponseHeaderFilterWorks() {
Mono<ClientResponse> result = webClient.exchange(
GET("http://localhost:" + port + "/headers")
.header("Host", "www.setreresponseheader.org")
.build()
);
verify( () ->
StepVerifier.create(result)
.consumeNextWith(
response -> {
HttpHeaders httpHeaders = response.headers().asHttpHeaders();
assertThat(httpHeaders).containsKey("X-Request-Foo");
assertThat(httpHeaders.get("X-Request-Foo")).containsExactly("Bar");
})
.expectComplete()
.verify(Duration.ofSeconds(3))
);
}
@Test
public void postWorks() {
ClientRequest<Mono<String>> request = POST("http://localhost:" + port + "/post")

View File

@@ -57,6 +57,17 @@ spring:
- AddResponseHeader=X-Request-Foo, Bar
- RemoveResponseHeader=X-Request-Foo
# =====================================
- id: set_response_header_test
uri: http://httpbin.org:80
predicates:
- Host=**.setreresponseheader.org
- Url=/headers
filters:
- AddResponseHeader=X-Request-Foo, Bar1
- AddResponseHeader=X-Request-Foo, Bar2
- SetResponseHeader=X-Request-Foo, Bar
# =====================================
- id: rewrite_path_test
uri: http://httpbin.org:80