diff --git a/docs/modules/ROOT/pages/spring-cloud-openfeign.adoc b/docs/modules/ROOT/pages/spring-cloud-openfeign.adoc index e590b6165..a6cec5346 100644 --- a/docs/modules/ROOT/pages/spring-cloud-openfeign.adoc +++ b/docs/modules/ROOT/pages/spring-cloud-openfeign.adoc @@ -140,12 +140,10 @@ If none of them is on the classpath, the default Feign client is used. NOTE: `spring-cloud-starter-openfeign` supports `spring-cloud-starter-loadbalancer`. However, as is an optional dependency, you need to make sure it has been added to your project if you want to use it. -To use OkHttpClient-backed Feign clients and Http2Client Feign clients, make sure that the client you want to use is on the classpath and set `spring.cloud.openfeign.okhttp.enabled` or `spring.cloud.openfeign.http2client.enabled` to `true` respectively. - When it comes to the Apache HttpClient 5-backed Feign clients, it's enough to ensure HttpClient 5 is on the classpath, but you can still disable its use for Feign Clients by setting `spring.cloud.openfeign.httpclient.hc5.enabled` to `false`. You can customize the HTTP client used by providing a bean of either `org.apache.hc.client5.http.impl.classic.CloseableHttpClient` when using Apache HC5. -You can further customise http clients by setting values in the `spring.cloud.openfeign.httpclient.xxx` properties. The ones prefixed just with `httpclient` will work for all the clients, the ones prefixed with `httpclient.hc5` to Apache HttpClient 5, the ones prefixed with `httpclient.okhttp` to OkHttpClient and the ones prefixed with `httpclient.http2` to Http2Client. You can find a full list of properties you can customise in the appendix. +You can further customise http clients by setting values in the `spring.cloud.openfeign.httpclient.xxx` properties. The ones prefixed just with `httpclient` will work for all the clients, the ones prefixed with `httpclient.hc5` to Apache HttpClient 5, and the ones prefixed with `httpclient.http2` to Http2Client. You can find a full list of properties you can customise in the appendix. If you can not configure Apache HttpClient 5 by using properties, there is an `HttpClient5FeignConfiguration.HttpClientBuilderCustomizer` interface for programmatic configuration. TIP: Apache HTTP Components `5.4` have changed defaults in the HttpClient relating to HTTP/1.1 TLS upgrades. Most proxy servers handle upgrades without issue, however, you may encounter issues with Envoy or Istio. If you need to restore previous behaviour, you can use `HttpClient5FeignConfiguration.HttpClientBuilderCustomizer` to do it, as shown in the example below. @@ -613,8 +611,6 @@ These properties allow you to be selective about the compressed media types and When the request matches the mime type set in `spring.cloud.openfeign.compression.request.mime-types` and the size set in `spring.cloud.openfeign.compression.request.min-request-size`, `spring.cloud.openfeign.compression.request.enabled=true` results in compression headers being added to the request. The functionality of the headers is to signal to the server that a compressed body is expected by the client. It is the responsibility of the server-side app to provide the compressed body based on the headers provided by the client. -TIP: Since the OkHttpClient uses "transparent" compression, that is disabled if the `content-encoding` or `accept-encoding` header is present, we do not enable compression when `feign.okhttp.OkHttpClient` is present on the classpath and `spring.cloud.openfeign.okhttp.enabled` is set to `true`. - [[feign-logging]] === Feign logging diff --git a/docs/modules/ROOT/partials/_configprops.adoc b/docs/modules/ROOT/partials/_configprops.adoc index 4db584c45..73a2c705e 100644 --- a/docs/modules/ROOT/partials/_configprops.adoc +++ b/docs/modules/ROOT/partials/_configprops.adoc @@ -96,14 +96,12 @@ |spring.cloud.openfeign.httpclient.max-connections | `+++200+++` | |spring.cloud.openfeign.httpclient.max-connections-per-route | `+++50+++` | |spring.cloud.openfeign.httpclient.ok-http.protocols | | Configure the protocols used by this client to communicate with remote servers. Uses {@link String} values of {@link Protocol}. -|spring.cloud.openfeign.httpclient.ok-http.read-timeout | `+++60s+++` | {@link OkHttpClient} read timeout; defaults to 60 seconds. -|spring.cloud.openfeign.httpclient.time-to-live | `+++900+++` | +|spring.cloud.openfeign.httpclient.time-to-live | `+++900+++` | |spring.cloud.openfeign.httpclient.time-to-live-unit | `+++seconds+++` | |spring.cloud.openfeign.lazy-attributes-resolution | `+++false+++` | Switches @FeignClient attributes resolution mode to lazy. |spring.cloud.openfeign.micrometer.enabled | `+++true+++` | Enables Micrometer capabilities for Feign. |spring.cloud.openfeign.oauth2.clientRegistrationId | | Provides a clientId to be used with OAuth2. |spring.cloud.openfeign.oauth2.enabled | `+++false+++` | Enables feign interceptor for managing oauth2 access token. -|spring.cloud.openfeign.okhttp.enabled | `+++false+++` | Enables the use of the OK HTTP Client by Feign. |spring.cloud.refresh.additional-property-sources-to-retain | | Additional property sources to retain during a refresh. Typically only system property sources are retained. This property allows property sources, such as property sources created by EnvironmentPostProcessors to be retained as well. |spring.cloud.refresh.enabled | `+++true+++` | Enables autoconfiguration for the refresh scope and associated features. |spring.cloud.refresh.extra-refreshable | `+++true+++` | Additional bean names or class names for beans to post process into refresh scope. @@ -114,4 +112,4 @@ |spring.cloud.service-registry.auto-registration.register-management | `+++true+++` | Whether to register the management as a service. Defaults to true. |spring.cloud.util.enabled | `+++true+++` | Enables creation of Spring Cloud utility beans. -|=== \ No newline at end of file +|=== diff --git a/spring-cloud-openfeign-core/pom.xml b/spring-cloud-openfeign-core/pom.xml index 267fef29d..54cc01571 100644 --- a/spring-cloud-openfeign-core/pom.xml +++ b/spring-cloud-openfeign-core/pom.xml @@ -134,21 +134,11 @@ feign-hc5 true - - io.github.openfeign - feign-okhttp - true - io.github.openfeign feign-java11 true - - com.squareup.okhttp3 - okhttp - true - org.springframework.boot spring-boot-autoconfigure-processor diff --git a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignAutoConfiguration.java b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignAutoConfiguration.java index 0472938a9..ecfbef1de 100644 --- a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignAutoConfiguration.java +++ b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignAutoConfiguration.java @@ -18,22 +18,9 @@ import java.lang.reflect.Method; import java.net.http.HttpClient; -import java.security.KeyManagementException; -import java.security.NoSuchAlgorithmException; -import java.security.cert.X509Certificate; -import java.time.Duration; import java.util.ArrayList; import java.util.List; import java.util.Set; -import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; - -import javax.net.ssl.HostnameVerifier; -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLSession; -import javax.net.ssl.SSLSocketFactory; -import javax.net.ssl.TrustManager; -import javax.net.ssl.X509TrustManager; import feign.Capability; import feign.Client; @@ -42,10 +29,6 @@ import feign.Target; import feign.hc5.ApacheHttp5Client; import feign.http2client.Http2Client; -import feign.okhttp.OkHttpClient; -import jakarta.annotation.PreDestroy; -import okhttp3.ConnectionPool; -import okhttp3.Protocol; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -231,121 +214,6 @@ public String resolveCircuitBreakerName(String feignClientName, Target target } - // the following configuration is for alternate feign clients if - // SC loadbalancer is not on the class path. - // see corresponding configurations in FeignLoadBalancerAutoConfiguration - // for load-balanced clients. - @Configuration(proxyBeanMethods = false) - @ConditionalOnClass(OkHttpClient.class) - @ConditionalOnMissingBean(okhttp3.OkHttpClient.class) - @ConditionalOnProperty("spring.cloud.openfeign.okhttp.enabled") - protected static class OkHttpFeignConfiguration { - - private okhttp3.OkHttpClient okHttpClient; - - @Bean - @ConditionalOnMissingBean - public okhttp3.OkHttpClient.Builder okHttpClientBuilder() { - return new okhttp3.OkHttpClient.Builder(); - } - - @Bean - @ConditionalOnMissingBean(ConnectionPool.class) - public ConnectionPool httpClientConnectionPool(FeignHttpClientProperties httpClientProperties) { - int maxTotalConnections = httpClientProperties.getMaxConnections(); - long timeToLive = httpClientProperties.getTimeToLive(); - TimeUnit ttlUnit = httpClientProperties.getTimeToLiveUnit(); - return new ConnectionPool(maxTotalConnections, timeToLive, ttlUnit); - } - - @Bean - public okhttp3.OkHttpClient okHttpClient(okhttp3.OkHttpClient.Builder builder, ConnectionPool connectionPool, - FeignHttpClientProperties httpClientProperties) { - boolean followRedirects = httpClientProperties.isFollowRedirects(); - int connectTimeout = httpClientProperties.getConnectionTimeout(); - boolean disableSslValidation = httpClientProperties.isDisableSslValidation(); - Duration readTimeout = httpClientProperties.getOkHttp().getReadTimeout(); - List protocols = httpClientProperties.getOkHttp() - .getProtocols() - .stream() - .map(Protocol::valueOf) - .collect(Collectors.toList()); - if (disableSslValidation) { - disableSsl(builder); - } - this.okHttpClient = builder.connectTimeout(connectTimeout, TimeUnit.MILLISECONDS) - .followRedirects(followRedirects) - .readTimeout(readTimeout) - .connectionPool(connectionPool) - .protocols(protocols) - .build(); - return this.okHttpClient; - } - - private void disableSsl(okhttp3.OkHttpClient.Builder builder) { - try { - X509TrustManager disabledTrustManager = new DisableValidationTrustManager(); - TrustManager[] trustManagers = new TrustManager[1]; - trustManagers[0] = disabledTrustManager; - SSLContext sslContext = SSLContext.getInstance("SSL"); - sslContext.init(null, trustManagers, new java.security.SecureRandom()); - SSLSocketFactory disabledSSLSocketFactory = sslContext.getSocketFactory(); - builder.sslSocketFactory(disabledSSLSocketFactory, disabledTrustManager); - builder.hostnameVerifier(new TrustAllHostnames()); - } - catch (NoSuchAlgorithmException | KeyManagementException e) { - LOG.warn("Error setting SSLSocketFactory in OKHttpClient", e); - } - } - - @PreDestroy - public void destroy() { - if (this.okHttpClient != null) { - this.okHttpClient.dispatcher().executorService().shutdown(); - this.okHttpClient.connectionPool().evictAll(); - } - } - - @Bean - @ConditionalOnMissingBean(Client.class) - public Client feignClient(okhttp3.OkHttpClient client) { - return new OkHttpClient(client); - } - - /** - * A {@link X509TrustManager} that does not validate SSL certificates. - */ - class DisableValidationTrustManager implements X509TrustManager { - - @Override - public void checkClientTrusted(X509Certificate[] x509Certificates, String s) { - } - - @Override - public void checkServerTrusted(X509Certificate[] x509Certificates, String s) { - } - - @Override - public X509Certificate[] getAcceptedIssuers() { - return new X509Certificate[0]; - } - - } - - /** - * A {@link HostnameVerifier} that does not validate any hostnames. - */ - class TrustAllHostnames implements HostnameVerifier { - - @Override - public boolean verify(String s, SSLSession sslSession) { - return true; - } - - } - - } - // the following configuration is for alternate feign clients if // SC loadbalancer is not on the class path. // see corresponding configurations in FeignLoadBalancerAutoConfiguration diff --git a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/encoding/FeignAcceptGzipEncodingAutoConfiguration.java b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/encoding/FeignAcceptGzipEncodingAutoConfiguration.java index 6dd2d9862..d42b4902d 100644 --- a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/encoding/FeignAcceptGzipEncodingAutoConfiguration.java +++ b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/encoding/FeignAcceptGzipEncodingAutoConfiguration.java @@ -26,7 +26,6 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.cloud.openfeign.FeignAutoConfiguration; import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; /** @@ -41,9 +40,6 @@ @ConditionalOnClass(Feign.class) @ConditionalOnBean(Client.class) @ConditionalOnProperty("spring.cloud.openfeign.compression.response.enabled") -// The OK HTTP client uses "transparent" compression. -// If the accept-encoding header is present, it disables transparent compression. -@Conditional(OkHttpFeignClientBeanMissingCondition.class) @AutoConfigureAfter(FeignAutoConfiguration.class) public class FeignAcceptGzipEncodingAutoConfiguration { diff --git a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/encoding/FeignContentGzipEncodingAutoConfiguration.java b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/encoding/FeignContentGzipEncodingAutoConfiguration.java index 060cfc005..9b7f16f8a 100644 --- a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/encoding/FeignContentGzipEncodingAutoConfiguration.java +++ b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/encoding/FeignContentGzipEncodingAutoConfiguration.java @@ -24,7 +24,6 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.cloud.openfeign.FeignAutoConfiguration; import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; /** @@ -37,9 +36,6 @@ @Configuration(proxyBeanMethods = false) @EnableConfigurationProperties(FeignClientEncodingProperties.class) @ConditionalOnClass(Feign.class) -// The OK HTTP client uses "transparent" compression. -// If the content-encoding header is present, it disables transparent compression. -@Conditional(OkHttpFeignClientBeanMissingCondition.class) @ConditionalOnProperty("spring.cloud.openfeign.compression.request.enabled") @AutoConfigureAfter(FeignAutoConfiguration.class) public class FeignContentGzipEncodingAutoConfiguration { diff --git a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/encoding/OkHttpFeignClientBeanMissingCondition.java b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/encoding/OkHttpFeignClientBeanMissingCondition.java deleted file mode 100644 index e510b4689..000000000 --- a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/encoding/OkHttpFeignClientBeanMissingCondition.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright 2013-present 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.openfeign.encoding; - -import feign.Client; -import feign.okhttp.OkHttpClient; - -import org.springframework.boot.autoconfigure.condition.AnyNestedCondition; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.context.annotation.Condition; - -/** - * A {@link Condition} that verifies whether the conditions for creating Feign - * {@link Client} beans that either are of type {@link OkHttpClient} or have a delegate of - * type {@link OkHttpClient} are not met. - * - * @author Olga Maciaszek-Sharma - * @since 4.0.2 - */ -public class OkHttpFeignClientBeanMissingCondition extends AnyNestedCondition { - - public OkHttpFeignClientBeanMissingCondition() { - super(ConfigurationPhase.REGISTER_BEAN); - } - - @ConditionalOnMissingClass("feign.okhttp.OkHttpClient") - static class FeignOkHttpClientPresent { - - } - - @ConditionalOnProperty(value = "spring.cloud.openfeign.okhttp.enabled", havingValue = "false") - static class FeignOkHttpClientEnabled { - - } - -} diff --git a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/loadbalancer/FeignLoadBalancerAutoConfiguration.java b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/loadbalancer/FeignLoadBalancerAutoConfiguration.java index 7e0c52357..e91d8686e 100644 --- a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/loadbalancer/FeignLoadBalancerAutoConfiguration.java +++ b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/loadbalancer/FeignLoadBalancerAutoConfiguration.java @@ -53,8 +53,8 @@ // Order is important here, last should be the default, first should be optional // see // https://github.com/spring-cloud/spring-cloud-netflix/issues/2086#issuecomment-316281653 -@Import({ OkHttpFeignLoadBalancerConfiguration.class, HttpClient5FeignLoadBalancerConfiguration.class, - Http2ClientFeignLoadBalancerConfiguration.class, DefaultFeignLoadBalancerConfiguration.class }) +@Import({ HttpClient5FeignLoadBalancerConfiguration.class, Http2ClientFeignLoadBalancerConfiguration.class, + DefaultFeignLoadBalancerConfiguration.class }) public class FeignLoadBalancerAutoConfiguration { @Bean diff --git a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/loadbalancer/OkHttpFeignLoadBalancerConfiguration.java b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/loadbalancer/OkHttpFeignLoadBalancerConfiguration.java deleted file mode 100644 index 87615a10b..000000000 --- a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/loadbalancer/OkHttpFeignLoadBalancerConfiguration.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright 2013-present 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.openfeign.loadbalancer; - -import java.util.List; - -import feign.Client; -import feign.okhttp.OkHttpClient; - -import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; -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.context.properties.EnableConfigurationProperties; -import org.springframework.cloud.client.loadbalancer.LoadBalancedRetryFactory; -import org.springframework.cloud.client.loadbalancer.LoadBalancerClient; -import org.springframework.cloud.client.loadbalancer.LoadBalancerClientsProperties; -import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Conditional; -import org.springframework.context.annotation.Configuration; - -/** - * Configuration instantiating a {@link LoadBalancerClient}-based {@link Client} object - * that uses {@link OkHttpClient} under the hood. - * - * @author Olga Maciaszek-Sharma - * @author changjin wei(魏昌进) - * @since 2.2.0 - */ -@Configuration(proxyBeanMethods = false) -@ConditionalOnClass(OkHttpClient.class) -@ConditionalOnProperty("spring.cloud.openfeign.okhttp.enabled") -@ConditionalOnBean({ LoadBalancerClient.class, LoadBalancerClientFactory.class }) -@EnableConfigurationProperties(LoadBalancerClientsProperties.class) -class OkHttpFeignLoadBalancerConfiguration { - - @Bean - @ConditionalOnMissingBean - @Conditional(OnRetryNotEnabledCondition.class) - public Client feignClient(okhttp3.OkHttpClient okHttpClient, LoadBalancerClient loadBalancerClient, - LoadBalancerClientFactory loadBalancerClientFactory, - List transformers) { - OkHttpClient delegate = new OkHttpClient(okHttpClient); - return new FeignBlockingLoadBalancerClient(delegate, loadBalancerClient, loadBalancerClientFactory, - transformers); - } - - @Bean - @ConditionalOnMissingBean - @ConditionalOnClass(name = "org.springframework.retry.support.RetryTemplate") - @ConditionalOnBean(LoadBalancedRetryFactory.class) - @ConditionalOnProperty(value = "spring.cloud.loadbalancer.retry.enabled", havingValue = "true", - matchIfMissing = true) - public Client feignRetryClient(LoadBalancerClient loadBalancerClient, okhttp3.OkHttpClient okHttpClient, - LoadBalancedRetryFactory loadBalancedRetryFactory, LoadBalancerClientFactory loadBalancerClientFactory, - List transformers) { - OkHttpClient delegate = new OkHttpClient(okHttpClient); - return new RetryableFeignBlockingLoadBalancerClient(delegate, loadBalancerClient, loadBalancedRetryFactory, - loadBalancerClientFactory, transformers); - } - -} diff --git a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/support/FeignHttpClientProperties.java b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/support/FeignHttpClientProperties.java index bcdeefda1..049a8cae8 100644 --- a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/support/FeignHttpClientProperties.java +++ b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/support/FeignHttpClientProperties.java @@ -17,13 +17,9 @@ package org.springframework.cloud.openfeign.support; import java.net.http.HttpClient; -import java.time.Duration; -import java.util.List; import java.util.concurrent.TimeUnit; import feign.http2client.Http2Client; -import feign.okhttp.OkHttpClient; -import okhttp3.Protocol; import org.springframework.boot.context.properties.ConfigurationProperties; @@ -97,11 +93,6 @@ public class FeignHttpClientProperties { */ private Hc5Properties hc5 = new Hc5Properties(); - /** - * Additional {@link OkHttpClient}-specific properties. - */ - private OkHttp okHttp = new OkHttp(); - /** * Additional {@link Http2Client}-specific properties. */ @@ -179,14 +170,6 @@ public void setHc5(Hc5Properties hc5) { this.hc5 = hc5; } - public OkHttp getOkHttp() { - return okHttp; - } - - public void setOkHttp(OkHttp okHttp) { - this.okHttp = okHttp; - } - public Http2Properties getHttp2() { return http2; } @@ -343,40 +326,6 @@ public enum PoolReusePolicy { } - /** - * {@link OkHttpClient}-specific properties. - */ - public static class OkHttp { - - /** - * {@link OkHttpClient} read timeout; defaults to 60 seconds. - */ - private Duration readTimeout = Duration.ofSeconds(60); - - /** - * Configure the protocols used by this client to communicate with remote servers. - * Uses {@link String} values of {@link Protocol}. - */ - private List protocols = List.of("HTTP_2", "HTTP_1_1"); - - public Duration getReadTimeout() { - return readTimeout; - } - - public void setReadTimeout(Duration readTimeout) { - this.readTimeout = readTimeout; - } - - public List getProtocols() { - return protocols; - } - - public void setProtocols(List protocols) { - this.protocols = protocols; - } - - } - /** * {@link Http2Client}-specific properties. */ diff --git a/spring-cloud-openfeign-core/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/spring-cloud-openfeign-core/src/main/resources/META-INF/additional-spring-configuration-metadata.json index fc7ddc437..5a91110db 100644 --- a/spring-cloud-openfeign-core/src/main/resources/META-INF/additional-spring-configuration-metadata.json +++ b/spring-cloud-openfeign-core/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -32,12 +32,6 @@ "description": "Enables the use of the Apache HTTP Client 5 by Feign.", "defaultValue": "true" }, - { - "name": "spring.cloud.openfeign.okhttp.enabled", - "type": "java.lang.Boolean", - "description": "Enables the use of the OK HTTP Client by Feign.", - "defaultValue": "false" - }, { "name": "spring.cloud.openfeign.http2client.enabled", "type": "java.lang.Boolean", diff --git a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignHttpClientUrlTests.java b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignHttpClientUrlTests.java index a5a0ed086..9da357245 100644 --- a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignHttpClientUrlTests.java +++ b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignHttpClientUrlTests.java @@ -49,7 +49,7 @@ */ @SpringBootTest(classes = FeignHttpClientUrlTests.TestConfig.class, webEnvironment = DEFINED_PORT, value = { "spring.application.name=feignclienturltest", "spring.cloud.openfeign.circuitbreaker.enabled=false", - "spring.cloud.openfeign.okhttp.enabled=false", "spring.cloud.loadbalancer.retry.enabled=false" }) + "spring.cloud.loadbalancer.retry.enabled=false" }) @DirtiesContext class FeignHttpClientUrlTests { diff --git a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignHttpClientUrlWithRetryableLoadBalancerTests.java b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignHttpClientUrlWithRetryableLoadBalancerTests.java index e98cf0bd9..17a9ca8df 100644 --- a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignHttpClientUrlWithRetryableLoadBalancerTests.java +++ b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignHttpClientUrlWithRetryableLoadBalancerTests.java @@ -49,8 +49,7 @@ */ @SpringBootTest(classes = FeignHttpClientUrlWithRetryableLoadBalancerTests.TestConfig.class, webEnvironment = DEFINED_PORT, - value = { "spring.application.name=feignclienturlwithretryableloadbalancertest", - "spring.cloud.openfeign.hystrix.enabled=false", "spring.cloud.openfeign.okhttp.enabled=false" }) + value = { "spring.application.name=feignclienturlwithretryableloadbalancertest" }) @DirtiesContext class FeignHttpClientUrlWithRetryableLoadBalancerTests { diff --git a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignOkHttpConfigurationTests.java b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignOkHttpConfigurationTests.java deleted file mode 100644 index 970f8ef87..000000000 --- a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignOkHttpConfigurationTests.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright 2013-present 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.openfeign; - -import java.lang.reflect.Field; - -import javax.net.ssl.HostnameVerifier; - -import okhttp3.OkHttpClient; -import okhttp3.Protocol; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import org.springframework.boot.WebApplicationType; -import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.context.ConfigurableApplicationContext; -import org.springframework.util.ReflectionUtils; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * @author Ryan Baxter - * @author changjin wei(魏昌进) - */ -class FeignOkHttpConfigurationTests { - - private ConfigurableApplicationContext context; - - @BeforeEach - void setUp() { - this.context = new SpringApplicationBuilder() - .properties("debug=true", "spring.cloud.openfeign.httpclient.disableSslValidation=true", - "spring.cloud.openfeign.okhttp.enabled=true", "spring.cloud.openfeign.httpclient.hc5.enabled=false", - "spring.cloud.openfeign.httpclient.okhttp.read-timeout=9s", - "spring.cloud.openfeign.httpclient.okhttp.protocols=H2_PRIOR_KNOWLEDGE") - .web(WebApplicationType.NONE) - .sources(FeignAutoConfiguration.class) - .run(); - } - - @AfterEach - void tearDown() { - if (context != null) { - context.close(); - } - } - - @Test - void disableSslTest() { - OkHttpClient httpClient = context.getBean(OkHttpClient.class); - HostnameVerifier hostnameVerifier = (HostnameVerifier) this.getField(httpClient, "hostnameVerifier"); - assertThat(hostnameVerifier instanceof FeignAutoConfiguration.OkHttpFeignConfiguration.TrustAllHostnames) - .isTrue(); - } - - @Test - void shouldConfigureReadTimeout() { - OkHttpClient httpClient = context.getBean(OkHttpClient.class); - - assertThat(httpClient.readTimeoutMillis()).isEqualTo(9000); - } - - @Test - void shouldResolveProtocolFromProperties() { - OkHttpClient httpClient = context.getBean(OkHttpClient.class); - - assertThat(httpClient.protocols()).containsExactly(Protocol.H2_PRIOR_KNOWLEDGE); - } - - protected Object getField(Object target, String name) { - Field field = ReflectionUtils.findField(target.getClass(), name); - ReflectionUtils.makeAccessible(field); - return ReflectionUtils.getField(field, target); - } - -} diff --git a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/beans/BeansFeignClientTests.java b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/beans/BeansFeignClientTests.java index 569bd9041..84c00de12 100644 --- a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/beans/BeansFeignClientTests.java +++ b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/beans/BeansFeignClientTests.java @@ -51,8 +51,7 @@ * @author Aaron Whiteside */ @SpringBootTest(classes = BeansFeignClientTests.Application.class, webEnvironment = WebEnvironment.RANDOM_PORT, - value = { "spring.application.name=feignclienttest", "spring.cloud.openfeign.httpclient.hc5.enabled=false", - "spring.cloud.openfeign.okhttp.enabled=false" }) + value = { "spring.application.name=feignclienttest", "spring.cloud.openfeign.httpclient.hc5.enabled=false" }) @DirtiesContext public class BeansFeignClientTests { diff --git a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/encoding/FeignCompressionTests.java b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/encoding/FeignCompressionTests.java index 3956dd5a4..7cafe37fd 100644 --- a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/encoding/FeignCompressionTests.java +++ b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/encoding/FeignCompressionTests.java @@ -19,15 +19,12 @@ import java.util.Map; import feign.RequestInterceptor; -import okhttp3.OkHttpClient; import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.cloud.openfeign.FeignAutoConfiguration; import org.springframework.cloud.openfeign.FeignClientFactory; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; import static org.assertj.core.api.Assertions.assertThat; @@ -42,8 +39,7 @@ class FeignCompressionTests { void shouldAddCompressionInterceptors() { new ApplicationContextRunner() .withPropertyValues("spring.cloud.openfeign.compression.response.enabled=true", - "spring.cloud.openfeign.compression.request.enabled=true", - "spring.cloud.openfeign.okhttp.enabled=false") + "spring.cloud.openfeign.compression.request.enabled=true") .withConfiguration(AutoConfigurations.of(FeignAutoConfiguration.class, FeignContentGzipEncodingAutoConfiguration.class, FeignAcceptGzipEncodingAutoConfiguration.class)) .run(context -> { @@ -58,30 +54,4 @@ void shouldAddCompressionInterceptors() { }); } - @Test - void shouldNotAddInterceptorsIfFeignOkHttpClientPresent() { - new ApplicationContextRunner() - .withPropertyValues("spring.cloud.openfeign.compression.response.enabled=true", - "spring.cloud.openfeign.compression.request.enabled=true", - "spring.cloud.openfeign.okhttp.enabled=true", "spring.cloud.openfeign.httpclient.hc5.enabled") - .withConfiguration(AutoConfigurations.of(FeignAutoConfiguration.class, - FeignContentGzipEncodingAutoConfiguration.class, FeignAcceptGzipEncodingAutoConfiguration.class)) - .run(context -> { - FeignClientFactory feignClientFactory = context.getBean(FeignClientFactory.class); - Map interceptors = feignClientFactory.getInstances("foo", - RequestInterceptor.class); - assertThat(interceptors).isEmpty(); - }); - } - - @Configuration - static class OkHttpClientConfiguration { - - @Bean - OkHttpClient okHttpClient() { - return new OkHttpClient(); - } - - } - } diff --git a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/loadbalancer/FeignLoadBalancerAutoConfigurationTests.java b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/loadbalancer/FeignLoadBalancerAutoConfigurationTests.java index 16922f04f..ba643019c 100644 --- a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/loadbalancer/FeignLoadBalancerAutoConfigurationTests.java +++ b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/loadbalancer/FeignLoadBalancerAutoConfigurationTests.java @@ -22,7 +22,6 @@ import feign.Client; import feign.hc5.ApacheHttp5Client; import feign.http2client.Http2Client; -import feign.okhttp.OkHttpClient; import org.junit.jupiter.api.Test; import org.springframework.boot.WebApplicationType; @@ -51,23 +50,6 @@ void shouldInstantiateDefaultFeignBlockingLoadBalancerClientWhenHttpClientDisabl assertLoadBalanced(context, Client.Default.class); } - @Test - void shouldInstantiateOkHttpFeignClientWhenEnabled() { - ConfigurableApplicationContext context = initContext("spring.cloud.openfeign.httpclient.hc5.enabled=false", - "spring.cloud.openfeign.okhttp.enabled=true", "spring.cloud.loadbalancer.retry.enabled=false", - "spring.cloud.openfeign.httpclient.okhttp.read-timeout=9s"); - assertThatOneBeanPresent(context, BlockingLoadBalancerClient.class); - Map beans = context - .getBeansOfType(FeignBlockingLoadBalancerClient.class); - assertThat(beans).as("Missing bean of type %s", OkHttpClient.class).hasSize(1); - Client client = beans.get("feignClient").getDelegate(); - assertThat(client).isInstanceOf(OkHttpClient.class); - OkHttpClient okHttpClient = (OkHttpClient) client; - okhttp3.OkHttpClient httpClient = (okhttp3.OkHttpClient) getField(okHttpClient, "delegate"); - assertThat(httpClient.readTimeoutMillis()).isEqualTo(9000); - - } - @Test void shouldInstantiateHttp2ClientFeignClientWhenEnabled() { ConfigurableApplicationContext context = initContext("spring.cloud.openfeign.httpclient.hc5.enabled=false", @@ -85,8 +67,7 @@ void shouldInstantiateHttp2ClientFeignClientWhenEnabled() { @Test void shouldInstantiateHttpFeignClient5WhenAvailableAndOkHttpDisabled() { - ConfigurableApplicationContext context = initContext("spring.cloud.openfeign.okhttp.enabled=false", - "spring.cloud.loadbalancer.retry.enabled=false"); + ConfigurableApplicationContext context = initContext("spring.cloud.loadbalancer.retry.enabled=false"); assertThatOneBeanPresent(context, BlockingLoadBalancerClient.class); assertLoadBalanced(context, ApacheHttp5Client.class); } @@ -106,14 +87,6 @@ void shouldInstantiateRetryableDefaultFeignBlockingLoadBalancerClientWhenHttpCli assertLoadBalancedWithRetries(context, Client.Default.class); } - @Test - void shouldInstantiateRetryableOkHttpFeignClientWhenEnabled() { - ConfigurableApplicationContext context = initContext("spring.cloud.openfeign.httpclient.hc5.enabled=false", - "spring.cloud.openfeign.okhttp.enabled=true"); - assertThatOneBeanPresent(context, BlockingLoadBalancerClient.class); - assertLoadBalancedWithRetries(context, OkHttpClient.class); - } - @Test void shouldInstantiateRetryableHttp2ClientFeignClientWhenEnabled() { ConfigurableApplicationContext context = initContext("spring.cloud.openfeign.httpclient.hc5.enabled=false", diff --git a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/protocol/FeignOkHttpProtocolsTests.java b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/protocol/FeignOkHttpProtocolsTests.java deleted file mode 100644 index 748ecee55..000000000 --- a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/protocol/FeignOkHttpProtocolsTests.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright 2013-present 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.openfeign.protocol; - -import java.lang.reflect.Field; - -import feign.Client; -import okhttp3.Protocol; -import org.junit.jupiter.api.Test; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; -import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClients; -import org.springframework.cloud.openfeign.loadbalancer.FeignBlockingLoadBalancerClient; -import org.springframework.cloud.openfeign.test.NoSecurityConfiguration; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Import; -import org.springframework.test.annotation.DirtiesContext; -import org.springframework.util.ReflectionUtils; -import org.springframework.web.bind.annotation.RestController; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * @author changjin wei(魏昌进) - */ -@SpringBootTest(classes = FeignOkHttpProtocolsTests.Application.class, webEnvironment = WebEnvironment.RANDOM_PORT, - value = { "spring.application.name=feignclienttest", "spring.cloud.openfeign.circuitbreaker.enabled=false", - "spring.cloud.openfeign.httpclient.hc5.enabled=false", "spring.cloud.openfeign.okhttp.enabled=true", - "spring.cloud.httpclientfactories.ok.enabled=true", "spring.cloud.loadbalancer.retry.enabled=false", - "server.http2.enabled=true", "spring.cloud.openfeign.httpclient.okhttp.protocols=H2_PRIOR_KNOWLEDGE" }) -@DirtiesContext -class FeignOkHttpProtocolsTests { - - @Autowired - private Client feignClient; - - @Test - void shouldCreateCorrectFeignClientBeanWithProtocolFromProperties() { - assertThat(feignClient).isInstanceOf(FeignBlockingLoadBalancerClient.class); - FeignBlockingLoadBalancerClient client = (FeignBlockingLoadBalancerClient) feignClient; - Client delegate = client.getDelegate(); - assertThat(delegate).isInstanceOf(feign.okhttp.OkHttpClient.class); - okhttp3.OkHttpClient OkHttpClient = (okhttp3.OkHttpClient) getField(delegate, "delegate"); - assertThat(OkHttpClient.protocols()).containsExactly(Protocol.H2_PRIOR_KNOWLEDGE); - } - - protected Object getField(Object target, String name) { - Field field = ReflectionUtils.findField(target.getClass(), name); - ReflectionUtils.makeAccessible(field); - return ReflectionUtils.getField(field, target); - } - - @Configuration(proxyBeanMethods = false) - @EnableAutoConfiguration - @RestController - @LoadBalancerClients - @Import(NoSecurityConfiguration.class) - protected static class Application { - - } - -} diff --git a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/test/OkHttpClientConfigurationTests.java b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/test/OkHttpClientConfigurationTests.java deleted file mode 100644 index 51cad347c..000000000 --- a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/test/OkHttpClientConfigurationTests.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright 2013-present 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.openfeign.test; - -import feign.Client; -import okhttp3.OkHttpClient; -import org.junit.jupiter.api.Test; -import org.mockito.MockingDetails; - -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.cloud.openfeign.FeignClient; -import org.springframework.cloud.openfeign.loadbalancer.FeignBlockingLoadBalancerClient; -import org.springframework.context.annotation.Bean; -import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.util.ReflectionTestUtils; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.mockingDetails; - -/** - * @author Ryan Baxter - * @author Olga Maciaszek-Sharma - */ -@SpringBootTest(properties = { "spring.cloud.openfeign.okhttp.enabled: true", - "spring.cloud.httpclientfactories.ok.enabled: true", "spring.cloud.openfeign.okhttp.enabled: true", - "spring.cloud.openfeign.httpclient.hc5.enabled: false", "spring.cloud.loadbalancer.retry.enabled=false" }) -@DirtiesContext -class OkHttpClientConfigurationTests { - - @Autowired - FeignBlockingLoadBalancerClient feignClient; - - @Test - void testHttpClientWithFeign() { - Client delegate = feignClient.getDelegate(); - assertThat(delegate instanceof feign.okhttp.OkHttpClient).isTrue(); - feign.okhttp.OkHttpClient okHttpClient = (feign.okhttp.OkHttpClient) delegate; - OkHttpClient httpClient = getField(okHttpClient, "delegate"); - MockingDetails httpClientDetails = mockingDetails(httpClient); - assertThat(httpClientDetails.isMock()).isTrue(); - } - - @SuppressWarnings("unchecked") - protected T getField(Object target, String name) { - Object value = ReflectionTestUtils.getField(target, target.getClass(), name); - return (T) value; - } - - @FeignClient(name = "foo") - interface FooClient { - - } - - @SpringBootConfiguration - @EnableAutoConfiguration - static class TestConfig { - - @Bean - public OkHttpClient client() { - return mock(OkHttpClient.class); - } - - } - -} diff --git a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/valid/FeignClientNotPrimaryTests.java b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/valid/FeignClientNotPrimaryTests.java index 2f3c6b417..905252efc 100644 --- a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/valid/FeignClientNotPrimaryTests.java +++ b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/valid/FeignClientNotPrimaryTests.java @@ -47,7 +47,7 @@ */ @SpringBootTest(classes = FeignClientNotPrimaryTests.Application.class, webEnvironment = RANDOM_PORT, value = { "spring.application.name=feignclientnotprimarytest", - "spring.cloud.openfeign.httpclient.hc5.enabled=false", "spring.cloud.openfeign.okhttp.enabled=false" }) + "spring.cloud.openfeign.httpclient.hc5.enabled=false" }) @DirtiesContext class FeignClientNotPrimaryTests { diff --git a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/valid/FeignHttpClientTests.java b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/valid/FeignHttpClientTests.java index 812fe7bc6..42eacc3aa 100644 --- a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/valid/FeignHttpClientTests.java +++ b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/valid/FeignHttpClientTests.java @@ -57,7 +57,7 @@ */ @SpringBootTest(classes = FeignHttpClientTests.Application.class, webEnvironment = WebEnvironment.RANDOM_PORT, value = { "spring.application.name=feignclienttest", "spring.cloud.openfeign.circuitbreaker.enabled=false", - "spring.cloud.openfeign.okhttp.enabled=false", "spring.cloud.loadbalancer.retry.enabled=false" }) + "spring.cloud.loadbalancer.retry.enabled=false" }) @DirtiesContext class FeignHttpClientTests { diff --git a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/valid/FeignOkHttpTests.java b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/valid/FeignOkHttpTests.java deleted file mode 100644 index 83ace096f..000000000 --- a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/valid/FeignOkHttpTests.java +++ /dev/null @@ -1,256 +0,0 @@ -/* - * Copyright 2013-present 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.openfeign.valid; - -import java.util.Objects; - -import feign.Client; -import org.junit.jupiter.api.Test; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; -import org.springframework.boot.web.server.test.LocalServerPort; -import org.springframework.cloud.client.DefaultServiceInstance; -import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClient; -import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClients; -import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier; -import org.springframework.cloud.loadbalancer.support.ServiceInstanceListSuppliers; -import org.springframework.cloud.openfeign.EnableFeignClients; -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.cloud.openfeign.loadbalancer.FeignBlockingLoadBalancerClient; -import org.springframework.cloud.openfeign.test.NoSecurityConfiguration; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Import; -import org.springframework.http.ResponseEntity; -import org.springframework.test.annotation.DirtiesContext; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PatchMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestHeader; -import org.springframework.web.bind.annotation.RestController; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * @author Spencer Gibb - * @author Olga Maciaszek-Sharma - */ -@SpringBootTest(classes = FeignOkHttpTests.Application.class, webEnvironment = WebEnvironment.RANDOM_PORT, - value = { "spring.application.name=feignclienttest", "spring.cloud.openfeign.circuitbreaker.enabled=false", - "spring.cloud.openfeign.httpclient.hc5.enabled=false", "spring.cloud.openfeign.okhttp.enabled=true", - "spring.cloud.httpclientfactories.ok.enabled=true", "spring.cloud.loadbalancer.retry.enabled=false" }) -@DirtiesContext -class FeignOkHttpTests { - - @Autowired - private TestClient testClient; - - @Autowired - private Client feignClient; - - @Autowired - private UserClient userClient; - - @Test - void testSimpleType() { - Hello hello = testClient.getHello(); - assertThat(hello).as("hello was null").isNotNull(); - assertThat(hello).as("first hello didn't match").isEqualTo(new Hello("hello world 1")); - } - - @Test - void testPatch() { - ResponseEntity response = testClient.patchHello(new Hello("foo")); - assertThat(response).isNotNull(); - String header = response.getHeaders().getFirst("x-hello"); - assertThat(header).isEqualTo("hello world patch"); - } - - @Test - void testFeignClientType() { - assertThat(feignClient).isInstanceOf(FeignBlockingLoadBalancerClient.class); - FeignBlockingLoadBalancerClient client = (FeignBlockingLoadBalancerClient) feignClient; - Client delegate = client.getDelegate(); - assertThat(delegate).isInstanceOf(feign.okhttp.OkHttpClient.class); - } - - @Test - void testFeignInheritanceSupport() { - assertThat(userClient).as("UserClient was null").isNotNull(); - final User user = userClient.getUser(1); - assertThat(user).as("Returned user was null").isNotNull(); - assertThat(new User("John Smith")).as("Users were different").isEqualTo(user); - } - - @FeignClient("localapp") - protected interface TestClient extends BaseTestClient { - - } - - protected interface BaseTestClient { - - @GetMapping("/hello") - Hello getHello(); - - @PatchMapping(value = "/hellop", consumes = "application/json") - ResponseEntity patchHello(Hello hello); - - } - - protected interface UserService { - - @GetMapping("/users/{id}") - User getUser(@PathVariable("id") long id); - - } - - @FeignClient("localapp1") - protected interface UserClient extends UserService { - - } - - @Configuration(proxyBeanMethods = false) - @EnableAutoConfiguration - @RestController - @EnableFeignClients(clients = { TestClient.class, UserClient.class }) - @LoadBalancerClients({ - @LoadBalancerClient(name = "localapp", configuration = FeignHttpClientTests.LocalClientConfiguration.class), - @LoadBalancerClient(name = "localapp1", - configuration = FeignHttpClientTests.LocalClientConfiguration.class) }) - @Import(NoSecurityConfiguration.class) - protected static class Application implements UserService { - - @GetMapping("/hello") - public Hello getHello() { - return new Hello("hello world 1"); - } - - @PatchMapping("/hellop") - public ResponseEntity patchHello(@RequestBody Hello hello, - @RequestHeader("Content-Length") int contentLength) { - if (contentLength <= 0) { - throw new IllegalArgumentException("Invalid Content-Length " + contentLength); - } - if (!hello.getMessage().equals("foo")) { - throw new IllegalArgumentException("Invalid Hello: " + hello.getMessage()); - } - return ResponseEntity.ok().header("X-Hello", "hello world patch").build(); - } - - @Override - public User getUser(@PathVariable("id") long id) { - return new User("John Smith"); - } - - } - - public static class Hello { - - private String message; - - Hello() { - } - - Hello(String message) { - this.message = message; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - Hello that = (Hello) o; - return Objects.equals(message, that.message); - } - - @Override - public int hashCode() { - return Objects.hash(message); - } - - } - - public static class User { - - private String name; - - User() { - } - - User(String name) { - this.name = name; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - User that = (User) o; - return Objects.equals(name, that.name); - } - - @Override - public int hashCode() { - return Objects.hash(name); - } - - } - - // Load balancer with fixed server list for "local" pointing to localhost - @Configuration(proxyBeanMethods = false) - static class LocalClientConfiguration { - - @LocalServerPort - private int port = 0; - - @Bean - public ServiceInstanceListSupplier staticServiceInstanceListSupplier() { - return ServiceInstanceListSuppliers.from("local", - new DefaultServiceInstance("local-1", "local", "localhost", port, false)); - } - - } - -} diff --git a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/valid/IterableParameterTests.java b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/valid/IterableParameterTests.java index 33b81bb83..b84f5e5d0 100644 --- a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/valid/IterableParameterTests.java +++ b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/valid/IterableParameterTests.java @@ -47,7 +47,7 @@ */ @SpringBootTest(classes = IterableParameterTests.Application.class, webEnvironment = WebEnvironment.RANDOM_PORT, value = { "spring.application.name=iterableparametertest", - "spring.cloud.openfeign.httpclient.hc5.enabled=false", "spring.cloud.openfeign.okhttp.enabled=false", + "spring.cloud.openfeign.httpclient.hc5.enabled=false", "spring.cloud.openfeign.circuitbreaker.enabled=false" }) @DirtiesContext class IterableParameterTests { diff --git a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/valid/ValidFeignClientTests.java b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/valid/ValidFeignClientTests.java index eb05dc38a..b3b21b8fb 100644 --- a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/valid/ValidFeignClientTests.java +++ b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/valid/ValidFeignClientTests.java @@ -97,8 +97,7 @@ */ @SpringBootTest(classes = ValidFeignClientTests.Application.class, webEnvironment = WebEnvironment.RANDOM_PORT, value = { "spring.application.name=feignclienttest", "spring.cloud.openfeign.httpclient.hc5.enabled=false", - "spring.cloud.openfeign.okhttp.enabled=false", "spring.cloud.openfeign.circuitbreaker.enabled=true", - "spring.cloud.loadbalancer.retry.enabled=false" }) + "spring.cloud.openfeign.circuitbreaker.enabled=true", "spring.cloud.loadbalancer.retry.enabled=false" }) @DirtiesContext class ValidFeignClientTests {