Browse Source

Add predicate to detect requests made for a Cloud Foundry route service. (#241)

See gh-190
pull/275/head
Andrew Fitzgerald 7 years ago committed by Spencer Gibb
parent
commit
dc4679b987
  1. 38
      spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/handler/predicate/CloudFoundryRouteServicePredicateFactory.java
  2. 61
      spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/handler/predicate/CloudFoundryRouteServicePredicateFactoryTest.java

38
spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/handler/predicate/CloudFoundryRouteServicePredicateFactory.java

@ -0,0 +1,38 @@ @@ -0,0 +1,38 @@
package org.springframework.cloud.gateway.handler.predicate;
import java.util.function.Predicate;
import org.springframework.web.server.ServerWebExchange;
/**
* Creates a predicate which indicates if the request is intended for a Cloud Foundry Route Service.
* @see <a href="https://docs.cloudfoundry.org/services/route-services.html">Cloud Foundry Route Service documentation</a>.
* @author Andrew Fitzgerald
*/
public class CloudFoundryRouteServicePredicateFactory extends
AbstractRoutePredicateFactory<Object> {
public static final String X_CF_FORWARDED_URL = "X-CF-Forwarded-Url";
public static final String X_CF_PROXY_SIGNATURE = "X-CF-Proxy-Signature";
public static final String X_CF_PROXY_METADATA = "X-CF-Proxy-Metadata";
private final HeaderRoutePredicateFactory factory = new HeaderRoutePredicateFactory();
public CloudFoundryRouteServicePredicateFactory() {
super(Object.class);
}
@Override
public Predicate<ServerWebExchange> apply(
Object unused) {
return headerPredicate(X_CF_FORWARDED_URL)
.and(headerPredicate(X_CF_PROXY_SIGNATURE))
.and(headerPredicate(X_CF_PROXY_METADATA));
}
private Predicate<ServerWebExchange> headerPredicate(String header) {
HeaderRoutePredicateFactory.Config config = factory.newConfig();
config.setHeader(header);
config.setRegexp(".*");
return factory.apply(config);
}
}

61
spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/handler/predicate/CloudFoundryRouteServicePredicateFactoryTest.java

@ -0,0 +1,61 @@ @@ -0,0 +1,61 @@
package org.springframework.cloud.gateway.handler.predicate;
import static org.assertj.core.api.Assertions.assertThat;
import java.util.function.Predicate;
import org.junit.Before;
import org.junit.Test;
import org.springframework.mock.http.server.reactive.MockServerHttpRequest;
import org.springframework.mock.web.server.MockServerWebExchange;
import org.springframework.web.server.ServerWebExchange;
/**
* @author Andrew Fitzgerald
*/
public class CloudFoundryRouteServicePredicateFactoryTest {
private Predicate<ServerWebExchange> predicate;
@Before
public void setUp() throws Exception {
CloudFoundryRouteServicePredicateFactory factory = new CloudFoundryRouteServicePredicateFactory();
predicate = factory.apply(factory.newConfig());
}
@Test
public void itReturnsTrueWithAllHeadersPresent() {
MockServerHttpRequest request = MockServerHttpRequest.get("someurl")
.header(CloudFoundryRouteServicePredicateFactory.X_CF_FORWARDED_URL,
"url")
.header(CloudFoundryRouteServicePredicateFactory.X_CF_PROXY_METADATA,
"metadata")
.header(CloudFoundryRouteServicePredicateFactory.X_CF_PROXY_SIGNATURE,
"signature")
.build();
MockServerWebExchange exchange = MockServerWebExchange.from(request);
assertThat(predicate.test(exchange)).isTrue();
}
@Test
public void itReturnsFalseWithAHeadersMissing() {
MockServerHttpRequest request = MockServerHttpRequest.get("someurl")
.header(CloudFoundryRouteServicePredicateFactory.X_CF_FORWARDED_URL,
"url")
.header(CloudFoundryRouteServicePredicateFactory.X_CF_PROXY_METADATA,
"metadata")
.build();
MockServerWebExchange exchange = MockServerWebExchange.from(request);
assertThat(predicate.test(exchange)).isFalse();
}
@Test
public void itReturnsFalseWithNoHeaders() {
MockServerHttpRequest request = MockServerHttpRequest.get("someurl").build();
MockServerWebExchange exchange = MockServerWebExchange.from(request);
assertThat(predicate.test(exchange)).isFalse();
}
}
Loading…
Cancel
Save