From c6dd6df2f05c332139f25ac26d3c33e0f262f294 Mon Sep 17 00:00:00 2001 From: Spencer Gibb Date: Fri, 20 Jan 2017 16:36:29 -0700 Subject: [PATCH] BeforeRoutePredicate --- .../config/GatewayAutoConfiguration.java | 6 ++ .../predicate/BeforeRoutePredicate.java | 33 ++++++++++ .../predicate/BeforeRoutePredicateTests.java | 61 +++++++++++++++++++ 3 files changed, 100 insertions(+) create mode 100644 src/main/java/org/springframework/cloud/gateway/handler/predicate/BeforeRoutePredicate.java create mode 100644 src/test/java/org/springframework/cloud/gateway/handler/predicate/BeforeRoutePredicateTests.java diff --git a/src/main/java/org/springframework/cloud/gateway/config/GatewayAutoConfiguration.java b/src/main/java/org/springframework/cloud/gateway/config/GatewayAutoConfiguration.java index d7bbfad2..210f2717 100644 --- a/src/main/java/org/springframework/cloud/gateway/config/GatewayAutoConfiguration.java +++ b/src/main/java/org/springframework/cloud/gateway/config/GatewayAutoConfiguration.java @@ -31,6 +31,7 @@ import org.springframework.cloud.gateway.filter.route.SetStatusRouteFilter; import org.springframework.cloud.gateway.handler.FilteringWebHandler; import org.springframework.cloud.gateway.handler.RoutePredicateHandlerMapping; import org.springframework.cloud.gateway.handler.RoutingWebHandler; +import org.springframework.cloud.gateway.handler.predicate.BeforeRoutePredicate; import org.springframework.cloud.gateway.handler.predicate.CookieRoutePredicate; import org.springframework.cloud.gateway.handler.predicate.HeaderRoutePredicate; import org.springframework.cloud.gateway.handler.predicate.HostRoutePredicate; @@ -118,6 +119,11 @@ public class GatewayAutoConfiguration { // Predicate beans + @Bean(name = "BeforeRoutePredicate") + public BeforeRoutePredicate beforeRoutePredicate() { + return new BeforeRoutePredicate(); + } + @Bean(name = "CookieRoutePredicate") public CookieRoutePredicate cookieRoutePredicate() { return new CookieRoutePredicate(); diff --git a/src/main/java/org/springframework/cloud/gateway/handler/predicate/BeforeRoutePredicate.java b/src/main/java/org/springframework/cloud/gateway/handler/predicate/BeforeRoutePredicate.java new file mode 100644 index 00000000..f701dae4 --- /dev/null +++ b/src/main/java/org/springframework/cloud/gateway/handler/predicate/BeforeRoutePredicate.java @@ -0,0 +1,33 @@ +package org.springframework.cloud.gateway.handler.predicate; + +import java.time.ZonedDateTime; +import java.util.function.Predicate; + +import org.springframework.web.server.ServerWebExchange; + +/** + * @author Spencer Gibb + */ +public class BeforeRoutePredicate implements RoutePredicate { + + @Override + public Predicate apply(String dateString, String[] args) { + //TODO: is ZonedDateTime the right thing to use? + try { + final long epoch = Long.parseLong(dateString); + + return exchange -> { + final long now = System.currentTimeMillis(); + return epoch < now; + }; + } catch (NumberFormatException e) { + // try ZonedDateTime instead + final ZonedDateTime dateTime = ZonedDateTime.parse(dateString); + + return exchange -> { + final ZonedDateTime now = ZonedDateTime.now(); + return dateTime.isBefore(now); + }; + } + } +} diff --git a/src/test/java/org/springframework/cloud/gateway/handler/predicate/BeforeRoutePredicateTests.java b/src/test/java/org/springframework/cloud/gateway/handler/predicate/BeforeRoutePredicateTests.java new file mode 100644 index 00000000..a9106c16 --- /dev/null +++ b/src/test/java/org/springframework/cloud/gateway/handler/predicate/BeforeRoutePredicateTests.java @@ -0,0 +1,61 @@ +package org.springframework.cloud.gateway.handler.predicate; + +import java.time.LocalDateTime; +import java.time.ZoneOffset; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; + +import org.junit.Test; +import org.springframework.mock.http.server.reactive.MockServerHttpRequest; +import org.springframework.mock.http.server.reactive.MockServerHttpResponse; +import org.springframework.web.server.ServerWebExchange; +import org.springframework.web.server.adapter.DefaultServerWebExchange; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * @author Spencer Gibb + */ +public class BeforeRoutePredicateTests { + + @Test + public void beforeStringWorks() { + String dateString = ZonedDateTime.now().minusHours(1).format(DateTimeFormatter.ISO_ZONED_DATE_TIME); + + final boolean result = new BeforeRoutePredicate().apply(dateString, null).test(getExchange()); + + assertThat(result).isTrue(); + } + + @Test + public void afterStringWorks() { + String dateString = ZonedDateTime.now().plusHours(1).format(DateTimeFormatter.ISO_ZONED_DATE_TIME); + + final boolean result = new BeforeRoutePredicate().apply(dateString, null).test(getExchange()); + + assertThat(result).isFalse(); + } + + @Test + public void beforeEpochWorks() { + String dateString = String.valueOf(System.currentTimeMillis()-(1000*60*60)); + + final boolean result = new BeforeRoutePredicate().apply(dateString, null).test(getExchange()); + + assertThat(result).isTrue(); + } + + @Test + public void afterEpochWorks() { + String dateString = String.valueOf(System.currentTimeMillis()+(1000*60*60)); + + final boolean result = new BeforeRoutePredicate().apply(dateString, null).test(getExchange()); + + assertThat(result).isFalse(); + } + + private ServerWebExchange getExchange() { + final MockServerHttpRequest request = MockServerHttpRequest.get("http://example.com").build(); + return new DefaultServerWebExchange(request, new MockServerHttpResponse()); + } +}