From ae5b313bdd277f5c014ea9f7121aa4a52fa45e4c Mon Sep 17 00:00:00 2001 From: Ryan Baxter Date: Wed, 8 Mar 2017 15:15:34 -0500 Subject: [PATCH 1/3] Removing conditional on ApacheHttpClient. Fixes #1580. --- .../encoding/FeignContentGzipEncodingAutoConfiguration.java | 1 - 1 file changed, 1 deletion(-) diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/encoding/FeignContentGzipEncodingAutoConfiguration.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/encoding/FeignContentGzipEncodingAutoConfiguration.java index a9dd22b7b..fcc9fe336 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/encoding/FeignContentGzipEncodingAutoConfiguration.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/encoding/FeignContentGzipEncodingAutoConfiguration.java @@ -36,7 +36,6 @@ import org.springframework.context.annotation.Configuration; @Configuration @EnableConfigurationProperties(FeignClientEncodingProperties.class) @ConditionalOnClass(Feign.class) -@ConditionalOnBean(ApacheHttpClient.class) @ConditionalOnProperty(value = "feign.compression.request.enabled", matchIfMissing = false) @AutoConfigureBefore(FeignAutoConfiguration.class) public class FeignContentGzipEncodingAutoConfiguration { From 2cfc32710fa3fd7a8a27e6934c23071a90342ba2 Mon Sep 17 00:00:00 2001 From: Ryan Baxter Date: Thu, 9 Mar 2017 11:06:15 -0500 Subject: [PATCH 2/3] Autoconfiguring Feign compression configuration after FeignAutoConfiguration --- .../encoding/FeignAcceptGzipEncodingAutoConfiguration.java | 5 +++-- .../encoding/FeignContentGzipEncodingAutoConfiguration.java | 6 ++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/encoding/FeignAcceptGzipEncodingAutoConfiguration.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/encoding/FeignAcceptGzipEncodingAutoConfiguration.java index 3144343dc..06eaf0be5 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/encoding/FeignAcceptGzipEncodingAutoConfiguration.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/encoding/FeignAcceptGzipEncodingAutoConfiguration.java @@ -18,7 +18,8 @@ package org.springframework.cloud.netflix.feign.encoding; import feign.Feign; import feign.httpclient.ApacheHttpClient; -import org.springframework.boot.autoconfigure.AutoConfigureBefore; + +import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; @@ -38,7 +39,7 @@ import org.springframework.context.annotation.Configuration; @ConditionalOnClass(Feign.class) @ConditionalOnBean(ApacheHttpClient.class) @ConditionalOnProperty(value = "feign.compression.response.enabled", matchIfMissing = false) -@AutoConfigureBefore(FeignAutoConfiguration.class) +@AutoConfigureAfter(FeignAutoConfiguration.class) public class FeignAcceptGzipEncodingAutoConfiguration { @Bean diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/encoding/FeignContentGzipEncodingAutoConfiguration.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/encoding/FeignContentGzipEncodingAutoConfiguration.java index fcc9fe336..e339ff112 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/encoding/FeignContentGzipEncodingAutoConfiguration.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/encoding/FeignContentGzipEncodingAutoConfiguration.java @@ -18,7 +18,8 @@ package org.springframework.cloud.netflix.feign.encoding; import feign.Feign; import feign.httpclient.ApacheHttpClient; -import org.springframework.boot.autoconfigure.AutoConfigureBefore; + +import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; @@ -36,8 +37,9 @@ import org.springframework.context.annotation.Configuration; @Configuration @EnableConfigurationProperties(FeignClientEncodingProperties.class) @ConditionalOnClass(Feign.class) +@ConditionalOnBean(ApacheHttpClient.class) @ConditionalOnProperty(value = "feign.compression.request.enabled", matchIfMissing = false) -@AutoConfigureBefore(FeignAutoConfiguration.class) +@AutoConfigureAfter(FeignAutoConfiguration.class) public class FeignContentGzipEncodingAutoConfiguration { @Bean From 15d4a71960a1ea672fc58e1332db717311aecc05 Mon Sep 17 00:00:00 2001 From: Ryan Baxter Date: Wed, 3 May 2017 19:50:23 -0400 Subject: [PATCH 3/3] Test for Feign compression interceptors --- .../netflix/feign/FeignCompressionTests.java | 97 +++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/FeignCompressionTests.java diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/FeignCompressionTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/FeignCompressionTests.java new file mode 100644 index 000000000..17ba30d1e --- /dev/null +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/FeignCompressionTests.java @@ -0,0 +1,97 @@ +/* + * + * * Copyright 2013-2017 the original author or authors. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * + */ + +package org.springframework.cloud.netflix.feign; + +import feign.Client; +import feign.RequestInterceptor; +import feign.httpclient.ApacheHttpClient; + +import java.util.Map; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.cloud.ClassPathExclusions; +import org.springframework.cloud.FilteredClassPathRunner; +import org.springframework.cloud.netflix.archaius.ArchaiusAutoConfiguration; +import org.springframework.cloud.netflix.feign.encoding.FeignAcceptGzipEncodingAutoConfiguration; +import org.springframework.cloud.netflix.feign.encoding.FeignAcceptGzipEncodingInterceptor; +import org.springframework.cloud.netflix.feign.encoding.FeignContentGzipEncodingAutoConfiguration; +import org.springframework.cloud.netflix.feign.encoding.FeignContentGzipEncodingInterceptor; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +/** + * @author Ryan Baxter + */ +@RunWith(FilteredClassPathRunner.class) +@ClassPathExclusions({"ribbon-loadbalancer-{version:\\d.*}.jar"}) +public class FeignCompressionTests { + + private ConfigurableApplicationContext context; + + @Before + public void setUp() { + context = new SpringApplicationBuilder().properties("feign.compression.response.enabled=true", + "feign.compression.request.enabled=true", "feign.okhttp.enabled=false").sources(PropertyPlaceholderAutoConfiguration.class, + ArchaiusAutoConfiguration.class, FeignAutoConfiguration.class, PlainConfig.class, FeignContentGzipEncodingAutoConfiguration.class, + FeignAcceptGzipEncodingAutoConfiguration.class).web(false).run(); + } + + @After + public void tearDown() { + if(context != null) { + context.close(); + } + } + + @Test + public void testInterceptors() { + FeignContext feignContext = context.getBean(FeignContext.class); + Map interceptors = feignContext.getInstances("foo", RequestInterceptor.class); + assertEquals(2, interceptors.size()); + assertTrue(FeignAcceptGzipEncodingInterceptor.class.isInstance(interceptors.get("feignAcceptGzipEncodingInterceptor"))); + assertTrue(FeignContentGzipEncodingInterceptor.class.isInstance(interceptors.get("feignContentGzipEncodingInterceptor"))); + } + + @Configuration + protected static class PlainConfig { + + @Autowired + private Client client; + + @Bean + public ApacheHttpClient client() { + /* We know our client is an AppacheHttpClient because we disabled the OK HTTP client. FeignAcceptGzipEncodingAutoConfiguration + * won't load unless there is a bean of type ApacheHttpClient (not Client) in this test because the bean is not + * yet created and so the application context doesnt know that the Client bean is actually an instance of ApacheHttpClient, + * therefore FeignAcceptGzipEncodingAutoConfiguration will not be loaded. We just create a bean here of type + * ApacheHttpClient so that the configuration will be loaded correctly. + */ + return (ApacheHttpClient)client; + } + } +}