From 9f9454b91fbeb00fafad39380ff90139703457cc Mon Sep 17 00:00:00 2001 From: Spencer Gibb Date: Mon, 25 Feb 2019 13:26:30 -0500 Subject: [PATCH] Only tests for management port if it's different than server.port. fixes gh-854 --- .../handler/RoutePredicateHandlerMapping.java | 53 +++++++++++--- ...ingSameManagementPortIntegrationTests.java | 69 +++++++++++++++++++ 2 files changed, 113 insertions(+), 9 deletions(-) create mode 100644 spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/handler/RoutePredicateHandlerMappingSameManagementPortIntegrationTests.java diff --git a/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/handler/RoutePredicateHandlerMapping.java b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/handler/RoutePredicateHandlerMapping.java index 2b1d9ac0..491a892c 100644 --- a/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/handler/RoutePredicateHandlerMapping.java +++ b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/handler/RoutePredicateHandlerMapping.java @@ -29,6 +29,9 @@ import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.reactive.handler.AbstractHandlerMapping; import org.springframework.web.server.ServerWebExchange; +import static org.springframework.cloud.gateway.handler.RoutePredicateHandlerMapping.ManagementPortType.DIFFERENT; +import static org.springframework.cloud.gateway.handler.RoutePredicateHandlerMapping.ManagementPortType.DISABLED; +import static org.springframework.cloud.gateway.handler.RoutePredicateHandlerMapping.ManagementPortType.SAME; import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_HANDLER_MAPPER_ATTR; import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_PREDICATE_ROUTE_ATTR; import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR; @@ -40,25 +43,39 @@ public class RoutePredicateHandlerMapping extends AbstractHandlerMapping { private final FilteringWebHandler webHandler; private final RouteLocator routeLocator; - private final Integer managmentPort; + private final Integer managementPort; + private final ManagementPortType managementPortType; public RoutePredicateHandlerMapping(FilteringWebHandler webHandler, RouteLocator routeLocator, GlobalCorsProperties globalCorsProperties, Environment environment) { this.webHandler = webHandler; this.routeLocator = routeLocator; - if (environment.containsProperty("management.server.port")) { - managmentPort = new Integer(environment.getProperty("management.server.port")); - } else { - managmentPort = null; - } - setOrder(1); + this.managementPort = getPortProperty(environment, "management.server."); + this.managementPortType = getManagementPortType(environment); + setOrder(1); setCorsConfigurations(globalCorsProperties.getCorsConfigurations()); } + private ManagementPortType getManagementPortType(Environment environment) { + Integer serverPort = getPortProperty(environment, "server."); + if (this.managementPort != null && this.managementPort < 0) { + return DISABLED; + } + return ((this.managementPort == null + || (serverPort == null && this.managementPort.equals(8080)) + || (this.managementPort != 0 && this.managementPort.equals(serverPort))) ? SAME + : DIFFERENT); + } + + private static Integer getPortProperty(Environment environment, String prefix) { + return environment.getProperty(prefix + "port", Integer.class); + } + @Override protected Mono getHandlerInternal(ServerWebExchange exchange) { - // don't handle requests on the management port if set - if (managmentPort != null && exchange.getRequest().getURI().getPort() == managmentPort.intValue()) { + // don't handle requests on management port if set and different than server port + if (this.managementPortType == DIFFERENT && this.managementPort != null + && exchange.getRequest().getURI().getPort() == this.managementPort) { return Mono.empty(); } exchange.getAttributes().put(GATEWAY_HANDLER_MAPPER_ATTR, getSimpleName()); @@ -149,4 +166,22 @@ public class RoutePredicateHandlerMapping extends AbstractHandlerMapping { protected String getSimpleName() { return "RoutePredicateHandlerMapping"; } + + public enum ManagementPortType { + + /** + * The management port has been disabled. + */ + DISABLED, + + /** + * The management port is the same as the server port. + */ + SAME, + + /** + * The management port and server port are different. + */ + DIFFERENT; + } } diff --git a/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/handler/RoutePredicateHandlerMappingSameManagementPortIntegrationTests.java b/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/handler/RoutePredicateHandlerMappingSameManagementPortIntegrationTests.java new file mode 100644 index 00000000..dae5336e --- /dev/null +++ b/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/handler/RoutePredicateHandlerMappingSameManagementPortIntegrationTests.java @@ -0,0 +1,69 @@ +/* + * Copyright 2013-2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.springframework.cloud.gateway.handler; + +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.springframework.boot.SpringBootConfiguration; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.cloud.gateway.test.BaseWebClientTests; +import org.springframework.context.annotation.Import; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.util.SocketUtils; + +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.DEFINED_PORT; + +@RunWith(SpringRunner.class) +@SpringBootTest(webEnvironment = DEFINED_PORT) +@DirtiesContext +public class RoutePredicateHandlerMappingSameManagementPortIntegrationTests extends BaseWebClientTests { + + private static int samePort; + + @BeforeClass + public static void beforeClass() { + samePort = SocketUtils.findAvailableTcpPort(); + System.setProperty("server.port", String.valueOf(samePort)); + System.setProperty("management.server.port", String.valueOf(samePort)); + } + + @AfterClass + public static void afterClass() { + System.clearProperty("server.port"); + System.clearProperty("management.server.port"); + } + + @Test + public void requestsToGatewaySucceed() { + testClient.mutate().baseUrl("http://localhost:"+ samePort).build() + .get().uri("/get") + .exchange() + .expectStatus().isOk(); + } + + @EnableAutoConfiguration + @SpringBootConfiguration + @Import(DefaultTestConfig.class) + public static class TestConfig { } + +}