From e698fa664bea239e0ffd00217ab3f69e8c0addcc Mon Sep 17 00:00:00 2001 From: Ryan Baxter Date: Wed, 8 Mar 2017 15:15:34 -0500 Subject: [PATCH] Cherry Picking #1910 --- ...gnAcceptGzipEncodingAutoConfiguration.java | 5 +- ...nContentGzipEncodingAutoConfiguration.java | 5 +- .../netflix/feign/FeignCompressionTests.java | 97 +++++++++++++++++++ 3 files changed, 103 insertions(+), 4 deletions(-) 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/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 3144343d..06eaf0be 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 a9dd22b7..e339ff11 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; @@ -38,7 +39,7 @@ import org.springframework.context.annotation.Configuration; @ConditionalOnClass(Feign.class) @ConditionalOnBean(ApacheHttpClient.class) @ConditionalOnProperty(value = "feign.compression.request.enabled", matchIfMissing = false) -@AutoConfigureBefore(FeignAutoConfiguration.class) +@AutoConfigureAfter(FeignAutoConfiguration.class) public class FeignContentGzipEncodingAutoConfiguration { @Bean 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 00000000..17ba30d1 --- /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; + } + } +}