Skip to content
This repository was archived by the owner on Dec 20, 2025. It is now read-only.

Commit 889d36b

Browse files
fix(web): Update OkHttpClientProvider to maintain compatibility with existing retrofit1 clients (#1233) (#1234)
* test(retrofit1): add a test to demonstrate the issue of Retrofit2EncodeCorrectionInterceptor being added to retrofit1 clients * fix(web): Update OkHttpClientProvider to maintain compatibility with existing retrofit1 clients * fix(web): add javadoc for clarity (cherry picked from commit a7b6fde) Co-authored-by: Kiran Godishala <53332225+kirangodishala@users.noreply.github.com>
1 parent 806ece0 commit 889d36b

3 files changed

Lines changed: 55 additions & 9 deletions

File tree

kork-retrofit/src/main/java/com/netflix/spinnaker/kork/retrofit/RetrofitServiceFactoryAutoConfiguration.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,10 @@
1717

1818
package com.netflix.spinnaker.kork.retrofit;
1919

20+
import com.netflix.spinnaker.config.okhttp3.OkHttpClientBuilderProvider;
2021
import com.netflix.spinnaker.config.okhttp3.OkHttpClientProvider;
2122
import com.netflix.spinnaker.kork.client.ServiceClientFactory;
23+
import java.util.List;
2224
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
2325
import org.springframework.context.annotation.Bean;
2426
import org.springframework.context.annotation.Configuration;
@@ -31,6 +33,15 @@
3133
@ConditionalOnProperty(value = "retrofit.enabled", havingValue = "true", matchIfMissing = true)
3234
public class RetrofitServiceFactoryAutoConfiguration {
3335

36+
/**
37+
* Creates OkHttpClientProvider bean for use with RetrofitServiceFactory i.e. for retrofit1
38+
* clients
39+
*/
40+
@Bean
41+
public OkHttpClientProvider okHttpClientProvider(List<OkHttpClientBuilderProvider> providers) {
42+
return new OkHttpClientProvider(providers);
43+
}
44+
3445
@Bean
3546
@Order(Ordered.LOWEST_PRECEDENCE)
3647
ServiceClientFactory serviceClientFactory(

kork-retrofit/src/test/kotlin/com/netflix/spinnaker/kork/retrofit/RetrofitServiceProviderTest.kt

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ class RetrofitServiceProviderTest : JUnit5Minutests {
5656
.withConfiguration(AutoConfigurations.of(
5757
RetrofitServiceFactoryAutoConfiguration::class.java,
5858
TaskExecutionAutoConfiguration::class.java,
59+
DefaultOkHttpClientBuilderProvider::class.java,
5960
OkHttpClientComponents::class.java,
6061
RetrofitConfiguration::class.java,
6162
TestConfiguration::class.java
@@ -79,6 +80,19 @@ class RetrofitServiceProviderTest : JUnit5Minutests {
7980
}
8081
}
8182

83+
test("check if Retrofit2EncodeCorrectionInterceptor is added to OkHttpClientProvider") {
84+
run { ctx: AssertableApplicationContext ->
85+
expect {
86+
that(
87+
ctx.getBean(OkHttpClientProvider::class.java)
88+
.getClient(DefaultServiceEndpoint("retrofit1", "https://www.test.com"))
89+
.interceptors
90+
.count { it is Retrofit2EncodeCorrectionInterceptor }
91+
).isEqualTo(0)
92+
}
93+
}
94+
}
95+
8296
}
8397
}
8498

@@ -96,11 +110,6 @@ private open class TestConfiguration {
96110
return RawOkHttpClientFactory().create(OkHttpClientConfigurationProperties(), emptyList(), httpTracing)
97111
}
98112

99-
@Bean
100-
open fun okHttpClientProvider(okHttpClient: OkHttpClient): OkHttpClientProvider {
101-
return OkHttpClientProvider(listOf(DefaultOkHttpClientBuilderProvider(okHttpClient, OkHttpClientConfigurationProperties())), Retrofit2EncodeCorrectionInterceptor())
102-
}
103-
104113
@Bean
105114
open fun objectMapper(): ObjectMapper {
106115
return ObjectMapper()

kork-web/src/main/java/com/netflix/spinnaker/config/okhttp3/OkHttpClientProvider.java

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,22 +22,48 @@
2222
import com.netflix.spinnaker.kork.exceptions.SystemException;
2323
import com.netflix.spinnaker.okhttp.Retrofit2EncodeCorrectionInterceptor;
2424
import java.util.List;
25+
import java.util.Optional;
2526
import okhttp3.Interceptor;
2627
import okhttp3.OkHttpClient;
28+
import org.springframework.beans.factory.annotation.Autowired;
2729
import org.springframework.stereotype.Component;
2830

2931
@Component
3032
public class OkHttpClientProvider {
3133

3234
private final List<OkHttpClientBuilderProvider> providers;
3335

34-
private final Retrofit2EncodeCorrectionInterceptor retrofit2EncodeCorrectionInterceptor;
36+
private final Optional<Retrofit2EncodeCorrectionInterceptor> retrofit2EncodeCorrectionInterceptor;
3537

38+
/**
39+
* Constructor used for retrofit2 clients through Retrofit2ServiceFactory.
40+
* Retrofit2EncodeCorrectionInterceptor is required for retrofit2 clients for correcting the
41+
* partial encoding done by retrofit2
42+
*
43+
* @param providers list of {@link OkHttpClientBuilderProvider} that can build a client for the
44+
* given service config
45+
* @param retrofit2EncodeCorrectionInterceptor interceptor that corrects the partial encoding done
46+
* by retrofit2
47+
*/
48+
@Autowired
3649
public OkHttpClientProvider(
3750
List<OkHttpClientBuilderProvider> providers,
3851
Retrofit2EncodeCorrectionInterceptor retrofit2EncodeCorrectionInterceptor) {
3952
this.providers = providers;
40-
this.retrofit2EncodeCorrectionInterceptor = retrofit2EncodeCorrectionInterceptor;
53+
this.retrofit2EncodeCorrectionInterceptor = Optional.of(retrofit2EncodeCorrectionInterceptor);
54+
}
55+
56+
/**
57+
* Constructor used for retrofit1 clients through RetrofitServiceFactory.
58+
* Retrofit2EncodeCorrectionInterceptor is not required for retrofit1 clients hence set to empty.
59+
*
60+
* @param providers list of {@link OkHttpClientBuilderProvider} that can build a client for the
61+
* given service config
62+
*/
63+
public OkHttpClientProvider(List<OkHttpClientBuilderProvider> providers) {
64+
this.providers = providers;
65+
// to maintain backward compatibility with existing Retrofit1 clients
66+
this.retrofit2EncodeCorrectionInterceptor = Optional.empty();
4167
}
4268

4369
/**
@@ -64,11 +90,11 @@ public OkHttpClient getClient(ServiceEndpoint service, List<Interceptor> interce
6490
public OkHttpClient getClient(
6591
ServiceEndpoint service, List<Interceptor> interceptors, boolean skipEncodeCorrection) {
6692
OkHttpClient.Builder builder = findProvider(service).get(service);
67-
if (!skipEncodeCorrection) {
93+
if (!skipEncodeCorrection && retrofit2EncodeCorrectionInterceptor.isPresent()) {
6894
boolean encodeCorrectionExist =
6995
interceptors.stream().anyMatch(i -> i instanceof Retrofit2EncodeCorrectionInterceptor);
7096
if (!encodeCorrectionExist) {
71-
builder.addInterceptor(retrofit2EncodeCorrectionInterceptor);
97+
builder.addInterceptor(retrofit2EncodeCorrectionInterceptor.get());
7298
}
7399
}
74100
interceptors.forEach(builder::addInterceptor);

0 commit comments

Comments
 (0)