Repository: spinnaker/kork
Pull request #1233: fix(web): Update OkHttpClientProvider to maintain compatibility with existing retrofit1 clients
Author: login: kirangodishala
Labels: name: ready to merge
description: Approved and ready for merge
name: auto merged
Created: 2025-04-07T09:39:04Z | Merged: 2025-04-08T17:49:43Z

There are existing retrofit1 clients using OkHttpClientProvider which inadvertently use Retrofit2EncodeCorrectionInterceptor  that is meant for retrofit2 clients. This PR fixes the issue. 


Diff:
diff --git a/kork-retrofit/src/main/java/com/netflix/spinnaker/kork/retrofit/RetrofitServiceFactoryAutoConfiguration.java b/kork-retrofit/src/main/java/com/netflix/spinnaker/kork/retrofit/RetrofitServiceFactoryAutoConfiguration.java
index d9a93fb9e..aca8a0cfd 100644
--- a/kork-retrofit/src/main/java/com/netflix/spinnaker/kork/retrofit/RetrofitServiceFactoryAutoConfiguration.java
+++ b/kork-retrofit/src/main/java/com/netflix/spinnaker/kork/retrofit/RetrofitServiceFactoryAutoConfiguration.java
@@ -17,8 +17,10 @@
 
 package com.netflix.spinnaker.kork.retrofit;
 
+import com.netflix.spinnaker.config.okhttp3.OkHttpClientBuilderProvider;
 import com.netflix.spinnaker.config.okhttp3.OkHttpClientProvider;
 import com.netflix.spinnaker.kork.client.ServiceClientFactory;
+import java.util.List;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
@@ -31,6 +33,15 @@
 @ConditionalOnProperty(value = "retrofit.enabled", havingValue = "true", matchIfMissing = true)
 public class RetrofitServiceFactoryAutoConfiguration {
 
+  /**
+   * Creates OkHttpClientProvider bean for use with RetrofitServiceFactory i.e. for retrofit1
+   * clients
+   */
+  @Bean
+  public OkHttpClientProvider okHttpClientProvider(List<OkHttpClientBuilderProvider> providers) {
+    return new OkHttpClientProvider(providers);
+  }
+
   @Bean
   @Order(Ordered.LOWEST_PRECEDENCE)
   ServiceClientFactory serviceClientFactory(
diff --git a/kork-retrofit/src/test/kotlin/com/netflix/spinnaker/kork/retrofit/RetrofitServiceProviderTest.kt b/kork-retrofit/src/test/kotlin/com/netflix/spinnaker/kork/retrofit/RetrofitServiceProviderTest.kt
index a0cb475aa..3a7a64583 100644
--- a/kork-retrofit/src/test/kotlin/com/netflix/spinnaker/kork/retrofit/RetrofitServiceProviderTest.kt
+++ b/kork-retrofit/src/test/kotlin/com/netflix/spinnaker/kork/retrofit/RetrofitServiceProviderTest.kt
@@ -56,6 +56,7 @@ class RetrofitServiceProviderTest  : JUnit5Minutests {
           .withConfiguration(AutoConfigurations.of(
             RetrofitServiceFactoryAutoConfiguration::class.java,
             TaskExecutionAutoConfiguration::class.java,
+            DefaultOkHttpClientBuilderProvider::class.java,
             OkHttpClientComponents::class.java,
             RetrofitConfiguration::class.java,
             TestConfiguration::class.java
@@ -79,6 +80,19 @@ class RetrofitServiceProviderTest  : JUnit5Minutests {
         }
       }
 
+      test("check if Retrofit2EncodeCorrectionInterceptor is added to OkHttpClientProvider") {
+        run { ctx: AssertableApplicationContext ->
+          expect {
+            that(
+              ctx.getBean(OkHttpClientProvider::class.java)
+                .getClient(DefaultServiceEndpoint("retrofit1", "https://www.test.com"))
+                .interceptors
+                .count { it is Retrofit2EncodeCorrectionInterceptor }
+            ).isEqualTo(0)
+          }
+        }
+      }
+
     }
   }
 
@@ -96,11 +110,6 @@ private open class TestConfiguration {
     return RawOkHttpClientFactory().create(OkHttpClientConfigurationProperties(), emptyList(), httpTracing)
   }
 
-  @Bean
-  open fun okHttpClientProvider(okHttpClient: OkHttpClient): OkHttpClientProvider {
-    return OkHttpClientProvider(listOf(DefaultOkHttpClientBuilderProvider(okHttpClient, OkHttpClientConfigurationProperties())), Retrofit2EncodeCorrectionInterceptor())
-  }
-
   @Bean
   open fun objectMapper(): ObjectMapper {
     return  ObjectMapper()
diff --git a/kork-web/src/main/java/com/netflix/spinnaker/config/okhttp3/OkHttpClientProvider.java b/kork-web/src/main/java/com/netflix/spinnaker/config/okhttp3/OkHttpClientProvider.java
index 1705a320d..1aad9799b 100644
--- a/kork-web/src/main/java/com/netflix/spinnaker/config/okhttp3/OkHttpClientProvider.java
+++ b/kork-web/src/main/java/com/netflix/spinnaker/config/okhttp3/OkHttpClientProvider.java
@@ -22,8 +22,10 @@
 import com.netflix.spinnaker.kork.exceptions.SystemException;
 import com.netflix.spinnaker.okhttp.Retrofit2EncodeCorrectionInterceptor;
 import java.util.List;
+import java.util.Optional;
 import okhttp3.Interceptor;
 import okhttp3.OkHttpClient;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 @Component
@@ -31,13 +33,37 @@ public class OkHttpClientProvider {
 
   private final List<OkHttpClientBuilderProvider> providers;
 
-  private final Retrofit2EncodeCorrectionInterceptor retrofit2EncodeCorrectionInterceptor;
+  private final Optional<Retrofit2EncodeCorrectionInterceptor> retrofit2EncodeCorrectionInterceptor;
 
+  /**
+   * Constructor used for retrofit2 clients through Retrofit2ServiceFactory.
+   * Retrofit2EncodeCorrectionInterceptor is required for retrofit2 clients for correcting the
+   * partial encoding done by retrofit2
+   *
+   * @param providers list of {@link OkHttpClientBuilderProvider} that can build a client for the
+   *     given service config
+   * @param retrofit2EncodeCorrectionInterceptor interceptor that corrects the partial encoding done
+   *     by retrofit2
+   */
+  @Autowired
   public OkHttpClientProvider(
       List<OkHttpClientBuilderProvider> providers,
       Retrofit2EncodeCorrectionInterceptor retrofit2EncodeCorrectionInterceptor) {
     this.providers = providers;
-    this.retrofit2EncodeCorrectionInterceptor = retrofit2EncodeCorrectionInterceptor;
+    this.retrofit2EncodeCorrectionInterceptor = Optional.of(retrofit2EncodeCorrectionInterceptor);
+  }
+
+  /**
+   * Constructor used for retrofit1 clients through RetrofitServiceFactory.
+   * Retrofit2EncodeCorrectionInterceptor is not required for retrofit1 clients hence set to empty.
+   *
+   * @param providers list of {@link OkHttpClientBuilderProvider} that can build a client for the
+   *     given service config
+   */
+  public OkHttpClientProvider(List<OkHttpClientBuilderProvider> providers) {
+    this.providers = providers;
+    // to maintain backward compatibility with existing Retrofit1 clients
+    this.retrofit2EncodeCorrectionInterceptor = Optional.empty();
   }
 
   /**
@@ -64,11 +90,11 @@ public OkHttpClient getClient(ServiceEndpoint service, List<Interceptor> interce
   public OkHttpClient getClient(
       ServiceEndpoint service, List<Interceptor> interceptors, boolean skipEncodeCorrection) {
     OkHttpClient.Builder builder = findProvider(service).get(service);
-    if (!skipEncodeCorrection) {
+    if (!skipEncodeCorrection && retrofit2EncodeCorrectionInterceptor.isPresent()) {
       boolean encodeCorrectionExist =
           interceptors.stream().anyMatch(i -> i instanceof Retrofit2EncodeCorrectionInterceptor);
       if (!encodeCorrectionExist) {
-        builder.addInterceptor(retrofit2EncodeCorrectionInterceptor);
+        builder.addInterceptor(retrofit2EncodeCorrectionInterceptor.get());
       }
     }
     interceptors.forEach(builder::addInterceptor);


Reviews:
user: login: dbyron-sf
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-07T15:40:18Z
user: login: kirangodishala
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-07T18:44:11Z
user: login: dbyron-sf
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-07T18:49:03Z
user: login: dbyron-sf
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-08T15:58:16Z
user: login: dbyron-sf
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-08T15:58:55Z
user: login: dbyron-sf
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-08T15:59:28Z
user: login: dbyron-sf
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-08T16:00:31Z
user: login: dbyron-sf
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-08T16:20:40Z
user: login: kirangodishala
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-08T17:08:35Z
user: login: kirangodishala
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-08T17:12:45Z
user: login: kirangodishala
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-08T17:13:17Z
user: login: kirangodishala
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-08T17:17:58Z
user: login: kirangodishala
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-08T17:18:08Z
user: login: dbyron-sf
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-04-08T17:48:47Z

Review comments:
diff_hunk: @@ -22,22 +22,31 @@
 import com.netflix.spinnaker.kork.exceptions.SystemException;
 import com.netflix.spinnaker.okhttp.Retrofit2EncodeCorrectionInterceptor;
 import java.util.List;
+import java.util.Optional;
 import okhttp3.Interceptor;
 import okhttp3.OkHttpClient;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 @Component
 public class OkHttpClientProvider {
 
   private final List<OkHttpClientBuilderProvider> providers;
 
-  private final Retrofit2EncodeCorrectionInterceptor retrofit2EncodeCorrectionInterceptor;
+  private final Optional<Retrofit2EncodeCorrectionInterceptor> retrofit2EncodeCorrectionInterceptor;
 
+  @Autowired
   public OkHttpClientProvider(
       List<OkHttpClientBuilderProvider> providers,
       Retrofit2EncodeCorrectionInterceptor retrofit2EncodeCorrectionInterceptor) {
     this.providers = providers;
-    this.retrofit2EncodeCorrectionInterceptor = retrofit2EncodeCorrectionInterceptor;
+    this.retrofit2EncodeCorrectionInterceptor = Optional.of(retrofit2EncodeCorrectionInterceptor);
path: kork-web/src/main/java/com/netflix/spinnaker/config/okhttp3/OkHttpClientProvider.java
user: login: dbyron-sf
body: Doesn't this need to be `Optional.ofNullable` ?
created_at: 2025-04-07T15:40:18Z
author_association: CONTRIBUTOR
diff_hunk: @@ -22,22 +22,31 @@
 import com.netflix.spinnaker.kork.exceptions.SystemException;
 import com.netflix.spinnaker.okhttp.Retrofit2EncodeCorrectionInterceptor;
 import java.util.List;
+import java.util.Optional;
 import okhttp3.Interceptor;
 import okhttp3.OkHttpClient;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 @Component
 public class OkHttpClientProvider {
 
   private final List<OkHttpClientBuilderProvider> providers;
 
-  private final Retrofit2EncodeCorrectionInterceptor retrofit2EncodeCorrectionInterceptor;
+  private final Optional<Retrofit2EncodeCorrectionInterceptor> retrofit2EncodeCorrectionInterceptor;
 
+  @Autowired
   public OkHttpClientProvider(
       List<OkHttpClientBuilderProvider> providers,
       Retrofit2EncodeCorrectionInterceptor retrofit2EncodeCorrectionInterceptor) {
     this.providers = providers;
-    this.retrofit2EncodeCorrectionInterceptor = retrofit2EncodeCorrectionInterceptor;
+    this.retrofit2EncodeCorrectionInterceptor = Optional.of(retrofit2EncodeCorrectionInterceptor);
path: kork-web/src/main/java/com/netflix/spinnaker/config/okhttp3/OkHttpClientProvider.java
user: login: kirangodishala
body: Retrofit2 clients need the Retrofit2EncodeCorrectionInterceptor
created_at: 2025-04-07T18:44:10Z
author_association: CONTRIBUTOR
diff_hunk: @@ -22,22 +22,31 @@
 import com.netflix.spinnaker.kork.exceptions.SystemException;
 import com.netflix.spinnaker.okhttp.Retrofit2EncodeCorrectionInterceptor;
 import java.util.List;
+import java.util.Optional;
 import okhttp3.Interceptor;
 import okhttp3.OkHttpClient;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 @Component
 public class OkHttpClientProvider {
 
   private final List<OkHttpClientBuilderProvider> providers;
 
-  private final Retrofit2EncodeCorrectionInterceptor retrofit2EncodeCorrectionInterceptor;
+  private final Optional<Retrofit2EncodeCorrectionInterceptor> retrofit2EncodeCorrectionInterceptor;
 
+  @Autowired
   public OkHttpClientProvider(
       List<OkHttpClientBuilderProvider> providers,
       Retrofit2EncodeCorrectionInterceptor retrofit2EncodeCorrectionInterceptor) {
     this.providers = providers;
-    this.retrofit2EncodeCorrectionInterceptor = retrofit2EncodeCorrectionInterceptor;
+    this.retrofit2EncodeCorrectionInterceptor = Optional.of(retrofit2EncodeCorrectionInterceptor);
path: kork-web/src/main/java/com/netflix/spinnaker/config/okhttp3/OkHttpClientProvider.java
user: login: dbyron-sf
body: Aaah, ok.
created_at: 2025-04-07T18:49:03Z
author_association: CONTRIBUTOR
diff_hunk: @@ -22,22 +22,31 @@
 import com.netflix.spinnaker.kork.exceptions.SystemException;
 import com.netflix.spinnaker.okhttp.Retrofit2EncodeCorrectionInterceptor;
 import java.util.List;
+import java.util.Optional;
 import okhttp3.Interceptor;
 import okhttp3.OkHttpClient;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 @Component
 public class OkHttpClientProvider {
 
   private final List<OkHttpClientBuilderProvider> providers;
 
-  private final Retrofit2EncodeCorrectionInterceptor retrofit2EncodeCorrectionInterceptor;
+  private final Optional<Retrofit2EncodeCorrectionInterceptor> retrofit2EncodeCorrectionInterceptor;
 
+  @Autowired
   public OkHttpClientProvider(
       List<OkHttpClientBuilderProvider> providers,
       Retrofit2EncodeCorrectionInterceptor retrofit2EncodeCorrectionInterceptor) {
     this.providers = providers;
-    this.retrofit2EncodeCorrectionInterceptor = retrofit2EncodeCorrectionInterceptor;
+    this.retrofit2EncodeCorrectionInterceptor = Optional.of(retrofit2EncodeCorrectionInterceptor);
+  }
+
+  public OkHttpClientProvider(List<OkHttpClientBuilderProvider> providers) {
path: kork-web/src/main/java/com/netflix/spinnaker/config/okhttp3/OkHttpClientProvider.java
user: login: dbyron-sf
body: Could you add some javadoc to make it clear whether this constructor is for use with retrofit1, retrofit2, or both?
created_at: 2025-04-08T15:58:16Z
author_association: CONTRIBUTOR
diff_hunk: @@ -22,22 +22,31 @@
 import com.netflix.spinnaker.kork.exceptions.SystemException;
 import com.netflix.spinnaker.okhttp.Retrofit2EncodeCorrectionInterceptor;
 import java.util.List;
+import java.util.Optional;
 import okhttp3.Interceptor;
 import okhttp3.OkHttpClient;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 @Component
 public class OkHttpClientProvider {
 
   private final List<OkHttpClientBuilderProvider> providers;
 
-  private final Retrofit2EncodeCorrectionInterceptor retrofit2EncodeCorrectionInterceptor;
+  private final Optional<Retrofit2EncodeCorrectionInterceptor> retrofit2EncodeCorrectionInterceptor;
 
+  @Autowired
   public OkHttpClientProvider(
path: kork-web/src/main/java/com/netflix/spinnaker/config/okhttp3/OkHttpClientProvider.java
user: login: dbyron-sf
body: Could you add some javadoc that makes it clear when it's correct to provide a real Retrofit2EncodeCorrectionInterceptor object and when it's correct to provide null?
created_at: 2025-04-08T15:58:54Z
author_association: CONTRIBUTOR
diff_hunk: @@ -31,6 +33,11 @@
 @ConditionalOnProperty(value = "retrofit.enabled", havingValue = "true", matchIfMissing = true)
 public class RetrofitServiceFactoryAutoConfiguration {
path: kork-retrofit/src/main/java/com/netflix/spinnaker/kork/retrofit/RetrofitServiceFactoryAutoConfiguration.java
user: login: dbyron-sf
body: Please add javadoc that makes it clear whether this config class is appropriate for retrofit1, retrofit2 or both?  Pretty sure it's only for retrofit1.
created_at: 2025-04-08T15:59:28Z
author_association: CONTRIBUTOR
diff_hunk: @@ -64,11 +73,11 @@ public OkHttpClient getClient(ServiceEndpoint service, List<Interceptor> interce
   public OkHttpClient getClient(
       ServiceEndpoint service, List<Interceptor> interceptors, boolean skipEncodeCorrection) {
     OkHttpClient.Builder builder = findProvider(service).get(service);
-    if (!skipEncodeCorrection) {
+    if (!skipEncodeCorrection && retrofit2EncodeCorrectionInterceptor.isPresent()) {
path: kork-web/src/main/java/com/netflix/spinnaker/config/okhttp3/OkHttpClientProvider.java
user: login: dbyron-sf
body: Under what circumstances is skipEncodeCorrection false at the same time retrofit2EncodeCorrectionInterceptor is absent?
created_at: 2025-04-08T16:00:31Z
author_association: CONTRIBUTOR
diff_hunk: @@ -31,6 +33,11 @@
 @ConditionalOnProperty(value = "retrofit.enabled", havingValue = "true", matchIfMissing = true)
 public class RetrofitServiceFactoryAutoConfiguration {
 
+  @Bean
+  public OkHttpClientProvider okHttpClientProvider(List<OkHttpClientBuilderProvider> providers) {
path: kork-retrofit/src/main/java/com/netflix/spinnaker/kork/retrofit/RetrofitServiceFactoryAutoConfiguration.java
user: login: dbyron-sf
body: Please add similar javadoc here for this bean too.
created_at: 2025-04-08T16:20:40Z
author_association: CONTRIBUTOR
diff_hunk: @@ -22,22 +22,31 @@
 import com.netflix.spinnaker.kork.exceptions.SystemException;
 import com.netflix.spinnaker.okhttp.Retrofit2EncodeCorrectionInterceptor;
 import java.util.List;
+import java.util.Optional;
 import okhttp3.Interceptor;
 import okhttp3.OkHttpClient;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 @Component
 public class OkHttpClientProvider {
 
   private final List<OkHttpClientBuilderProvider> providers;
 
-  private final Retrofit2EncodeCorrectionInterceptor retrofit2EncodeCorrectionInterceptor;
+  private final Optional<Retrofit2EncodeCorrectionInterceptor> retrofit2EncodeCorrectionInterceptor;
 
+  @Autowired
   public OkHttpClientProvider(
       List<OkHttpClientBuilderProvider> providers,
       Retrofit2EncodeCorrectionInterceptor retrofit2EncodeCorrectionInterceptor) {
     this.providers = providers;
-    this.retrofit2EncodeCorrectionInterceptor = retrofit2EncodeCorrectionInterceptor;
+    this.retrofit2EncodeCorrectionInterceptor = Optional.of(retrofit2EncodeCorrectionInterceptor);
+  }
+
+  public OkHttpClientProvider(List<OkHttpClientBuilderProvider> providers) {
path: kork-web/src/main/java/com/netflix/spinnaker/config/okhttp3/OkHttpClientProvider.java
user: login: kirangodishala
body: Done
created_at: 2025-04-08T17:08:34Z
author_association: CONTRIBUTOR
diff_hunk: @@ -22,22 +22,31 @@
 import com.netflix.spinnaker.kork.exceptions.SystemException;
 import com.netflix.spinnaker.okhttp.Retrofit2EncodeCorrectionInterceptor;
 import java.util.List;
+import java.util.Optional;
 import okhttp3.Interceptor;
 import okhttp3.OkHttpClient;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 @Component
 public class OkHttpClientProvider {
 
   private final List<OkHttpClientBuilderProvider> providers;
 
-  private final Retrofit2EncodeCorrectionInterceptor retrofit2EncodeCorrectionInterceptor;
+  private final Optional<Retrofit2EncodeCorrectionInterceptor> retrofit2EncodeCorrectionInterceptor;
 
+  @Autowired
   public OkHttpClientProvider(
path: kork-web/src/main/java/com/netflix/spinnaker/config/okhttp3/OkHttpClientProvider.java
user: login: kirangodishala
body: Now, we don't pass null, though it can handle. This constructor is meant only for retrofit2. 
created_at: 2025-04-08T17:12:45Z
author_association: CONTRIBUTOR
diff_hunk: @@ -31,6 +33,11 @@
 @ConditionalOnProperty(value = "retrofit.enabled", havingValue = "true", matchIfMissing = true)
 public class RetrofitServiceFactoryAutoConfiguration {
path: kork-retrofit/src/main/java/com/netflix/spinnaker/kork/retrofit/RetrofitServiceFactoryAutoConfiguration.java
user: login: kirangodishala
body: Added. Yes, it's only for retrofit1
created_at: 2025-04-08T17:13:17Z
author_association: CONTRIBUTOR
diff_hunk: @@ -64,11 +73,11 @@ public OkHttpClient getClient(ServiceEndpoint service, List<Interceptor> interce
   public OkHttpClient getClient(
       ServiceEndpoint service, List<Interceptor> interceptors, boolean skipEncodeCorrection) {
     OkHttpClient.Builder builder = findProvider(service).get(service);
-    if (!skipEncodeCorrection) {
+    if (!skipEncodeCorrection && retrofit2EncodeCorrectionInterceptor.isPresent()) {
path: kork-web/src/main/java/com/netflix/spinnaker/config/okhttp3/OkHttpClientProvider.java
user: login: kirangodishala
body: It's unlikely but it is kind of a null check. 
created_at: 2025-04-08T17:17:58Z
author_association: CONTRIBUTOR
diff_hunk: @@ -31,6 +33,11 @@
 @ConditionalOnProperty(value = "retrofit.enabled", havingValue = "true", matchIfMissing = true)
 public class RetrofitServiceFactoryAutoConfiguration {
 
+  @Bean
+  public OkHttpClientProvider okHttpClientProvider(List<OkHttpClientBuilderProvider> providers) {
path: kork-retrofit/src/main/java/com/netflix/spinnaker/kork/retrofit/RetrofitServiceFactoryAutoConfiguration.java
user: login: kirangodishala
body: added
created_at: 2025-04-08T17:18:08Z
author_association: CONTRIBUTOR

PR comments:
user: login: dbyron-sf
created_at: 2025-04-08T22:41:01Z
body: @mergifyio backport release-1.37.x
author_association: CONTRIBUTOR
user: login: mergify[bot]
created_at: 2025-04-08T22:41:08Z
body: > backport release-1.37.x

#### ✅ Backports have been created

<details>

* [#1234 fix(web): Update OkHttpClientProvider to maintain compatibility with existing retrofit1 clients (backport #1233)](https://github.com/spinnaker/kork/pull/1234) has been created for branch `release-1.37.x`

</details>


<!---
DO NOT EDIT
-*- Mergify Payload -*-
{"command": "backport release-1.37.x", "conclusion": "success", "action_is_running": true}
-*- Mergify Payload End -*-
-->
author_association: CONTRIBUTOR