From 936a3b334eebbb412bcace23f2097265fc0007e4 Mon Sep 17 00:00:00 2001 From: Dave Syer Date: Thu, 16 Apr 2015 13:25:33 +0100 Subject: [PATCH] Set explicit cookie policy in HTTP client in RibbonClientConfiguration When the Apache HTTP client is being set up for the Ribbon client we can jump in and explicitly set a cookie policy. Obviously, since the client will generally be shared across sessions, the only sensible default is IGNORE_COOKIES. I couldn't find a way round this without using deprecated APIs (but there are other instances of that in our code because of the way Netflix uses it, so maybe that doesn't matter). Fixes gh-301 --- .../ribbon/RibbonClientConfiguration.java | 25 ++++++++++++++++++- .../ribbon/SpringClientFactoryTests.java | 12 +++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/RibbonClientConfiguration.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/RibbonClientConfiguration.java index 58d507ff..0239e27c 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/RibbonClientConfiguration.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/RibbonClientConfiguration.java @@ -16,6 +16,8 @@ package org.springframework.cloud.netflix.ribbon; +import org.apache.http.client.params.ClientPNames; +import org.apache.http.client.params.CookiePolicy; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.context.properties.EnableConfigurationProperties; @@ -37,6 +39,8 @@ import com.netflix.loadbalancer.ZoneAvoidanceRule; import com.netflix.loadbalancer.ZoneAwareLoadBalancer; import com.netflix.niws.client.http.RestClient; import com.netflix.servo.monitor.Monitors; +import com.sun.jersey.api.client.Client; +import com.sun.jersey.client.apache4.ApacheHttpClient4; /** * @author Dave Syer @@ -86,7 +90,7 @@ public class RibbonClientConfiguration { @Bean @ConditionalOnMissingBean public RestClient ribbonRestClient(IClientConfig config, ILoadBalancer loadBalancer) { - RestClient client = new RestClient(config); + RestClient client = new OverrideRestClient(config); client.setLoadBalancer(loadBalancer); Monitors.registerObject("Client_" + this.name, client); return client; @@ -119,4 +123,23 @@ public class RibbonClientConfiguration { return new RibbonLoadBalancerContext(loadBalancer, config); } + private static class OverrideRestClient extends RestClient { + + private OverrideRestClient(IClientConfig ncc) { + super(ncc); + } + + @Override + protected Client apacheHttpClientSpecificInitialization() { + ApacheHttpClient4 apache = (ApacheHttpClient4) super + .apacheHttpClientSpecificInitialization(); + apache.getClientHandler() + .getHttpClient() + .getParams() + .setParameter(ClientPNames.COOKIE_POLICY, CookiePolicy.IGNORE_COOKIES); + return apache; + } + + } + } diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/SpringClientFactoryTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/SpringClientFactoryTests.java index c94318c5..96b25c7d 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/SpringClientFactoryTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/SpringClientFactoryTests.java @@ -16,12 +16,16 @@ package org.springframework.cloud.netflix.ribbon; +import org.apache.http.client.params.ClientPNames; +import org.apache.http.client.params.CookiePolicy; import org.junit.Test; import org.springframework.boot.test.EnvironmentTestUtils; import org.springframework.cloud.netflix.archaius.ArchaiusAutoConfiguration; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import com.netflix.client.DefaultLoadBalancerRetryHandler; +import com.netflix.niws.client.http.RestClient; +import com.sun.jersey.client.apache4.ApacheHttpClient4; import static org.junit.Assert.assertEquals; @@ -46,4 +50,12 @@ public class SpringClientFactoryTests { this.factory.destroy(); } + @Test + public void testCookiePolicy() { + RestClient client = this.factory.getClient("foo", RestClient.class); + ApacheHttpClient4 jerseyClient = (ApacheHttpClient4) client.getJerseyClient(); + assertEquals(CookiePolicy.IGNORE_COOKIES, jerseyClient.getClientHandler() + .getHttpClient().getParams().getParameter(ClientPNames.COOKIE_POLICY)); + this.factory.destroy(); + } }