Skip to content

Commit

Permalink
Add predicate to detect requests made for a Cloud Foundry route servi…
Browse files Browse the repository at this point in the history
  • Loading branch information
fitzoh authored and bijukunjummen committed Jun 8, 2018
1 parent 3258204 commit 1eedb66
Show file tree
Hide file tree
Showing 2 changed files with 99 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -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);
}
}
Original file line number Diff line number Diff line change
@@ -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();
}
}

0 comments on commit 1eedb66

Please sign in to comment.