Browse Source

Rename GatewayPredicate to PredicateFactory

Rename GatewayFilterDefinition to FilterFactory
pull/41/head
Spencer Gibb 8 years ago
parent
commit
2835fb2a45
No known key found for this signature in database
GPG Key ID: 7788A47380690861
  1. 58
      src/main/java/org/springframework/cloud/gateway/config/GatewayAutoConfiguration.java
  2. 6
      src/main/java/org/springframework/cloud/gateway/filter/factory/AddRequestHeaderFilterFactory.java
  3. 7
      src/main/java/org/springframework/cloud/gateway/filter/factory/AddResponseHeaderFilterFactory.java
  4. 4
      src/main/java/org/springframework/cloud/gateway/filter/factory/FilterFactory.java
  5. 10
      src/main/java/org/springframework/cloud/gateway/handler/GatewayFilteringWebHandler.java
  6. 16
      src/main/java/org/springframework/cloud/gateway/handler/GatewayPredicateHandlerMapping.java
  7. 2
      src/main/java/org/springframework/cloud/gateway/handler/predicate/CookiePredicateFactory.java
  8. 2
      src/main/java/org/springframework/cloud/gateway/handler/predicate/HeaderPredicateFactory.java
  9. 2
      src/main/java/org/springframework/cloud/gateway/handler/predicate/HostPredicateFactory.java
  10. 2
      src/main/java/org/springframework/cloud/gateway/handler/predicate/MethodPredicateFactory.java
  11. 2
      src/main/java/org/springframework/cloud/gateway/handler/predicate/PredicateFactory.java
  12. 2
      src/main/java/org/springframework/cloud/gateway/handler/predicate/QueryPredicateFactory.java
  13. 2
      src/main/java/org/springframework/cloud/gateway/handler/predicate/UrlPredicateFactory.java
  14. 136
      src/test/java/org/springframework/cloud/gateway/test/GatewayIntegrationTests.java
  15. 5
      src/test/resources/application.yml

58
src/main/java/org/springframework/cloud/gateway/config/GatewayAutoConfiguration.java

@ -9,20 +9,20 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties
import org.springframework.cloud.gateway.actuate.GatewayEndpoint; import org.springframework.cloud.gateway.actuate.GatewayEndpoint;
import org.springframework.cloud.gateway.api.RouteReader; import org.springframework.cloud.gateway.api.RouteReader;
import org.springframework.cloud.gateway.filter.GatewayFilter; import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.definition.AppendRequestHeaderFilter; import org.springframework.cloud.gateway.filter.factory.AddRequestHeaderFilterFactory;
import org.springframework.cloud.gateway.filter.definition.AppendResponseHeaderFilter; import org.springframework.cloud.gateway.filter.factory.AddResponseHeaderFilterFactory;
import org.springframework.cloud.gateway.filter.definition.GatewayFilterDefinition; import org.springframework.cloud.gateway.filter.factory.FilterFactory;
import org.springframework.cloud.gateway.filter.RouteToRequestUrlFilter; import org.springframework.cloud.gateway.filter.RouteToRequestUrlFilter;
import org.springframework.cloud.gateway.handler.GatewayFilteringWebHandler; import org.springframework.cloud.gateway.handler.GatewayFilteringWebHandler;
import org.springframework.cloud.gateway.handler.GatewayPredicateHandlerMapping; import org.springframework.cloud.gateway.handler.GatewayPredicateHandlerMapping;
import org.springframework.cloud.gateway.handler.GatewayWebHandler; import org.springframework.cloud.gateway.handler.GatewayWebHandler;
import org.springframework.cloud.gateway.handler.predicate.CookiePredicate; import org.springframework.cloud.gateway.handler.predicate.CookiePredicateFactory;
import org.springframework.cloud.gateway.handler.predicate.GatewayPredicate; import org.springframework.cloud.gateway.handler.predicate.HostPredicateFactory;
import org.springframework.cloud.gateway.handler.predicate.HeaderPredicate; import org.springframework.cloud.gateway.handler.predicate.MethodPredicateFactory;
import org.springframework.cloud.gateway.handler.predicate.HostPredicate; import org.springframework.cloud.gateway.handler.predicate.PredicateFactory;
import org.springframework.cloud.gateway.handler.predicate.MethodPredicate; import org.springframework.cloud.gateway.handler.predicate.HeaderPredicateFactory;
import org.springframework.cloud.gateway.handler.predicate.QueryPredicate; import org.springframework.cloud.gateway.handler.predicate.QueryPredicateFactory;
import org.springframework.cloud.gateway.handler.predicate.UrlPredicate; import org.springframework.cloud.gateway.handler.predicate.UrlPredicateFactory;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.reactive.ReactorClientHttpConnector; import org.springframework.http.client.reactive.ReactorClientHttpConnector;
@ -65,7 +65,7 @@ public class GatewayAutoConfiguration {
@Bean @Bean
public GatewayFilteringWebHandler gatewayFilteringWebHandler(GatewayWebHandler gatewayWebHandler, public GatewayFilteringWebHandler gatewayFilteringWebHandler(GatewayWebHandler gatewayWebHandler,
List<GatewayFilter> filters, List<GatewayFilter> filters,
List<GatewayFilterDefinition> filterDefinitions) { List<FilterFactory> filterDefinitions) {
return new GatewayFilteringWebHandler(gatewayWebHandler, filters, filterDefinitions); return new GatewayFilteringWebHandler(gatewayWebHandler, filters, filterDefinitions);
} }
@ -73,51 +73,51 @@ public class GatewayAutoConfiguration {
@Bean @Bean
public GatewayPredicateHandlerMapping gatewayPredicateHandlerMapping(GatewayFilteringWebHandler webHandler, public GatewayPredicateHandlerMapping gatewayPredicateHandlerMapping(GatewayFilteringWebHandler webHandler,
List<GatewayPredicate> predicates, List<PredicateFactory> predicates,
RouteReader routeReader) { RouteReader routeReader) {
return new GatewayPredicateHandlerMapping(webHandler, predicates, routeReader); return new GatewayPredicateHandlerMapping(webHandler, predicates, routeReader);
} }
@Bean @Bean
public CookiePredicate cookiePredicate() { public CookiePredicateFactory cookiePredicateFactory() {
return new CookiePredicate(); return new CookiePredicateFactory();
} }
@Bean @Bean
public HeaderPredicate headerPredicate() { public HeaderPredicateFactory headerPredicateFactory() {
return new HeaderPredicate(); return new HeaderPredicateFactory();
} }
@Bean @Bean
public HostPredicate hostPredicate() { public HostPredicateFactory hostPredicateFactory() {
return new HostPredicate(); return new HostPredicateFactory();
} }
@Bean @Bean
public MethodPredicate methodPredicate() { public MethodPredicateFactory methodPredicateFactory() {
return new MethodPredicate(); return new MethodPredicateFactory();
} }
@Bean @Bean
public QueryPredicate queryPredicate() { public QueryPredicateFactory queryPredicateFactory() {
return new QueryPredicate(); return new QueryPredicateFactory();
} }
@Bean @Bean
public UrlPredicate urlPredicate() { public UrlPredicateFactory urlPredicateFactory() {
return new UrlPredicate(); return new UrlPredicateFactory();
} }
// Filter beans // Filter Factory beans
@Bean @Bean
public AppendRequestHeaderFilter appendRequestHeaderFilter() { public AddRequestHeaderFilterFactory addRequestHeaderFilterFactory() {
return new AppendRequestHeaderFilter(); return new AddRequestHeaderFilterFactory();
} }
@Bean @Bean
public AppendResponseHeaderFilter appendResponseHeaderFilter() { public AddResponseHeaderFilterFactory addResponseHeaderFilterFactory() {
return new AppendResponseHeaderFilter(); return new AddResponseHeaderFilterFactory();
} }
@Configuration @Configuration

6
src/main/java/org/springframework/cloud/gateway/filter/definition/AppendRequestHeaderFilter.java → src/main/java/org/springframework/cloud/gateway/filter/factory/AddRequestHeaderFilterFactory.java

@ -1,4 +1,4 @@
package org.springframework.cloud.gateway.filter.definition; package org.springframework.cloud.gateway.filter.factory;
import org.springframework.cloud.gateway.filter.GatewayFilter; import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.http.server.reactive.ServerHttpRequest;
@ -7,11 +7,11 @@ import org.springframework.util.Assert;
/** /**
* @author Spencer Gibb * @author Spencer Gibb
*/ */
public class AppendRequestHeaderFilter implements GatewayFilterDefinition { public class AddRequestHeaderFilterFactory implements FilterFactory {
@Override @Override
public String getName() { public String getName() {
return "AppendRequestHeader"; return "AddRequestHeader";
} }
@Override @Override

7
src/main/java/org/springframework/cloud/gateway/filter/definition/AppendResponseHeaderFilter.java → src/main/java/org/springframework/cloud/gateway/filter/factory/AddResponseHeaderFilterFactory.java

@ -1,17 +1,16 @@
package org.springframework.cloud.gateway.filter.definition; package org.springframework.cloud.gateway.filter.factory;
import org.springframework.cloud.gateway.filter.GatewayFilter; import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.util.Assert; import org.springframework.util.Assert;
/** /**
* @author Spencer Gibb * @author Spencer Gibb
*/ */
public class AppendResponseHeaderFilter implements GatewayFilterDefinition { public class AddResponseHeaderFilterFactory implements FilterFactory {
@Override @Override
public String getName() { public String getName() {
return "AppendResponseHeader"; return "AddResponseHeader";
} }
@Override @Override

4
src/main/java/org/springframework/cloud/gateway/filter/definition/GatewayFilterDefinition.java → src/main/java/org/springframework/cloud/gateway/filter/factory/FilterFactory.java

@ -1,11 +1,11 @@
package org.springframework.cloud.gateway.filter.definition; package org.springframework.cloud.gateway.filter.factory;
import org.springframework.cloud.gateway.filter.GatewayFilter; import org.springframework.cloud.gateway.filter.GatewayFilter;
/** /**
* @author Spencer Gibb * @author Spencer Gibb
*/ */
public interface GatewayFilterDefinition { public interface FilterFactory {
String getName(); String getName();

10
src/main/java/org/springframework/cloud/gateway/handler/GatewayFilteringWebHandler.java

@ -30,7 +30,7 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.springframework.cloud.gateway.config.Route; import org.springframework.cloud.gateway.config.Route;
import org.springframework.cloud.gateway.filter.GatewayFilter; import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.definition.GatewayFilterDefinition; import org.springframework.cloud.gateway.filter.factory.FilterFactory;
import org.springframework.web.server.ServerWebExchange; import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.server.WebFilterChain; import org.springframework.web.server.WebFilterChain;
import org.springframework.web.server.WebHandler; import org.springframework.web.server.WebHandler;
@ -52,10 +52,10 @@ public class GatewayFilteringWebHandler extends WebHandlerDecorator {
protected final Log logger = LogFactory.getLog(getClass()); protected final Log logger = LogFactory.getLog(getClass());
private final List<GatewayFilter> filters; private final List<GatewayFilter> filters;
private final Map<String, GatewayFilterDefinition> filterDefinitions = new HashMap<>(); private final Map<String, FilterFactory> filterDefinitions = new HashMap<>();
public GatewayFilteringWebHandler(WebHandler targetHandler, List<GatewayFilter> filters, public GatewayFilteringWebHandler(WebHandler targetHandler, List<GatewayFilter> filters,
List<GatewayFilterDefinition> filterDefinitions) { List<FilterFactory> filterDefinitions) {
super(targetHandler); super(targetHandler);
this.filters = initList(filters); this.filters = initList(filters);
initList(filterDefinitions).forEach(def -> this.filterDefinitions.put(def.getName(), def)); initList(filterDefinitions).forEach(def -> this.filterDefinitions.put(def.getName(), def));
@ -86,9 +86,9 @@ public class GatewayFilteringWebHandler extends WebHandlerDecorator {
private Collection<GatewayFilter> loadFilters(Route route) { private Collection<GatewayFilter> loadFilters(Route route) {
return route.getFilters().stream() return route.getFilters().stream()
.map(definition -> { .map(definition -> {
GatewayFilterDefinition filter = this.filterDefinitions.get(definition.getName()); FilterFactory filter = this.filterDefinitions.get(definition.getName());
if (filter == null) { if (filter == null) {
throw new IllegalArgumentException("Unable to find GatewayFilterDefinition with name " + definition.getName()); throw new IllegalArgumentException("Unable to find FilterFactory with name " + definition.getName());
} }
if (logger.isDebugEnabled()) { if (logger.isDebugEnabled()) {
List<String> args; List<String> args;

16
src/main/java/org/springframework/cloud/gateway/handler/GatewayPredicateHandlerMapping.java

@ -11,7 +11,7 @@ import org.springframework.beans.BeansException;
import org.springframework.cloud.gateway.api.RouteReader; import org.springframework.cloud.gateway.api.RouteReader;
import org.springframework.cloud.gateway.config.Route; import org.springframework.cloud.gateway.config.Route;
import org.springframework.cloud.gateway.config.PredicateDefinition; import org.springframework.cloud.gateway.config.PredicateDefinition;
import org.springframework.cloud.gateway.handler.predicate.GatewayPredicate; import org.springframework.cloud.gateway.handler.predicate.PredicateFactory;
import org.springframework.web.reactive.handler.AbstractHandlerMapping; import org.springframework.web.reactive.handler.AbstractHandlerMapping;
import org.springframework.web.server.ServerWebExchange; import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.server.WebHandler; import org.springframework.web.server.WebHandler;
@ -26,26 +26,26 @@ import static org.springframework.cloud.gateway.filter.GatewayFilter.GATEWAY_ROU
*/ */
public class GatewayPredicateHandlerMapping extends AbstractHandlerMapping { public class GatewayPredicateHandlerMapping extends AbstractHandlerMapping {
private Map<String, GatewayPredicate> predicates = new LinkedHashMap<>(); private Map<String, PredicateFactory> predicates = new LinkedHashMap<>();
private RouteReader routeReader; private RouteReader routeReader;
private WebHandler webHandler; private WebHandler webHandler;
private List<Route> routes; private List<Route> routes;
public GatewayPredicateHandlerMapping(WebHandler webHandler, List<GatewayPredicate> predicates, public GatewayPredicateHandlerMapping(WebHandler webHandler, List<PredicateFactory> predicates,
RouteReader routeReader) { RouteReader routeReader) {
this.webHandler = webHandler; this.webHandler = webHandler;
this.routeReader = routeReader; this.routeReader = routeReader;
for (GatewayPredicate factory : predicates) { for (PredicateFactory factory : predicates) {
if (this.predicates.containsKey(factory.getName())) { if (this.predicates.containsKey(factory.getName())) {
this.logger.warn("A GatewayPredicate named "+ factory.getName() this.logger.warn("A PredicateFactory named "+ factory.getName()
+ " already exists, class: " + this.predicates.get(factory.getName()) + " already exists, class: " + this.predicates.get(factory.getName())
+ ". It will be overwritten."); + ". It will be overwritten.");
} }
this.predicates.put(factory.getName(), factory); this.predicates.put(factory.getName(), factory);
if (logger.isInfoEnabled()) { if (logger.isInfoEnabled()) {
logger.info("Loaded GatewayPredicate [" + factory.getName() + "]"); logger.info("Loaded PredicateFactory [" + factory.getName() + "]");
} }
} }
@ -135,9 +135,9 @@ public class GatewayPredicateHandlerMapping extends AbstractHandlerMapping {
} }
private Predicate<ServerWebExchange> lookup(Route route, PredicateDefinition predicate) { private Predicate<ServerWebExchange> lookup(Route route, PredicateDefinition predicate) {
GatewayPredicate found = this.predicates.get(predicate.getName()); PredicateFactory found = this.predicates.get(predicate.getName());
if (found == null) { if (found == null) {
throw new IllegalArgumentException("Unable to find GatewayPredicate with name " + predicate.getName()); throw new IllegalArgumentException("Unable to find PredicateFactory with name " + predicate.getName());
} }
if (logger.isDebugEnabled()) { if (logger.isDebugEnabled()) {
List<String> args; List<String> args;

2
src/main/java/org/springframework/cloud/gateway/handler/predicate/CookiePredicate.java → src/main/java/org/springframework/cloud/gateway/handler/predicate/CookiePredicateFactory.java

@ -10,7 +10,7 @@ import org.springframework.web.server.ServerWebExchange;
/** /**
* @author Spencer Gibb * @author Spencer Gibb
*/ */
public class CookiePredicate implements GatewayPredicate { public class CookiePredicateFactory implements PredicateFactory {
@Override @Override
public String getName() { public String getName() {

2
src/main/java/org/springframework/cloud/gateway/handler/predicate/HeaderPredicate.java → src/main/java/org/springframework/cloud/gateway/handler/predicate/HeaderPredicateFactory.java

@ -9,7 +9,7 @@ import org.springframework.web.server.ServerWebExchange;
/** /**
* @author Spencer Gibb * @author Spencer Gibb
*/ */
public class HeaderPredicate implements GatewayPredicate { public class HeaderPredicateFactory implements PredicateFactory {
@Override @Override
public String getName() { public String getName() {

2
src/main/java/org/springframework/cloud/gateway/handler/predicate/HostPredicate.java → src/main/java/org/springframework/cloud/gateway/handler/predicate/HostPredicateFactory.java

@ -9,7 +9,7 @@ import org.springframework.web.server.ServerWebExchange;
/** /**
* @author Spencer Gibb * @author Spencer Gibb
*/ */
public class HostPredicate implements GatewayPredicate { public class HostPredicateFactory implements PredicateFactory {
private PathMatcher pathMatcher = new AntPathMatcher("."); private PathMatcher pathMatcher = new AntPathMatcher(".");

2
src/main/java/org/springframework/cloud/gateway/handler/predicate/MethodPredicate.java → src/main/java/org/springframework/cloud/gateway/handler/predicate/MethodPredicateFactory.java

@ -8,7 +8,7 @@ import org.springframework.web.server.ServerWebExchange;
/** /**
* @author Spencer Gibb * @author Spencer Gibb
*/ */
public class MethodPredicate implements GatewayPredicate { public class MethodPredicateFactory implements PredicateFactory {
@Override @Override
public String getName() { public String getName() {

2
src/main/java/org/springframework/cloud/gateway/handler/predicate/GatewayPredicate.java → src/main/java/org/springframework/cloud/gateway/handler/predicate/PredicateFactory.java

@ -7,7 +7,7 @@ import org.springframework.web.server.ServerWebExchange;
/** /**
* @author Spencer Gibb * @author Spencer Gibb
*/ */
public interface GatewayPredicate { public interface PredicateFactory {
String getName(); String getName();

2
src/main/java/org/springframework/cloud/gateway/handler/predicate/QueryPredicate.java → src/main/java/org/springframework/cloud/gateway/handler/predicate/QueryPredicateFactory.java

@ -8,7 +8,7 @@ import org.springframework.web.server.ServerWebExchange;
/** /**
* @author Spencer Gibb * @author Spencer Gibb
*/ */
public class QueryPredicate implements GatewayPredicate { public class QueryPredicateFactory implements PredicateFactory {
@Override @Override
public String getName() { public String getName() {

2
src/main/java/org/springframework/cloud/gateway/handler/predicate/UrlPredicate.java → src/main/java/org/springframework/cloud/gateway/handler/predicate/UrlPredicateFactory.java

@ -10,7 +10,7 @@ import org.springframework.web.server.support.HttpRequestPathHelper;
/** /**
* @author Spencer Gibb * @author Spencer Gibb
*/ */
public class UrlPredicate implements GatewayPredicate { public class UrlPredicateFactory implements PredicateFactory {
private PathMatcher pathMatcher = new AntPathMatcher(); private PathMatcher pathMatcher = new AntPathMatcher();
private HttpRequestPathHelper pathHelper = new HttpRequestPathHelper(); private HttpRequestPathHelper pathHelper = new HttpRequestPathHelper();

136
src/test/java/org/springframework/cloud/gateway/test/GatewayIntegrationTests.java

@ -59,40 +59,50 @@ public class GatewayIntegrationTests {
AssertionError error = null; AssertionError error = null;
} }
@Test @FunctionalInterface
public void urlRouteWorks() { interface ResultVerifier {
Mono<ClientResponse> result = webClient.exchange( void verify();
GET("http://localhost:" + port + "/get").build() }
);
final Result testResult = new Result();
IntStream.range(0, 3).forEach(i -> { private void verify(ResultVerifier verifier) {
Result result = new Result();
IntStream.range(0, 3).forEach( i -> {
try { try {
StepVerifier.create(result) verifier.verify();
.consumeNextWith( result.passedOnce = true;
response -> {
HttpHeaders httpHeaders = response.headers().asHttpHeaders();
HttpStatus statusCode = response.statusCode();
assertThat(httpHeaders.getFirst(HANDLER_MAPPER_HEADER))
.isEqualTo(GatewayPredicateHandlerMapping.class.getSimpleName());
assertThat(httpHeaders.getFirst(ROUTE_ID_HEADER))
.isEqualTo("default_path_to_httpbin");
assertThat(statusCode).isEqualTo(HttpStatus.OK);
})
.expectComplete()
.verify(Duration.ofSeconds(3));
testResult.passedOnce = true;
} catch (AssertionError e) { } catch (AssertionError e) {
testResult.error = e; result.error = e;
} }
}); });
if (!testResult.passedOnce && testResult.error != null) { if (!result.passedOnce && result.error != null) {
throw testResult.error; throw result.error;
} }
} }
@Test
public void urlRouteWorks() {
Mono<ClientResponse> result = webClient.exchange(
GET("http://localhost:" + port + "/get").build()
);
verify( () ->
StepVerifier.create(result)
.consumeNextWith(
response -> {
HttpHeaders httpHeaders = response.headers().asHttpHeaders();
HttpStatus statusCode = response.statusCode();
assertThat(httpHeaders.getFirst(HANDLER_MAPPER_HEADER))
.isEqualTo(GatewayPredicateHandlerMapping.class.getSimpleName());
assertThat(httpHeaders.getFirst(ROUTE_ID_HEADER))
.isEqualTo("default_path_to_httpbin");
assertThat(statusCode).isEqualTo(HttpStatus.OK);
})
.expectComplete()
.verify(Duration.ofSeconds(3))
);
}
@Test @Test
public void hostRouteWorks() { public void hostRouteWorks() {
Mono<ClientResponse> result = webClient.exchange( Mono<ClientResponse> result = webClient.exchange(
@ -101,38 +111,42 @@ public class GatewayIntegrationTests {
.build() .build()
); );
StepVerifier.create(result) verify( () ->
.consumeNextWith( StepVerifier.create(result)
response -> { .consumeNextWith(
HttpHeaders httpHeaders = response.headers().asHttpHeaders(); response -> {
HttpStatus statusCode = response.statusCode(); HttpHeaders httpHeaders = response.headers().asHttpHeaders();
assertThat(httpHeaders.getFirst(HANDLER_MAPPER_HEADER)) HttpStatus statusCode = response.statusCode();
.isEqualTo(GatewayPredicateHandlerMapping.class.getSimpleName()); assertThat(httpHeaders.getFirst(HANDLER_MAPPER_HEADER))
assertThat(httpHeaders.getFirst(ROUTE_ID_HEADER)) .isEqualTo(GatewayPredicateHandlerMapping.class.getSimpleName());
.isEqualTo("host_example_to_httpbin"); assertThat(httpHeaders.getFirst(ROUTE_ID_HEADER))
assertThat(statusCode).isEqualTo(HttpStatus.OK); .isEqualTo("host_example_to_httpbin");
}) assertThat(statusCode).isEqualTo(HttpStatus.OK);
.expectComplete() })
.verify(Duration.ofSeconds(3)); .expectComplete()
.verify(Duration.ofSeconds(3))
);
} }
@Test @Test
public void appendRequestHeaderFilterWorks() { public void addRequestHeaderFilterWorks() {
Mono<Map> result = webClient.exchange( Mono<Map> result = webClient.exchange(
GET("http://localhost:" + port + "/headers") GET("http://localhost:" + port + "/headers")
.header("Host", "www.bar.org") .header("Host", "www.bar.org")
.build() .build()
).then(response -> response.body(toMono(Map.class))); ).then(response -> response.body(toMono(Map.class)));
StepVerifier.create(result) verify( () ->
.consumeNextWith( StepVerifier.create(result)
response -> { .consumeNextWith(
assertThat(response).containsKey("headers").isInstanceOf(Map.class); response -> {
Map<String, Object> headers = (Map<String, Object>) response.get("headers"); assertThat(response).containsKey("headers").isInstanceOf(Map.class);
assertThat(headers).containsEntry("X-Request-Foo", "Bar"); Map<String, Object> headers = (Map<String, Object>) response.get("headers");
}) assertThat(headers).containsEntry("X-Request-Foo", "Bar");
.expectComplete() })
.verify(Duration.ofSeconds(3)); .expectComplete()
.verify(Duration.ofSeconds(3))
);
} }
@Test @Test
@ -143,23 +157,13 @@ public class GatewayIntegrationTests {
Mono<Map> result = webClient.exchange(request) Mono<Map> result = webClient.exchange(request)
.then(response -> response.body(toMono(Map.class))); .then(response -> response.body(toMono(Map.class)));
final Result testResult = new Result();
IntStream.range(0, 3).forEach(i -> {
try {
StepVerifier.create(result)
.consumeNextWith(map -> assertThat(map).containsEntry("data", "testdata"))
.expectComplete()
.verify(Duration.ofSeconds(3));
testResult.passedOnce = true;
} catch (AssertionError e) {
testResult.error = e;
}
});
if (!testResult.passedOnce && testResult.error != null) { verify( () ->
throw testResult.error; StepVerifier.create(result)
} .consumeNextWith(map -> assertThat(map).containsEntry("data", "testdata"))
.expectComplete()
.verify(Duration.ofSeconds(3))
);
} }
@Test @Test
@ -172,6 +176,7 @@ public class GatewayIntegrationTests {
.build() .build()
); );
verify( () ->
StepVerifier.create(result) StepVerifier.create(result)
.consumeNextWith( .consumeNextWith(
response -> { response -> {
@ -186,7 +191,8 @@ public class GatewayIntegrationTests {
assertThat(statusCode).isEqualTo(HttpStatus.OK); assertThat(statusCode).isEqualTo(HttpStatus.OK);
}) })
.expectComplete() .expectComplete()
.verify(); .verify()
);
} }
@EnableAutoConfiguration @EnableAutoConfiguration

5
src/test/resources/application.yml

@ -18,8 +18,7 @@ spring:
- Query=baz - Query=baz
- Cookie=chocolate, ch.p - Cookie=chocolate, ch.p
filters: filters:
- AppendRequestHeader=X-Request-Foo, Bar - AddResponseHeader=X-Response-Foo, Bar
- AppendResponseHeader=X-Response-Foo, Bar
# ===================================== # =====================================
- id: host_bar_path_headers_to_httpbin - id: host_bar_path_headers_to_httpbin
@ -28,7 +27,7 @@ spring:
- Host=**.bar.org - Host=**.bar.org
- Url=/headers - Url=/headers
filters: filters:
- AppendRequestHeader=X-Request-Foo, Bar - AddRequestHeader=X-Request-Foo, Bar
# ===================================== # =====================================
- id: default_path_to_httpbin - id: default_path_to_httpbin

Loading…
Cancel
Save