diff --git a/docs/pom.xml b/docs/pom.xml
index 177586100..310e2738d 100644
--- a/docs/pom.xml
+++ b/docs/pom.xml
@@ -5,7 +5,7 @@
org.springframework.cloud
spring-cloud-netflix
- 2.2.4.BUILD-SNAPSHOT
+ 2.2.5.BUILD-SNAPSHOT
spring-cloud-netflix-docs
pom
diff --git a/docs/src/main/asciidoc/spring-cloud-netflix.adoc b/docs/src/main/asciidoc/spring-cloud-netflix.adoc
index 3e8578819..667e2f5dc 100755
--- a/docs/src/main/asciidoc/spring-cloud-netflix.adoc
+++ b/docs/src/main/asciidoc/spring-cloud-netflix.adoc
@@ -773,6 +773,10 @@ Then visit `/hystrix` and point the dashboard to an individual instance's `/hyst
NOTE: When connecting to a `/hystrix.stream` endpoint that uses HTTPS, the certificate used by the server must be trusted by the JVM.
If the certificate is not trusted, you must import the certificate into the JVM in order for the Hystrix Dashboard to make a successful connection to the stream endpoint.
+NOTE: In order to use the `/proxy.stream` endpoint you must configure a list of hosts to allow connections to. To set the
+list of allowed hosts use `hystrix.dashboard.proxyStreamAllowList`. You can use an Ant-style pattern in the host name to
+match against a wider range of host names.
+
=== Turbine
Looking at an individual instance's Hystrix data is not very useful in terms of the overall health of the system. https://github.com/Netflix/Turbine[Turbine] is an application that aggregates all of the relevant `/hystrix.stream` endpoints into a combined `/turbine.stream` for use in the Hystrix Dashboard.
diff --git a/pom.xml b/pom.xml
index 9983be32b..02a496fac 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,14 +3,14 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
spring-cloud-netflix
- 2.2.4.BUILD-SNAPSHOT
+ 2.2.5.BUILD-SNAPSHOT
pom
Spring Cloud Netflix
Spring Cloud Netflix
org.springframework.cloud
spring-cloud-build
- 2.3.1.BUILD-SNAPSHOT
+ 2.3.2.BUILD-SNAPSHOT
@@ -21,9 +21,9 @@
netflix
- 2.2.4.BUILD-SNAPSHOT
- 2.2.4.BUILD-SNAPSHOT
- Horsham.SR5
+ 2.2.5.BUILD-SNAPSHOT
+ 2.2.5.BUILD-SNAPSHOT
+ Horsham.SR7
2.2.1.RELEASE
diff --git a/spring-cloud-netflix-archaius/pom.xml b/spring-cloud-netflix-archaius/pom.xml
index 39e2aef2c..e47c38262 100644
--- a/spring-cloud-netflix-archaius/pom.xml
+++ b/spring-cloud-netflix-archaius/pom.xml
@@ -6,7 +6,7 @@
spring-cloud-netflix
org.springframework.cloud
- 2.2.4.BUILD-SNAPSHOT
+ 2.2.5.BUILD-SNAPSHOT
..
diff --git a/spring-cloud-netflix-concurrency-limits/pom.xml b/spring-cloud-netflix-concurrency-limits/pom.xml
index 4c44c3e41..4bf630155 100644
--- a/spring-cloud-netflix-concurrency-limits/pom.xml
+++ b/spring-cloud-netflix-concurrency-limits/pom.xml
@@ -5,7 +5,7 @@
org.springframework.cloud
spring-cloud-netflix
- 2.2.4.BUILD-SNAPSHOT
+ 2.2.5.BUILD-SNAPSHOT
..
spring-cloud-netflix-concurrency-limits
diff --git a/spring-cloud-netflix-core/pom.xml b/spring-cloud-netflix-core/pom.xml
index 56d868c69..3a9e6baf6 100644
--- a/spring-cloud-netflix-core/pom.xml
+++ b/spring-cloud-netflix-core/pom.xml
@@ -5,7 +5,7 @@
org.springframework.cloud
spring-cloud-netflix
- 2.2.4.BUILD-SNAPSHOT
+ 2.2.5.BUILD-SNAPSHOT
..
spring-cloud-netflix-core
diff --git a/spring-cloud-netflix-dependencies/pom.xml b/spring-cloud-netflix-dependencies/pom.xml
index 833a20f18..1b892418a 100644
--- a/spring-cloud-netflix-dependencies/pom.xml
+++ b/spring-cloud-netflix-dependencies/pom.xml
@@ -5,18 +5,18 @@
spring-cloud-dependencies-parent
org.springframework.cloud
- 2.3.1.BUILD-SNAPSHOT
+ 2.3.2.BUILD-SNAPSHOT
spring-cloud-netflix-dependencies
- 2.2.4.BUILD-SNAPSHOT
+ 2.2.5.BUILD-SNAPSHOT
pom
spring-cloud-netflix-dependencies
Spring Cloud Netflix Dependencies
0.7.6
0.1.12
- 1.9.21
+ 1.9.25
0.3.0
1.5.18
2.3.0
diff --git a/spring-cloud-netflix-eureka-client-tls-tests/pom.xml b/spring-cloud-netflix-eureka-client-tls-tests/pom.xml
index a1fe4c08e..649b6885d 100644
--- a/spring-cloud-netflix-eureka-client-tls-tests/pom.xml
+++ b/spring-cloud-netflix-eureka-client-tls-tests/pom.xml
@@ -5,7 +5,7 @@
org.springframework.cloud
spring-cloud-netflix
- 2.2.4.BUILD-SNAPSHOT
+ 2.2.5.BUILD-SNAPSHOT
..
spring-cloud-netflix-eureka-client-tls-tests
diff --git a/spring-cloud-netflix-eureka-client-tls-tests/src/test/java/org/springframework/cloud/netflix/eureka/BaseCertTest.java b/spring-cloud-netflix-eureka-client-tls-tests/src/test/java/org/springframework/cloud/netflix/eureka/BaseCertTest.java
index b224ecb0c..f4bb62115 100644
--- a/spring-cloud-netflix-eureka-client-tls-tests/src/test/java/org/springframework/cloud/netflix/eureka/BaseCertTest.java
+++ b/spring-cloud-netflix-eureka-client-tls-tests/src/test/java/org/springframework/cloud/netflix/eureka/BaseCertTest.java
@@ -23,7 +23,7 @@ import java.security.KeyStore;
import org.junit.BeforeClass;
-public class BaseCertTest {
+public abstract class BaseCertTest {
protected static final String KEY_STORE_PASSWORD = "test-key-store-password";
@@ -41,6 +41,9 @@ public class BaseCertTest {
protected static File wrongClientCert;
+ protected BaseCertTest() {
+ }
+
@BeforeClass
public static void createCertificates() throws Exception {
KeyTool tool = new KeyTool();
diff --git a/spring-cloud-netflix-eureka-client/pom.xml b/spring-cloud-netflix-eureka-client/pom.xml
index c572a300b..0a1dffb15 100644
--- a/spring-cloud-netflix-eureka-client/pom.xml
+++ b/spring-cloud-netflix-eureka-client/pom.xml
@@ -5,7 +5,7 @@
org.springframework.cloud
spring-cloud-netflix
- 2.2.4.BUILD-SNAPSHOT
+ 2.2.5.BUILD-SNAPSHOT
..
spring-cloud-netflix-eureka-client
diff --git a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/config/DiscoveryClientOptionalArgsConfiguration.java b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/config/DiscoveryClientOptionalArgsConfiguration.java
index 88300bcc7..5b5b32aa9 100644
--- a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/config/DiscoveryClientOptionalArgsConfiguration.java
+++ b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/config/DiscoveryClientOptionalArgsConfiguration.java
@@ -23,6 +23,7 @@ import com.netflix.discovery.AbstractDiscoveryClientOptionalArgs;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.springframework.beans.factory.ObjectProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
@@ -35,6 +36,7 @@ import org.springframework.cloud.netflix.eureka.http.RestTemplateDiscoveryClient
import org.springframework.cloud.netflix.eureka.http.WebClientDiscoveryClientOptionalArgs;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
+import org.springframework.web.reactive.function.client.WebClient;
/**
* @author Daniel Lavoie
@@ -46,7 +48,8 @@ public class DiscoveryClientOptionalArgsConfiguration {
@Autowired
private TlsProperties tls;
- protected final Log logger = LogFactory.getLog(getClass());
+ protected static final Log logger = LogFactory
+ .getLog(DiscoveryClientOptionalArgsConfiguration.class);
@Bean
@ConditionalOnMissingClass("com.sun.jersey.api.client.filter.ClientFilter")
@@ -62,24 +65,6 @@ public class DiscoveryClientOptionalArgsConfiguration {
return result;
}
- @Bean
- @ConditionalOnMissingClass("com.sun.jersey.api.client.filter.ClientFilter")
- @ConditionalOnClass(
- name = "org.springframework.web.reactive.function.client.WebClient")
- @ConditionalOnMissingBean(
- value = { AbstractDiscoveryClientOptionalArgs.class,
- RestTemplateDiscoveryClientOptionalArgs.class },
- search = SearchStrategy.CURRENT)
- @ConditionalOnProperty(prefix = "eureka.client", name = "webclient.enabled",
- havingValue = "true")
- public WebClientDiscoveryClientOptionalArgs webClientDiscoveryClientOptionalArgs()
- throws GeneralSecurityException, IOException {
- logger.info("Eureka HTTP Client uses WebClient.");
- WebClientDiscoveryClientOptionalArgs result = new WebClientDiscoveryClientOptionalArgs();
- setupTLS(result);
- return result;
- }
-
@Bean
@ConditionalOnClass(name = "com.sun.jersey.api.client.filter.ClientFilter")
@ConditionalOnMissingBean(value = AbstractDiscoveryClientOptionalArgs.class,
@@ -99,6 +84,40 @@ public class DiscoveryClientOptionalArgsConfiguration {
}
}
+ @ConditionalOnMissingClass("com.sun.jersey.api.client.filter.ClientFilter")
+ @ConditionalOnClass(
+ name = "org.springframework.web.reactive.function.client.WebClient")
+ @ConditionalOnProperty(prefix = "eureka.client", name = "webclient.enabled",
+ havingValue = "true")
+ protected static class WebClientConfiguration {
+
+ @Autowired
+ private TlsProperties tls;
+
+ @Bean
+ @ConditionalOnMissingBean(
+ value = { AbstractDiscoveryClientOptionalArgs.class,
+ RestTemplateDiscoveryClientOptionalArgs.class },
+ search = SearchStrategy.CURRENT)
+ public WebClientDiscoveryClientOptionalArgs webClientDiscoveryClientOptionalArgs(
+ ObjectProvider builder)
+ throws GeneralSecurityException, IOException {
+ logger.info("Eureka HTTP Client uses WebClient.");
+ WebClientDiscoveryClientOptionalArgs result = new WebClientDiscoveryClientOptionalArgs(
+ builder::getIfAvailable);
+ setupTLS(result);
+ return result;
+ }
+
+ private void setupTLS(AbstractDiscoveryClientOptionalArgs> args)
+ throws GeneralSecurityException, IOException {
+ if (tls.isEnabled()) {
+ args.setSSLContext(tls.createSSLContext());
+ }
+ }
+
+ }
+
@Configuration
@ConditionalOnMissingClass({ "com.sun.jersey.api.client.filter.ClientFilter",
"org.springframework.web.reactive.function.client.WebClient" })
diff --git a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/config/EurekaConfigServerBootstrapConfiguration.java b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/config/EurekaConfigServerBootstrapConfiguration.java
index bced10eb3..f2e6f4018 100644
--- a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/config/EurekaConfigServerBootstrapConfiguration.java
+++ b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/config/EurekaConfigServerBootstrapConfiguration.java
@@ -29,10 +29,14 @@ import com.netflix.discovery.shared.transport.EurekaHttpResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.springframework.beans.factory.ObjectProvider;
+import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.condition.SearchStrategy;
+import org.springframework.boot.autoconfigure.http.codec.CodecsAutoConfiguration;
+import org.springframework.boot.autoconfigure.web.reactive.function.client.WebClientAutoConfiguration;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.config.client.ConfigServerInstanceProvider;
@@ -48,6 +52,7 @@ import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.http.HttpStatus;
import org.springframework.util.StringUtils;
+import org.springframework.web.reactive.function.client.WebClient;
/**
* Bootstrap configuration for config client that wants to lookup the config server via
@@ -72,18 +77,6 @@ public class EurekaConfigServerBootstrapConfiguration {
return new EurekaClientConfigBean();
}
- @Bean
- @ConditionalOnMissingBean(EurekaHttpClient.class)
- @ConditionalOnClass(
- name = "org.springframework.web.reactive.function.client.WebClient")
- @ConditionalOnProperty(prefix = "eureka.client", name = "webclient.enabled",
- havingValue = "true")
- public WebClientEurekaHttpClient configDiscoveryWebClientEurekaHttpClient(
- EurekaClientConfigBean config, Environment env) {
- return (WebClientEurekaHttpClient) new WebClientTransportClientFactory()
- .newClient(new DefaultEndpoint(getEurekaUrl(config, env)));
- }
-
@Bean
@ConditionalOnMissingBean(EurekaHttpClient.class)
@ConditionalOnProperty(prefix = "eureka.client", name = "webclient.enabled",
@@ -94,7 +87,7 @@ public class EurekaConfigServerBootstrapConfiguration {
.newClient(new DefaultEndpoint(getEurekaUrl(config, env)));
}
- private String getEurekaUrl(EurekaClientConfigBean config, Environment env) {
+ private static String getEurekaUrl(EurekaClientConfigBean config, Environment env) {
List urls = EndpointUtils.getDiscoveryServiceUrls(config,
EurekaClientConfigBean.DEFAULT_ZONE, new HostnameBasedUrlRandomizer(
env.getProperty("eureka.instance.hostname")));
@@ -170,4 +163,25 @@ public class EurekaConfigServerBootstrapConfiguration {
}
+ @Configuration(proxyBeanMethods = false)
+ @ConditionalOnClass(
+ name = "org.springframework.web.reactive.function.client.WebClient")
+ @ConditionalOnProperty(prefix = "eureka.client", name = "webclient.enabled",
+ havingValue = "true")
+ @ImportAutoConfiguration({ CodecsAutoConfiguration.class,
+ WebClientAutoConfiguration.class })
+ protected static class WebClientConfiguration {
+
+ @Bean
+ @ConditionalOnMissingBean(EurekaHttpClient.class)
+ public WebClientEurekaHttpClient configDiscoveryWebClientEurekaHttpClient(
+ EurekaClientConfigBean config, ObjectProvider builder,
+ Environment env) {
+ return (WebClientEurekaHttpClient) new WebClientTransportClientFactory(
+ builder::getIfAvailable)
+ .newClient(new DefaultEndpoint(getEurekaUrl(config, env)));
+ }
+
+ }
+
}
diff --git a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/http/WebClientDiscoveryClientOptionalArgs.java b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/http/WebClientDiscoveryClientOptionalArgs.java
index 19d30ba1e..90680daaf 100644
--- a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/http/WebClientDiscoveryClientOptionalArgs.java
+++ b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/http/WebClientDiscoveryClientOptionalArgs.java
@@ -16,8 +16,12 @@
package org.springframework.cloud.netflix.eureka.http;
+import java.util.function.Supplier;
+
import com.netflix.discovery.AbstractDiscoveryClientOptionalArgs;
+import org.springframework.web.reactive.function.client.WebClient;
+
/**
* @author Daniel Lavoie
* @author Haytham Mohamed
@@ -25,8 +29,13 @@ import com.netflix.discovery.AbstractDiscoveryClientOptionalArgs;
public class WebClientDiscoveryClientOptionalArgs
extends AbstractDiscoveryClientOptionalArgs {
+ @Deprecated
public WebClientDiscoveryClientOptionalArgs() {
- setTransportClientFactories(new WebClientTransportClientFactories());
+ this(WebClient::builder);
+ }
+
+ public WebClientDiscoveryClientOptionalArgs(Supplier builder) {
+ setTransportClientFactories(new WebClientTransportClientFactories(builder));
}
}
diff --git a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/http/WebClientEurekaHttpClient.java b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/http/WebClientEurekaHttpClient.java
index 397e949ac..dd7b6785d 100644
--- a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/http/WebClientEurekaHttpClient.java
+++ b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/http/WebClientEurekaHttpClient.java
@@ -209,6 +209,10 @@ public class WebClientEurekaHttpClient implements EurekaHttpClient {
// Nothing to do
}
+ public WebClient getWebClient() {
+ return this.webClient;
+ }
+
private static Map headersOf(ClientResponse response) {
ClientResponse.Headers httpHeaders = response.headers();
if (httpHeaders == null) {
diff --git a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/http/WebClientTransportClientFactories.java b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/http/WebClientTransportClientFactories.java
index d35ce4ec7..22cc2d1d0 100644
--- a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/http/WebClientTransportClientFactories.java
+++ b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/http/WebClientTransportClientFactories.java
@@ -18,6 +18,7 @@ package org.springframework.cloud.netflix.eureka.http;
import java.util.Collection;
import java.util.Optional;
+import java.util.function.Supplier;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
@@ -28,12 +29,20 @@ import com.netflix.discovery.shared.transport.TransportClientFactory;
import com.netflix.discovery.shared.transport.jersey.EurekaJerseyClient;
import com.netflix.discovery.shared.transport.jersey.TransportClientFactories;
+import org.springframework.web.reactive.function.client.WebClient;
+
/**
* @author Daniel Lavoie
* @author Haytham Mohamed
*/
public class WebClientTransportClientFactories implements TransportClientFactories {
+ private final Supplier builder;
+
+ public WebClientTransportClientFactories(Supplier builder) {
+ this.builder = builder;
+ }
+
@Override
public TransportClientFactory newTransportClientFactory(
Collection additionalFilters, EurekaJerseyClient providedJerseyClient) {
@@ -44,7 +53,7 @@ public class WebClientTransportClientFactories implements TransportClientFactori
public TransportClientFactory newTransportClientFactory(
EurekaClientConfig clientConfig, Collection additionalFilters,
InstanceInfo myInstanceInfo) {
- return new WebClientTransportClientFactory();
+ return new WebClientTransportClientFactory(builder);
}
@Override
@@ -53,7 +62,7 @@ public class WebClientTransportClientFactories implements TransportClientFactori
final Collection additionalFilters, final InstanceInfo myInstanceInfo,
final Optional sslContext,
final Optional hostnameVerifier) {
- return new WebClientTransportClientFactory();
+ return new WebClientTransportClientFactory(builder);
}
}
diff --git a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/http/WebClientTransportClientFactory.java b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/http/WebClientTransportClientFactory.java
index fa6de993a..95f49f346 100644
--- a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/http/WebClientTransportClientFactory.java
+++ b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/http/WebClientTransportClientFactory.java
@@ -18,6 +18,7 @@ package org.springframework.cloud.netflix.eureka.http;
import java.net.URI;
import java.net.URISyntaxException;
+import java.util.function.Supplier;
import com.fasterxml.jackson.databind.BeanDescription;
import com.fasterxml.jackson.databind.DeserializationFeature;
@@ -41,13 +42,13 @@ import reactor.core.publisher.Mono;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
+import org.springframework.http.codec.ClientCodecConfigurer;
import org.springframework.http.codec.json.Jackson2JsonDecoder;
import org.springframework.http.codec.json.Jackson2JsonEncoder;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.reactive.function.client.ClientResponse;
import org.springframework.web.reactive.function.client.ExchangeFilterFunction;
import org.springframework.web.reactive.function.client.ExchangeFilterFunctions;
-import org.springframework.web.reactive.function.client.ExchangeStrategies;
import org.springframework.web.reactive.function.client.WebClient;
/**
@@ -60,17 +61,29 @@ import org.springframework.web.reactive.function.client.WebClient;
*/
public class WebClientTransportClientFactory implements TransportClientFactory {
+ private final Supplier builderSupplier;
+
+ @Deprecated
+ public WebClientTransportClientFactory() {
+ this(WebClient::builder);
+ }
+
+ public WebClientTransportClientFactory(Supplier builderSupplier) {
+ this.builderSupplier = builderSupplier;
+ }
+
@Override
- public EurekaHttpClient newClient(EurekaEndpoint serviceUrl) {
- WebClient.Builder builder = of(serviceUrl.getServiceUrl());
- this.setExchangeStrategies(builder);
- this.skipHttp400Error(builder);
+ public EurekaHttpClient newClient(EurekaEndpoint endpoint) {
+ // we want a copy to modify. Don't change the original
+ WebClient.Builder builder = this.builderSupplier.get().clone();
+ setUrl(builder, endpoint.getServiceUrl());
+ setCodecs(builder);
+ builder.filter(http4XxErrorExchangeFilterFunction());
return new WebClientEurekaHttpClient(builder.build());
}
- private WebClient.Builder of(String serviceUrl) {
+ private WebClient.Builder setUrl(WebClient.Builder builder, String serviceUrl) {
String url = serviceUrl;
- WebClient.Builder builder = WebClient.builder();
try {
URI serviceURI = new URI(serviceUrl);
if (serviceURI.getUserInfo() != null) {
@@ -88,23 +101,17 @@ public class WebClientTransportClientFactory implements TransportClientFactory {
return builder.baseUrl(url);
}
- private void setExchangeStrategies(WebClient.Builder builder) {
+ private void setCodecs(WebClient.Builder builder) {
ObjectMapper objectMapper = objectMapper();
- ExchangeStrategies strategies = ExchangeStrategies.builder()
- .codecs(clientDefaultCodecsConfigurer -> {
- clientDefaultCodecsConfigurer.defaultCodecs()
- .jackson2JsonEncoder(new Jackson2JsonEncoder(objectMapper,
- MediaType.APPLICATION_JSON));
- clientDefaultCodecsConfigurer.defaultCodecs()
- .jackson2JsonDecoder(new Jackson2JsonDecoder(objectMapper,
- MediaType.APPLICATION_JSON));
+ builder.codecs(configurer -> {
+ ClientCodecConfigurer.ClientDefaultCodecs defaults = configurer
+ .defaultCodecs();
+ defaults.jackson2JsonEncoder(
+ new Jackson2JsonEncoder(objectMapper, MediaType.APPLICATION_JSON));
+ defaults.jackson2JsonDecoder(
+ new Jackson2JsonDecoder(objectMapper, MediaType.APPLICATION_JSON));
- }).build();
- builder.exchangeStrategies(strategies);
- }
-
- private void skipHttp400Error(WebClient.Builder builder) {
- builder.filter(http4XxErrorExchangeFilterFunction());
+ });
}
// Skip over 4xx http errors
@@ -114,9 +121,8 @@ public class WebClientTransportClientFactory implements TransportClientFactory {
if (clientResponse.statusCode().value() == 400) {
ClientResponse newResponse = ClientResponse.from(clientResponse)
.statusCode(HttpStatus.OK).build();
- newResponse.body((clientHttpResponse, context) -> {
- return clientHttpResponse.getBody();
- });
+ newResponse.body(
+ (clientHttpResponse, context) -> clientHttpResponse.getBody());
return Mono.just(newResponse);
}
return Mono.just(clientResponse);
diff --git a/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/config/EurekaConfigServerBootstrapConfigurationWebClientIntegrationTests.java b/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/config/EurekaConfigServerBootstrapConfigurationWebClientIntegrationTests.java
new file mode 100644
index 000000000..17179473c
--- /dev/null
+++ b/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/config/EurekaConfigServerBootstrapConfigurationWebClientIntegrationTests.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2013-2020 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
+ *
+ * https://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.netflix.eureka.config;
+
+import org.junit.jupiter.api.Test;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.SpringBootConfiguration;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.web.server.LocalServerPort;
+import org.springframework.cloud.netflix.eureka.http.WebClientEurekaHttpClient;
+import org.springframework.http.HttpStatus;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.reactive.function.client.ClientResponse;
+import org.springframework.web.reactive.function.client.WebClient;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT;
+
+/**
+ * @author Spencer Gibb
+ */
+@SpringBootTest(properties = { "spring.cloud.config.discovery.enabled=true",
+ "eureka.client.webclient.enabled=true",
+ "spring.codec.max-in-memory-size=310000" }, webEnvironment = RANDOM_PORT)
+public class EurekaConfigServerBootstrapConfigurationWebClientIntegrationTests {
+
+ @LocalServerPort
+ private int port;
+
+ @Autowired
+ private WebClientEurekaHttpClient eurekaHttpClient;
+
+ @Test
+ public void webClientRespectsCodecProperties() {
+ WebClient webClient = eurekaHttpClient.getWebClient();
+ ClientResponse response = webClient.get().uri("http://localhost:" + port)
+ .exchange().block();
+ assertThat(response).isNotNull();
+ assertThat(response.statusCode()).isEqualTo(HttpStatus.OK);
+ assertThat(response.bodyToMono(String.class).block()).startsWith("....")
+ .hasSize(300000);
+ }
+
+ @SpringBootConfiguration
+ @EnableAutoConfiguration
+ @RestController
+ static class WebClientController extends WebSecurityConfigurerAdapter {
+
+ @GetMapping
+ public String hello() {
+ StringBuilder s = new StringBuilder();
+ for (int i = 0; i < 300000; i++) {
+ s.append(".");
+ }
+ return s.toString();
+ }
+
+ @Override
+ protected void configure(HttpSecurity http) throws Exception {
+ http.authorizeRequests().anyRequest().permitAll().and().csrf().disable();
+ }
+
+ }
+
+}
diff --git a/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/http/WebClientEurekaHttpClientTest.java b/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/http/WebClientEurekaHttpClientTest.java
index baaa2239a..5f356cca7 100644
--- a/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/http/WebClientEurekaHttpClientTest.java
+++ b/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/http/WebClientEurekaHttpClientTest.java
@@ -29,6 +29,7 @@ import org.springframework.cloud.commons.util.InetUtils;
import org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.web.reactive.function.client.WebClient;
/**
* @author Daniel Lavoie
@@ -49,7 +50,7 @@ public class WebClientEurekaHttpClientTest extends AbstractEurekaHttpClientTest
@Before
public void setup() {
- eurekaHttpClient = new WebClientTransportClientFactory()
+ eurekaHttpClient = new WebClientTransportClientFactory(WebClient::builder)
.newClient(new DefaultEndpoint(serviceUrl));
EurekaInstanceConfigBean config = new EurekaInstanceConfigBean(inetUtils);
diff --git a/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/http/WebClientTransportClientFactoriesTest.java b/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/http/WebClientTransportClientFactoriesTest.java
index 234b0fed0..21437dbb0 100644
--- a/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/http/WebClientTransportClientFactoriesTest.java
+++ b/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/http/WebClientTransportClientFactoriesTest.java
@@ -18,6 +18,8 @@ package org.springframework.cloud.netflix.eureka.http;
import org.junit.Test;
+import org.springframework.web.reactive.function.client.WebClient;
+
/**
* @author Daniel Lavoie
*/
@@ -25,7 +27,8 @@ public class WebClientTransportClientFactoriesTest {
@Test(expected = UnsupportedOperationException.class)
public void testJerseyIsUnsuported() {
- new WebClientTransportClientFactories().newTransportClientFactory(null, null);
+ new WebClientTransportClientFactories(WebClient::builder)
+ .newTransportClientFactory(null, null);
}
}
diff --git a/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/http/WebClientTransportClientFactoryTest.java b/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/http/WebClientTransportClientFactoryTest.java
index 949d4085f..24363f8a7 100644
--- a/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/http/WebClientTransportClientFactoryTest.java
+++ b/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/http/WebClientTransportClientFactoryTest.java
@@ -21,6 +21,8 @@ import org.junit.After;
import org.junit.Before;
import org.junit.Test;
+import org.springframework.web.reactive.function.client.WebClient;
+
/**
* @author Daniel Lavoie
*/
@@ -30,7 +32,7 @@ public class WebClientTransportClientFactoryTest {
@Before
public void setup() {
- transportClientFatory = new WebClientTransportClientFactory();
+ transportClientFatory = new WebClientTransportClientFactory(WebClient::builder);
}
@Test
diff --git a/spring-cloud-netflix-eureka-server/pom.xml b/spring-cloud-netflix-eureka-server/pom.xml
index 0857a5ab7..693152602 100644
--- a/spring-cloud-netflix-eureka-server/pom.xml
+++ b/spring-cloud-netflix-eureka-server/pom.xml
@@ -5,7 +5,7 @@
org.springframework.cloud
spring-cloud-netflix
- 2.2.4.BUILD-SNAPSHOT
+ 2.2.5.BUILD-SNAPSHOT
..
spring-cloud-netflix-eureka-server
diff --git a/spring-cloud-netflix-hystrix-contract/pom.xml b/spring-cloud-netflix-hystrix-contract/pom.xml
index abf0cbba5..d54f78f78 100644
--- a/spring-cloud-netflix-hystrix-contract/pom.xml
+++ b/spring-cloud-netflix-hystrix-contract/pom.xml
@@ -5,11 +5,11 @@
org.springframework.cloud
spring-cloud-build
- 2.3.0.RELEASE
+ 2.3.1.RELEASE
spring-cloud-netflix-hystrix-contract
- 2.2.4.BUILD-SNAPSHOT
+ 2.2.5.BUILD-SNAPSHOT
jar
spring-cloud-netflix-hystrix-contract
Spring Cloud Netflix Hystrix Contract
diff --git a/spring-cloud-netflix-hystrix-dashboard/pom.xml b/spring-cloud-netflix-hystrix-dashboard/pom.xml
index 003f6de8c..18d9fa7bd 100644
--- a/spring-cloud-netflix-hystrix-dashboard/pom.xml
+++ b/spring-cloud-netflix-hystrix-dashboard/pom.xml
@@ -8,7 +8,7 @@
org.springframework.cloud
spring-cloud-netflix
- 2.2.4.BUILD-SNAPSHOT
+ 2.2.5.BUILD-SNAPSHOT
..
diff --git a/spring-cloud-netflix-hystrix-dashboard/src/main/java/org/springframework/cloud/netflix/hystrix/dashboard/HystrixDashboardConfiguration.java b/spring-cloud-netflix-hystrix-dashboard/src/main/java/org/springframework/cloud/netflix/hystrix/dashboard/HystrixDashboardConfiguration.java
index 9e0fa7431..4775881d9 100644
--- a/spring-cloud-netflix-hystrix-dashboard/src/main/java/org/springframework/cloud/netflix/hystrix/dashboard/HystrixDashboardConfiguration.java
+++ b/spring-cloud-netflix-hystrix-dashboard/src/main/java/org/springframework/cloud/netflix/hystrix/dashboard/HystrixDashboardConfiguration.java
@@ -19,7 +19,10 @@ package org.springframework.cloud.netflix.hystrix.dashboard;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
import java.util.Map;
+import java.util.Optional;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
@@ -47,6 +50,8 @@ import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpHeaders;
import org.springframework.ui.freemarker.SpringTemplateLoader;
+import org.springframework.util.AntPathMatcher;
+import org.springframework.util.PathMatcher;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;
/**
@@ -88,8 +93,9 @@ public class HystrixDashboardConfiguration {
}
@Bean
- public ServletRegistrationBean proxyStreamServlet() {
- final ProxyStreamServlet proxyStreamServlet = new ProxyStreamServlet();
+ public ServletRegistrationBean proxyStreamServlet(
+ HystrixDashboardProperties properties) {
+ final ProxyStreamServlet proxyStreamServlet = new ProxyStreamServlet(properties);
proxyStreamServlet.setEnableIgnoreConnectionCloseHeader(
this.dashboardProperties.isEnableIgnoreConnectionCloseHeader());
final ServletRegistrationBean registration = new ServletRegistrationBean(
@@ -118,6 +124,8 @@ public class HystrixDashboardConfiguration {
private boolean enableIgnoreConnectionCloseHeader = false;
+ private HystrixDashboardProperties properties;
+
public void setEnableIgnoreConnectionCloseHeader(
boolean enableIgnoreConnectionCloseHeader) {
this.enableIgnoreConnectionCloseHeader = enableIgnoreConnectionCloseHeader;
@@ -125,6 +133,11 @@ public class HystrixDashboardConfiguration {
public ProxyStreamServlet() {
super();
+ this.properties = new HystrixDashboardProperties();
+ }
+
+ public ProxyStreamServlet(HystrixDashboardProperties properties) {
+ this.properties = properties;
}
/**
@@ -169,10 +182,18 @@ public class HystrixDashboardConfiguration {
url.append(key).append("=").append(value);
}
}
- String proxyUrl = url.toString();
- log.info("\n\nProxy opening connection to: " + proxyUrl + "\n\n");
+ String proxyUrlString = url.toString();
+
+ if (!isAllowedToProxy(proxyUrlString)) {
+ log.warn("Origin parameter: " + origin
+ + " is not in the allowed list of proxy host names. If it "
+ + "should be allowed add it to hystrix.dashboard.proxyStreamAllowList.");
+ return;
+ }
+
+ log.info("\n\nProxy opening connection to: " + proxyUrlString + "\n\n");
try {
- httpget = new HttpGet(proxyUrl);
+ httpget = new HttpGet(proxyUrlString);
HttpClient client = ProxyConnectionManager.httpClient;
HttpResponse httpResponse = client.execute(httpget);
int statusCode = httpResponse.getStatusLine().getStatusCode();
@@ -218,7 +239,7 @@ public class HystrixDashboardConfiguration {
}
}
else {
- log.warn("Failed opening connection to " + proxyUrl + " : "
+ log.warn("Failed opening connection to " + proxyUrlString + " : "
+ statusCode + " : " + httpResponse.getStatusLine());
}
}
@@ -250,6 +271,22 @@ public class HystrixDashboardConfiguration {
}
+ private boolean isAllowedToProxy(String proxyUrlString)
+ throws MalformedURLException {
+
+ URL proxyUrl = new URL(proxyUrlString);
+ String host = proxyUrl.getHost();
+ PathMatcher pathMatcher = new AntPathMatcher(".");
+ Optional optionalPattern = properties.getProxyStreamAllowList()
+ .stream().filter(pattern -> pathMatcher.match(pattern, host))
+ .findFirst();
+
+ if (optionalPattern.isPresent()) {
+ return true;
+ }
+ return false;
+ }
+
private void copyHeadersToServletResponse(Header[] headers,
HttpServletResponse response) {
for (Header header : headers) {
diff --git a/spring-cloud-netflix-hystrix-dashboard/src/main/java/org/springframework/cloud/netflix/hystrix/dashboard/HystrixDashboardProperties.java b/spring-cloud-netflix-hystrix-dashboard/src/main/java/org/springframework/cloud/netflix/hystrix/dashboard/HystrixDashboardProperties.java
index 932f7aa8c..9145135f0 100644
--- a/spring-cloud-netflix-hystrix-dashboard/src/main/java/org/springframework/cloud/netflix/hystrix/dashboard/HystrixDashboardProperties.java
+++ b/spring-cloud-netflix-hystrix-dashboard/src/main/java/org/springframework/cloud/netflix/hystrix/dashboard/HystrixDashboardProperties.java
@@ -16,7 +16,10 @@
package org.springframework.cloud.netflix.hystrix.dashboard;
+import java.util.ArrayList;
+import java.util.Arrays;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import org.springframework.boot.context.properties.ConfigurationProperties;
@@ -41,6 +44,20 @@ public class HystrixDashboardProperties {
*/
private Map initParameters = new HashMap<>();
+ private List proxyStreamAllowList = new ArrayList<>();
+
+ public List getProxyStreamAllowList() {
+ return proxyStreamAllowList;
+ }
+
+ public void setProxyStreamAllowList(List proxyStreamAllowList) {
+ this.proxyStreamAllowList = proxyStreamAllowList;
+ }
+
+ public void setProxyStreamAllowList(String... regex) {
+ this.proxyStreamAllowList = Arrays.asList(regex);
+ }
+
public boolean isEnableIgnoreConnectionCloseHeader() {
return enableIgnoreConnectionCloseHeader;
}
diff --git a/spring-cloud-netflix-hystrix-dashboard/src/main/resources/templates/hystrix/monitor.ftlh b/spring-cloud-netflix-hystrix-dashboard/src/main/resources/templates/hystrix/monitor.ftlh
index 36b67a640..9f684fbb2 100644
--- a/spring-cloud-netflix-hystrix-dashboard/src/main/resources/templates/hystrix/monitor.ftlh
+++ b/spring-cloud-netflix-hystrix-dashboard/src/main/resources/templates/hystrix/monitor.ftlh
@@ -107,8 +107,8 @@
}
}
console.log("Command Stream: " + commandStream)
-
- $(window).load(function() { // within load with a setTimeout to prevent the infinite spinner
+
+ $(window).on("load", function () { // within load with a setTimeout to prevent the infinite spinner
setTimeout(function() {
if(commandStream == undefined) {
console.log("commandStream is undefined")
@@ -146,7 +146,7 @@
// thread pool
var dependencyThreadPoolMonitor = new HystrixThreadPoolMonitor('dependencyThreadPools');
- $(window).load(function() { // within load with a setTimeout to prevent the infinite spinner
+ $(window).on("load", function () { // within load with a setTimeout to prevent the infinite spinner
setTimeout(function() {
if(poolStream == undefined) {
console.log("poolStream is undefined")
diff --git a/spring-cloud-netflix-hystrix-dashboard/src/test/java/org/springframework/cloud/netflix/hystrix/dashboard/HystrixDashboardConfigurationTests.java b/spring-cloud-netflix-hystrix-dashboard/src/test/java/org/springframework/cloud/netflix/hystrix/dashboard/HystrixDashboardConfigurationTests.java
index 8245745ef..928ae2b7b 100644
--- a/spring-cloud-netflix-hystrix-dashboard/src/test/java/org/springframework/cloud/netflix/hystrix/dashboard/HystrixDashboardConfigurationTests.java
+++ b/spring-cloud-netflix-hystrix-dashboard/src/test/java/org/springframework/cloud/netflix/hystrix/dashboard/HystrixDashboardConfigurationTests.java
@@ -41,7 +41,8 @@ public class HystrixDashboardConfigurationTests {
MockHttpServletResponse response = new MockHttpServletResponse();
Header[] headers = new Header[1];
headers[0] = new BasicHeader("Content-Type", "text/proxy.stream");
- HystrixDashboardConfiguration.ProxyStreamServlet proxyStreamServlet = new HystrixDashboardConfiguration.ProxyStreamServlet();
+ HystrixDashboardConfiguration.ProxyStreamServlet proxyStreamServlet = new HystrixDashboardConfiguration.ProxyStreamServlet(
+ new HystrixDashboardProperties());
ReflectionTestUtils.invokeMethod(proxyStreamServlet,
"copyHeadersToServletResponse", headers, response);
assertThat(response.getHeaderNames().size()).isEqualTo(1);
@@ -54,7 +55,8 @@ public class HystrixDashboardConfigurationTests {
Header[] headers = new Header[2];
headers[0] = new BasicHeader("Content-Type", "text/proxy.stream");
headers[1] = new BasicHeader("Connection", "close");
- HystrixDashboardConfiguration.ProxyStreamServlet proxyStreamServlet = new HystrixDashboardConfiguration.ProxyStreamServlet();
+ HystrixDashboardConfiguration.ProxyStreamServlet proxyStreamServlet = new HystrixDashboardConfiguration.ProxyStreamServlet(
+ new HystrixDashboardProperties());
ReflectionTestUtils.invokeMethod(proxyStreamServlet,
"copyHeadersToServletResponse", headers, response);
assertThat(response.getHeaderNames().size()).isEqualTo(2);
@@ -68,7 +70,8 @@ public class HystrixDashboardConfigurationTests {
Header[] headers = new Header[2];
headers[0] = new BasicHeader("Content-Type", "text/proxy.stream");
headers[1] = new BasicHeader("Connection", "close");
- HystrixDashboardConfiguration.ProxyStreamServlet proxyStreamServlet = new HystrixDashboardConfiguration.ProxyStreamServlet();
+ HystrixDashboardConfiguration.ProxyStreamServlet proxyStreamServlet = new HystrixDashboardConfiguration.ProxyStreamServlet(
+ new HystrixDashboardProperties());
proxyStreamServlet.setEnableIgnoreConnectionCloseHeader(true);
ReflectionTestUtils.invokeMethod(proxyStreamServlet,
"copyHeadersToServletResponse", headers, response);
@@ -83,7 +86,8 @@ public class HystrixDashboardConfigurationTests {
Header[] headers = new Header[2];
headers[0] = new BasicHeader("Content-Type", "text/proxy.stream");
headers[1] = new BasicHeader("Connection", "close");
- HystrixDashboardConfiguration.ProxyStreamServlet proxyStreamServlet = new HystrixDashboardConfiguration.ProxyStreamServlet();
+ HystrixDashboardConfiguration.ProxyStreamServlet proxyStreamServlet = new HystrixDashboardConfiguration.ProxyStreamServlet(
+ new HystrixDashboardProperties());
proxyStreamServlet.setEnableIgnoreConnectionCloseHeader(false);
ReflectionTestUtils.invokeMethod(proxyStreamServlet,
"copyHeadersToServletResponse", headers, response);
@@ -111,4 +115,39 @@ public class HystrixDashboardConfigurationTests {
});
}
+ @Test
+ public void allowedHostsTest() {
+ HystrixDashboardProperties properties = new HystrixDashboardProperties();
+ HystrixDashboardConfiguration.ProxyStreamServlet proxyStreamServlet = new HystrixDashboardConfiguration.ProxyStreamServlet(
+ properties);
+ boolean allowed = ReflectionTestUtils.invokeMethod(proxyStreamServlet,
+ "isAllowedToProxy", "http://foo.com");
+ assertThat(allowed).isFalse();
+
+ properties.setProxyStreamAllowList("foo.com", "bar.*", "*world.com");
+ allowed = ReflectionTestUtils.invokeMethod(proxyStreamServlet, "isAllowedToProxy",
+ "http://user:password@foo.com");
+ assertThat(allowed).isTrue();
+
+ allowed = ReflectionTestUtils.invokeMethod(proxyStreamServlet, "isAllowedToProxy",
+ "http://bar.com");
+ assertThat(allowed).isTrue();
+
+ allowed = ReflectionTestUtils.invokeMethod(proxyStreamServlet, "isAllowedToProxy",
+ "http://bar.org");
+ assertThat(allowed).isTrue();
+
+ allowed = ReflectionTestUtils.invokeMethod(proxyStreamServlet, "isAllowedToProxy",
+ "http://helloworld.com");
+ assertThat(allowed).isTrue();
+
+ allowed = ReflectionTestUtils.invokeMethod(proxyStreamServlet, "isAllowedToProxy",
+ "http://world.com");
+ assertThat(allowed).isTrue();
+
+ allowed = ReflectionTestUtils.invokeMethod(proxyStreamServlet, "isAllowedToProxy",
+ "http://world.org");
+ assertThat(allowed).isFalse();
+ }
+
}
diff --git a/spring-cloud-netflix-hystrix-dashboard/src/test/java/org/springframework/cloud/netflix/hystrix/dashboard/HystrixDashboardHomePageTests.java b/spring-cloud-netflix-hystrix-dashboard/src/test/java/org/springframework/cloud/netflix/hystrix/dashboard/HystrixDashboardHomePageTests.java
index 6b2ff058f..1b3456593 100644
--- a/spring-cloud-netflix-hystrix-dashboard/src/test/java/org/springframework/cloud/netflix/hystrix/dashboard/HystrixDashboardHomePageTests.java
+++ b/spring-cloud-netflix-hystrix-dashboard/src/test/java/org/springframework/cloud/netflix/hystrix/dashboard/HystrixDashboardHomePageTests.java
@@ -67,6 +67,7 @@ public class HystrixDashboardHomePageTests {
ResponseEntity entity = new TestRestTemplate().getForEntity(
"http://localhost:" + this.port + "/hystrix/monitor", String.class);
assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK);
+ assertThat(entity.getBody()).contains("on(\"load\"");
}
@Configuration(proxyBeanMethods = false)
diff --git a/spring-cloud-netflix-hystrix-stream/pom.xml b/spring-cloud-netflix-hystrix-stream/pom.xml
index 86975fe44..c1017309f 100644
--- a/spring-cloud-netflix-hystrix-stream/pom.xml
+++ b/spring-cloud-netflix-hystrix-stream/pom.xml
@@ -6,7 +6,7 @@
org.springframework.cloud
spring-cloud-netflix
- 2.2.4.BUILD-SNAPSHOT
+ 2.2.5.BUILD-SNAPSHOT
..
spring-cloud-netflix-hystrix-stream
diff --git a/spring-cloud-netflix-hystrix/pom.xml b/spring-cloud-netflix-hystrix/pom.xml
index 2f7a13de4..19cd5fbdb 100644
--- a/spring-cloud-netflix-hystrix/pom.xml
+++ b/spring-cloud-netflix-hystrix/pom.xml
@@ -5,7 +5,7 @@
org.springframework.cloud
spring-cloud-netflix
- 2.2.4.BUILD-SNAPSHOT
+ 2.2.5.BUILD-SNAPSHOT
..
spring-cloud-netflix-hystrix
diff --git a/spring-cloud-netflix-ribbon/pom.xml b/spring-cloud-netflix-ribbon/pom.xml
index c5a5de0aa..9cfe6bbd2 100644
--- a/spring-cloud-netflix-ribbon/pom.xml
+++ b/spring-cloud-netflix-ribbon/pom.xml
@@ -5,7 +5,7 @@
spring-cloud-netflix
org.springframework.cloud
- 2.2.4.BUILD-SNAPSHOT
+ 2.2.5.BUILD-SNAPSHOT
..
4.0.0
diff --git a/spring-cloud-netflix-sidecar/pom.xml b/spring-cloud-netflix-sidecar/pom.xml
index e9f5cd232..38356ae18 100644
--- a/spring-cloud-netflix-sidecar/pom.xml
+++ b/spring-cloud-netflix-sidecar/pom.xml
@@ -5,7 +5,7 @@
org.springframework.cloud
spring-cloud-netflix
- 2.2.4.BUILD-SNAPSHOT
+ 2.2.5.BUILD-SNAPSHOT
..
spring-cloud-netflix-sidecar
diff --git a/spring-cloud-netflix-turbine-stream/pom.xml b/spring-cloud-netflix-turbine-stream/pom.xml
index 0409250d0..3d0387a18 100644
--- a/spring-cloud-netflix-turbine-stream/pom.xml
+++ b/spring-cloud-netflix-turbine-stream/pom.xml
@@ -5,7 +5,7 @@
org.springframework.cloud
spring-cloud-netflix
- 2.2.4.BUILD-SNAPSHOT
+ 2.2.5.BUILD-SNAPSHOT
..
spring-cloud-netflix-turbine-stream
diff --git a/spring-cloud-netflix-turbine/pom.xml b/spring-cloud-netflix-turbine/pom.xml
index 675f0e98e..0924ab7f4 100644
--- a/spring-cloud-netflix-turbine/pom.xml
+++ b/spring-cloud-netflix-turbine/pom.xml
@@ -5,7 +5,7 @@
org.springframework.cloud
spring-cloud-netflix
- 2.2.4.BUILD-SNAPSHOT
+ 2.2.5.BUILD-SNAPSHOT
..
spring-cloud-netflix-turbine
diff --git a/spring-cloud-netflix-zuul/pom.xml b/spring-cloud-netflix-zuul/pom.xml
index 545a40cc6..0689e2e6f 100644
--- a/spring-cloud-netflix-zuul/pom.xml
+++ b/spring-cloud-netflix-zuul/pom.xml
@@ -6,7 +6,7 @@
spring-cloud-netflix
org.springframework.cloud
- 2.2.4.BUILD-SNAPSHOT
+ 2.2.5.BUILD-SNAPSHOT
..
diff --git a/spring-cloud-starter-netflix/pom.xml b/spring-cloud-starter-netflix/pom.xml
index a646b47d8..669362e6a 100644
--- a/spring-cloud-starter-netflix/pom.xml
+++ b/spring-cloud-starter-netflix/pom.xml
@@ -4,7 +4,7 @@
org.springframework.cloud
spring-cloud-netflix
- 2.2.4.BUILD-SNAPSHOT
+ 2.2.5.BUILD-SNAPSHOT
..
spring-cloud-starter-netflix
diff --git a/spring-cloud-starter-netflix/spring-cloud-starter-netflix-archaius/pom.xml b/spring-cloud-starter-netflix/spring-cloud-starter-netflix-archaius/pom.xml
index 8c59bfd92..40089bb19 100644
--- a/spring-cloud-starter-netflix/spring-cloud-starter-netflix-archaius/pom.xml
+++ b/spring-cloud-starter-netflix/spring-cloud-starter-netflix-archaius/pom.xml
@@ -4,7 +4,7 @@
org.springframework.cloud
spring-cloud-starter-netflix
- 2.2.4.BUILD-SNAPSHOT
+ 2.2.5.BUILD-SNAPSHOT
spring-cloud-starter-netflix-archaius
Spring Cloud Starter Netflix Archaius
diff --git a/spring-cloud-starter-netflix/spring-cloud-starter-netflix-eureka-client/pom.xml b/spring-cloud-starter-netflix/spring-cloud-starter-netflix-eureka-client/pom.xml
index ae1c5da85..7812ce208 100644
--- a/spring-cloud-starter-netflix/spring-cloud-starter-netflix-eureka-client/pom.xml
+++ b/spring-cloud-starter-netflix/spring-cloud-starter-netflix-eureka-client/pom.xml
@@ -4,7 +4,7 @@
org.springframework.cloud
spring-cloud-starter-netflix
- 2.2.4.BUILD-SNAPSHOT
+ 2.2.5.BUILD-SNAPSHOT
spring-cloud-starter-netflix-eureka-client
Spring Cloud Starter Netflix Eureka Client
diff --git a/spring-cloud-starter-netflix/spring-cloud-starter-netflix-eureka-server/pom.xml b/spring-cloud-starter-netflix/spring-cloud-starter-netflix-eureka-server/pom.xml
index 756b4f6ea..eee911c44 100644
--- a/spring-cloud-starter-netflix/spring-cloud-starter-netflix-eureka-server/pom.xml
+++ b/spring-cloud-starter-netflix/spring-cloud-starter-netflix-eureka-server/pom.xml
@@ -3,7 +3,7 @@
org.springframework.cloud
spring-cloud-starter-netflix
- 2.2.4.BUILD-SNAPSHOT
+ 2.2.5.BUILD-SNAPSHOT
spring-cloud-starter-netflix-eureka-server
Spring Cloud Starter Netflix Eureka Server
diff --git a/spring-cloud-starter-netflix/spring-cloud-starter-netflix-hystrix-dashboard/pom.xml b/spring-cloud-starter-netflix/spring-cloud-starter-netflix-hystrix-dashboard/pom.xml
index e362fb8f3..8c6c481be 100644
--- a/spring-cloud-starter-netflix/spring-cloud-starter-netflix-hystrix-dashboard/pom.xml
+++ b/spring-cloud-starter-netflix/spring-cloud-starter-netflix-hystrix-dashboard/pom.xml
@@ -4,7 +4,7 @@
org.springframework.cloud
spring-cloud-starter-netflix
- 2.2.4.BUILD-SNAPSHOT
+ 2.2.5.BUILD-SNAPSHOT
spring-cloud-starter-netflix-hystrix-dashboard
Spring Cloud Starter Netflix Hystrix Dashboard
diff --git a/spring-cloud-starter-netflix/spring-cloud-starter-netflix-hystrix/pom.xml b/spring-cloud-starter-netflix/spring-cloud-starter-netflix-hystrix/pom.xml
index 3823c7517..7cbdf5b56 100644
--- a/spring-cloud-starter-netflix/spring-cloud-starter-netflix-hystrix/pom.xml
+++ b/spring-cloud-starter-netflix/spring-cloud-starter-netflix-hystrix/pom.xml
@@ -4,7 +4,7 @@
org.springframework.cloud
spring-cloud-starter-netflix
- 2.2.4.BUILD-SNAPSHOT
+ 2.2.5.BUILD-SNAPSHOT
spring-cloud-starter-netflix-hystrix
Spring Cloud Starter Netflix Hystrix
diff --git a/spring-cloud-starter-netflix/spring-cloud-starter-netflix-ribbon/pom.xml b/spring-cloud-starter-netflix/spring-cloud-starter-netflix-ribbon/pom.xml
index d26d13cb0..454c6dea6 100644
--- a/spring-cloud-starter-netflix/spring-cloud-starter-netflix-ribbon/pom.xml
+++ b/spring-cloud-starter-netflix/spring-cloud-starter-netflix-ribbon/pom.xml
@@ -4,7 +4,7 @@
org.springframework.cloud
spring-cloud-starter-netflix
- 2.2.4.BUILD-SNAPSHOT
+ 2.2.5.BUILD-SNAPSHOT
spring-cloud-starter-netflix-ribbon
Spring Cloud Starter Netflix Ribbon
diff --git a/spring-cloud-starter-netflix/spring-cloud-starter-netflix-turbine-stream/pom.xml b/spring-cloud-starter-netflix/spring-cloud-starter-netflix-turbine-stream/pom.xml
index 3bebef9b8..7a932a9da 100644
--- a/spring-cloud-starter-netflix/spring-cloud-starter-netflix-turbine-stream/pom.xml
+++ b/spring-cloud-starter-netflix/spring-cloud-starter-netflix-turbine-stream/pom.xml
@@ -4,7 +4,7 @@
org.springframework.cloud
spring-cloud-starter-netflix
- 2.2.4.BUILD-SNAPSHOT
+ 2.2.5.BUILD-SNAPSHOT
spring-cloud-starter-netflix-turbine-stream
Spring Cloud Starter Netflix Turbine Stream
diff --git a/spring-cloud-starter-netflix/spring-cloud-starter-netflix-turbine/pom.xml b/spring-cloud-starter-netflix/spring-cloud-starter-netflix-turbine/pom.xml
index 27ada3d40..4b8ed4e06 100644
--- a/spring-cloud-starter-netflix/spring-cloud-starter-netflix-turbine/pom.xml
+++ b/spring-cloud-starter-netflix/spring-cloud-starter-netflix-turbine/pom.xml
@@ -4,7 +4,7 @@
org.springframework.cloud
spring-cloud-starter-netflix
- 2.2.4.BUILD-SNAPSHOT
+ 2.2.5.BUILD-SNAPSHOT
spring-cloud-starter-netflix-turbine
Spring Cloud Starter Netflix Turbine
diff --git a/spring-cloud-starter-netflix/spring-cloud-starter-netflix-zuul/pom.xml b/spring-cloud-starter-netflix/spring-cloud-starter-netflix-zuul/pom.xml
index 78cce918a..24eee2308 100644
--- a/spring-cloud-starter-netflix/spring-cloud-starter-netflix-zuul/pom.xml
+++ b/spring-cloud-starter-netflix/spring-cloud-starter-netflix-zuul/pom.xml
@@ -4,7 +4,7 @@
org.springframework.cloud
spring-cloud-starter-netflix
- 2.2.4.BUILD-SNAPSHOT
+ 2.2.5.BUILD-SNAPSHOT
spring-cloud-starter-netflix-zuul
Spring Cloud Starter Netflix Zuul