From b16802877bf1b7490b1a39b5f2aabe269d42cf58 Mon Sep 17 00:00:00 2001 From: Gaston Thea Date: Mon, 9 Feb 2026 16:05:23 -0300 Subject: [PATCH 1/3] Move files to http modules --- http-domain/build.gradle | 2 ++ .../android/client/network/Algorithm.java | 7 +++++++ .../client/network/AuthenticatedRequest.java | 2 +- .../android/client/network/Authenticator.java | 9 ++++++++ .../android/client/network/Base64Decoder.java | 2 +- .../network/BasicCredentialsProvider.java | 0 .../network/BearerCredentialsProvider.java | 0 .../network/CertificateCheckerHelper.java | 6 +++--- .../client/network/CertificatePin.java | 6 +----- .../CertificatePinningConfiguration.java | 3 +-- .../CertificatePinningFailureListener.java | 0 .../client/network/DefaultBase64Decoder.java | 20 ++++++++++++++++++ .../client/network/DevelopmentSslConfig.java | 0 .../android/client/network/HttpProxy.java | 0 .../android/client/network/PinEncoder.java | 2 +- .../client/network/PinEncoderImpl.java | 2 +- .../client/network/ProxyConfiguration.java | 0 .../network/ProxyCredentialsProvider.java | 0 .../client/network/SplitAuthenticator.java | 2 +- .../network/CertificateCheckerHelperTest.java | 0 .../CertificatePinningConfigurationTest.java | 0 .../client/network/PinEncoderImplTest.java | 0 .../android/client/network/Algorithm.java | 7 ------- .../android/client/network/Authenticator.java | 9 -------- ...rtificatePinningConfigurationProvider.java | 21 +++++++++++++++---- .../client/network/DefaultBase64Decoder.java | 11 ---------- .../network/SplitAuthenticatedRequest.java | 2 +- .../network/SplitBasicAuthenticator.java | 2 +- .../SplitUrlConnectionAuthenticator.java | 2 +- .../android/client/SplitClientConfigTest.java | 3 ++- .../client/network/HttpClientTest.java | 4 ++-- .../network/SplitAuthenticatorTest.java | 6 +++--- .../network/SplitBasicAuthenticatorTest.java | 2 +- 33 files changed, 76 insertions(+), 56 deletions(-) create mode 100644 http-domain/src/main/java/io/split/android/client/network/Algorithm.java rename {main => http-domain}/src/main/java/io/split/android/client/network/AuthenticatedRequest.java (90%) create mode 100644 http-domain/src/main/java/io/split/android/client/network/Authenticator.java rename {main => http-domain}/src/main/java/io/split/android/client/network/Base64Decoder.java (70%) rename {main => http-domain}/src/main/java/io/split/android/client/network/BasicCredentialsProvider.java (100%) rename {main => http-domain}/src/main/java/io/split/android/client/network/BearerCredentialsProvider.java (100%) rename {main => http-domain}/src/main/java/io/split/android/client/network/CertificateCheckerHelper.java (91%) rename {main => http-domain}/src/main/java/io/split/android/client/network/CertificatePin.java (84%) rename {main => http-domain}/src/main/java/io/split/android/client/network/CertificatePinningConfiguration.java (98%) rename {main => http-domain}/src/main/java/io/split/android/client/network/CertificatePinningFailureListener.java (100%) create mode 100644 http-domain/src/main/java/io/split/android/client/network/DefaultBase64Decoder.java rename {main => http-domain}/src/main/java/io/split/android/client/network/DevelopmentSslConfig.java (100%) rename {main => http-domain}/src/main/java/io/split/android/client/network/HttpProxy.java (100%) rename {main => http-domain}/src/main/java/io/split/android/client/network/PinEncoder.java (84%) rename {main => http-domain}/src/main/java/io/split/android/client/network/PinEncoderImpl.java (96%) rename {main => http-domain}/src/main/java/io/split/android/client/network/ProxyConfiguration.java (100%) rename {main => http-domain}/src/main/java/io/split/android/client/network/ProxyCredentialsProvider.java (100%) rename {main => http-domain}/src/main/java/io/split/android/client/network/SplitAuthenticator.java (81%) rename {main => http-domain}/src/test/java/io/split/android/client/network/CertificateCheckerHelperTest.java (100%) rename {main => http-domain}/src/test/java/io/split/android/client/network/CertificatePinningConfigurationTest.java (100%) rename {main => http-domain}/src/test/java/io/split/android/client/network/PinEncoderImplTest.java (100%) delete mode 100644 main/src/main/java/io/split/android/client/network/Algorithm.java delete mode 100644 main/src/main/java/io/split/android/client/network/Authenticator.java delete mode 100644 main/src/main/java/io/split/android/client/network/DefaultBase64Decoder.java diff --git a/http-domain/build.gradle b/http-domain/build.gradle index 05b24204a..b15da12d4 100644 --- a/http-domain/build.gradle +++ b/http-domain/build.gradle @@ -19,4 +19,6 @@ dependencies { testImplementation libs.junit4 testImplementation libs.mockitoCore + testImplementation libs.mockitoInline + testImplementation libs.okhttpTls } diff --git a/http-domain/src/main/java/io/split/android/client/network/Algorithm.java b/http-domain/src/main/java/io/split/android/client/network/Algorithm.java new file mode 100644 index 000000000..bd3784efe --- /dev/null +++ b/http-domain/src/main/java/io/split/android/client/network/Algorithm.java @@ -0,0 +1,7 @@ +package io.split.android.client.network; + +public class Algorithm { + + public static final String SHA256 = "sha256"; + public static final String SHA1 = "sha1"; +} diff --git a/main/src/main/java/io/split/android/client/network/AuthenticatedRequest.java b/http-domain/src/main/java/io/split/android/client/network/AuthenticatedRequest.java similarity index 90% rename from main/src/main/java/io/split/android/client/network/AuthenticatedRequest.java rename to http-domain/src/main/java/io/split/android/client/network/AuthenticatedRequest.java index f6dfa1a43..6e541e3de 100644 --- a/main/src/main/java/io/split/android/client/network/AuthenticatedRequest.java +++ b/http-domain/src/main/java/io/split/android/client/network/AuthenticatedRequest.java @@ -5,7 +5,7 @@ import java.util.Map; -interface AuthenticatedRequest { +public interface AuthenticatedRequest { void setHeader(@NonNull String name, @NonNull String value); diff --git a/http-domain/src/main/java/io/split/android/client/network/Authenticator.java b/http-domain/src/main/java/io/split/android/client/network/Authenticator.java new file mode 100644 index 000000000..4fab265e4 --- /dev/null +++ b/http-domain/src/main/java/io/split/android/client/network/Authenticator.java @@ -0,0 +1,9 @@ +package io.split.android.client.network; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +public interface Authenticator { + + @Nullable AuthenticatedRequest authenticate(@NonNull AuthenticatedRequest request); +} diff --git a/main/src/main/java/io/split/android/client/network/Base64Decoder.java b/http-domain/src/main/java/io/split/android/client/network/Base64Decoder.java similarity index 70% rename from main/src/main/java/io/split/android/client/network/Base64Decoder.java rename to http-domain/src/main/java/io/split/android/client/network/Base64Decoder.java index 387a900f0..f31358046 100644 --- a/main/src/main/java/io/split/android/client/network/Base64Decoder.java +++ b/http-domain/src/main/java/io/split/android/client/network/Base64Decoder.java @@ -1,6 +1,6 @@ package io.split.android.client.network; -interface Base64Decoder { +public interface Base64Decoder { byte[] decode(String base64); } diff --git a/main/src/main/java/io/split/android/client/network/BasicCredentialsProvider.java b/http-domain/src/main/java/io/split/android/client/network/BasicCredentialsProvider.java similarity index 100% rename from main/src/main/java/io/split/android/client/network/BasicCredentialsProvider.java rename to http-domain/src/main/java/io/split/android/client/network/BasicCredentialsProvider.java diff --git a/main/src/main/java/io/split/android/client/network/BearerCredentialsProvider.java b/http-domain/src/main/java/io/split/android/client/network/BearerCredentialsProvider.java similarity index 100% rename from main/src/main/java/io/split/android/client/network/BearerCredentialsProvider.java rename to http-domain/src/main/java/io/split/android/client/network/BearerCredentialsProvider.java diff --git a/main/src/main/java/io/split/android/client/network/CertificateCheckerHelper.java b/http-domain/src/main/java/io/split/android/client/network/CertificateCheckerHelper.java similarity index 91% rename from main/src/main/java/io/split/android/client/network/CertificateCheckerHelper.java rename to http-domain/src/main/java/io/split/android/client/network/CertificateCheckerHelper.java index 709534b88..45245ed0d 100644 --- a/main/src/main/java/io/split/android/client/network/CertificateCheckerHelper.java +++ b/http-domain/src/main/java/io/split/android/client/network/CertificateCheckerHelper.java @@ -15,10 +15,10 @@ import io.split.android.client.utils.logger.Logger; -class CertificateCheckerHelper { +public class CertificateCheckerHelper { @Nullable - static Set getPinsForHost(String pattern, Map> configuredPins) { + public static Set getPinsForHost(String pattern, Map> configuredPins) { Set hostPins = configuredPins.get(pattern); Set wildcardPins = new LinkedHashSet<>(); @@ -53,7 +53,7 @@ static Set getPinsForHost(String pattern, Map getPinsFromInputStream(InputStream inputStream, PinEncoder pinEncoder) { + public static Set getPinsFromInputStream(InputStream inputStream, PinEncoder pinEncoder) { try (InputStream stream = inputStream) { CertificateFactory factory = CertificateFactory.getInstance("X.509"); diff --git a/main/src/main/java/io/split/android/client/network/CertificatePin.java b/http-domain/src/main/java/io/split/android/client/network/CertificatePin.java similarity index 84% rename from main/src/main/java/io/split/android/client/network/CertificatePin.java rename to http-domain/src/main/java/io/split/android/client/network/CertificatePin.java index 6056ff7e7..98739d294 100644 --- a/main/src/main/java/io/split/android/client/network/CertificatePin.java +++ b/http-domain/src/main/java/io/split/android/client/network/CertificatePin.java @@ -1,18 +1,14 @@ package io.split.android.client.network; -import com.google.gson.annotations.SerializedName; - import java.util.Arrays; import java.util.Objects; public class CertificatePin { - @SerializedName("pin") private final byte[] mPin; - @SerializedName("algo") private final String mAlgorithm; - CertificatePin(byte[] pin, String algorithm) { + public CertificatePin(byte[] pin, String algorithm) { mPin = pin; mAlgorithm = algorithm; } diff --git a/main/src/main/java/io/split/android/client/network/CertificatePinningConfiguration.java b/http-domain/src/main/java/io/split/android/client/network/CertificatePinningConfiguration.java similarity index 98% rename from main/src/main/java/io/split/android/client/network/CertificatePinningConfiguration.java rename to http-domain/src/main/java/io/split/android/client/network/CertificatePinningConfiguration.java index 23ec94d5c..b110ba5be 100644 --- a/main/src/main/java/io/split/android/client/network/CertificatePinningConfiguration.java +++ b/http-domain/src/main/java/io/split/android/client/network/CertificatePinningConfiguration.java @@ -9,7 +9,6 @@ import java.util.Map; import java.util.Set; -import io.split.android.client.utils.Base64Util; import io.split.android.client.utils.logger.Logger; public class CertificatePinningConfiguration { @@ -160,7 +159,7 @@ public Builder failureListener(@NonNull CertificatePinningFailureListener failur } // Meant to be used only when setting up bg sync jobs - void addPins(String host, Set pins) { + public void addPins(String host, Set pins) { if (host == null || host.trim().isEmpty()) { Logger.e("Host cannot be null or empty. Ignoring entry"); return; diff --git a/main/src/main/java/io/split/android/client/network/CertificatePinningFailureListener.java b/http-domain/src/main/java/io/split/android/client/network/CertificatePinningFailureListener.java similarity index 100% rename from main/src/main/java/io/split/android/client/network/CertificatePinningFailureListener.java rename to http-domain/src/main/java/io/split/android/client/network/CertificatePinningFailureListener.java diff --git a/http-domain/src/main/java/io/split/android/client/network/DefaultBase64Decoder.java b/http-domain/src/main/java/io/split/android/client/network/DefaultBase64Decoder.java new file mode 100644 index 000000000..486eb5be2 --- /dev/null +++ b/http-domain/src/main/java/io/split/android/client/network/DefaultBase64Decoder.java @@ -0,0 +1,20 @@ +package io.split.android.client.network; + +import android.util.Base64; + +import io.split.android.client.utils.logger.Logger; + +public class DefaultBase64Decoder implements Base64Decoder { + + @Override + public byte[] decode(String base64) { + try { + return Base64.decode(base64, Base64.DEFAULT); + } catch (IllegalArgumentException e) { + Logger.e("Received bytes didn't correspond to a valid Base64 encoded string." + e.getLocalizedMessage()); + } catch (Exception e) { + Logger.e("An unknown error has occurred " + e.getLocalizedMessage()); + } + return null; + } +} diff --git a/main/src/main/java/io/split/android/client/network/DevelopmentSslConfig.java b/http-domain/src/main/java/io/split/android/client/network/DevelopmentSslConfig.java similarity index 100% rename from main/src/main/java/io/split/android/client/network/DevelopmentSslConfig.java rename to http-domain/src/main/java/io/split/android/client/network/DevelopmentSslConfig.java diff --git a/main/src/main/java/io/split/android/client/network/HttpProxy.java b/http-domain/src/main/java/io/split/android/client/network/HttpProxy.java similarity index 100% rename from main/src/main/java/io/split/android/client/network/HttpProxy.java rename to http-domain/src/main/java/io/split/android/client/network/HttpProxy.java diff --git a/main/src/main/java/io/split/android/client/network/PinEncoder.java b/http-domain/src/main/java/io/split/android/client/network/PinEncoder.java similarity index 84% rename from main/src/main/java/io/split/android/client/network/PinEncoder.java rename to http-domain/src/main/java/io/split/android/client/network/PinEncoder.java index 3de8beecf..d34212ca8 100644 --- a/main/src/main/java/io/split/android/client/network/PinEncoder.java +++ b/http-domain/src/main/java/io/split/android/client/network/PinEncoder.java @@ -2,7 +2,7 @@ import androidx.annotation.NonNull; -interface PinEncoder { +public interface PinEncoder { @NonNull byte[] encodeCertPin(String algorithm, byte[] encodedPublicKey); diff --git a/main/src/main/java/io/split/android/client/network/PinEncoderImpl.java b/http-domain/src/main/java/io/split/android/client/network/PinEncoderImpl.java similarity index 96% rename from main/src/main/java/io/split/android/client/network/PinEncoderImpl.java rename to http-domain/src/main/java/io/split/android/client/network/PinEncoderImpl.java index 7132b1828..f1e010d51 100644 --- a/main/src/main/java/io/split/android/client/network/PinEncoderImpl.java +++ b/http-domain/src/main/java/io/split/android/client/network/PinEncoderImpl.java @@ -7,7 +7,7 @@ import io.split.android.client.utils.logger.Logger; -class PinEncoderImpl implements PinEncoder { +public class PinEncoderImpl implements PinEncoder { @Override @NonNull diff --git a/main/src/main/java/io/split/android/client/network/ProxyConfiguration.java b/http-domain/src/main/java/io/split/android/client/network/ProxyConfiguration.java similarity index 100% rename from main/src/main/java/io/split/android/client/network/ProxyConfiguration.java rename to http-domain/src/main/java/io/split/android/client/network/ProxyConfiguration.java diff --git a/main/src/main/java/io/split/android/client/network/ProxyCredentialsProvider.java b/http-domain/src/main/java/io/split/android/client/network/ProxyCredentialsProvider.java similarity index 100% rename from main/src/main/java/io/split/android/client/network/ProxyCredentialsProvider.java rename to http-domain/src/main/java/io/split/android/client/network/ProxyCredentialsProvider.java diff --git a/main/src/main/java/io/split/android/client/network/SplitAuthenticator.java b/http-domain/src/main/java/io/split/android/client/network/SplitAuthenticator.java similarity index 81% rename from main/src/main/java/io/split/android/client/network/SplitAuthenticator.java rename to http-domain/src/main/java/io/split/android/client/network/SplitAuthenticator.java index 542ff42dc..494ba736e 100644 --- a/main/src/main/java/io/split/android/client/network/SplitAuthenticator.java +++ b/http-domain/src/main/java/io/split/android/client/network/SplitAuthenticator.java @@ -1,6 +1,6 @@ package io.split.android.client.network; /** @noinspection unused*/ -public abstract class SplitAuthenticator implements Authenticator { +public abstract class SplitAuthenticator implements Authenticator { } diff --git a/main/src/test/java/io/split/android/client/network/CertificateCheckerHelperTest.java b/http-domain/src/test/java/io/split/android/client/network/CertificateCheckerHelperTest.java similarity index 100% rename from main/src/test/java/io/split/android/client/network/CertificateCheckerHelperTest.java rename to http-domain/src/test/java/io/split/android/client/network/CertificateCheckerHelperTest.java diff --git a/main/src/test/java/io/split/android/client/network/CertificatePinningConfigurationTest.java b/http-domain/src/test/java/io/split/android/client/network/CertificatePinningConfigurationTest.java similarity index 100% rename from main/src/test/java/io/split/android/client/network/CertificatePinningConfigurationTest.java rename to http-domain/src/test/java/io/split/android/client/network/CertificatePinningConfigurationTest.java diff --git a/main/src/test/java/io/split/android/client/network/PinEncoderImplTest.java b/http-domain/src/test/java/io/split/android/client/network/PinEncoderImplTest.java similarity index 100% rename from main/src/test/java/io/split/android/client/network/PinEncoderImplTest.java rename to http-domain/src/test/java/io/split/android/client/network/PinEncoderImplTest.java diff --git a/main/src/main/java/io/split/android/client/network/Algorithm.java b/main/src/main/java/io/split/android/client/network/Algorithm.java deleted file mode 100644 index 2e193751f..000000000 --- a/main/src/main/java/io/split/android/client/network/Algorithm.java +++ /dev/null @@ -1,7 +0,0 @@ -package io.split.android.client.network; - -class Algorithm { - - static final String SHA256 = "sha256"; - static final String SHA1 = "sha1"; -} diff --git a/main/src/main/java/io/split/android/client/network/Authenticator.java b/main/src/main/java/io/split/android/client/network/Authenticator.java deleted file mode 100644 index c23a39994..000000000 --- a/main/src/main/java/io/split/android/client/network/Authenticator.java +++ /dev/null @@ -1,9 +0,0 @@ -package io.split.android.client.network; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -interface Authenticator> { - - @Nullable T authenticate(@NonNull T request); -} diff --git a/main/src/main/java/io/split/android/client/network/CertificatePinningConfigurationProvider.java b/main/src/main/java/io/split/android/client/network/CertificatePinningConfigurationProvider.java index aa640fbc5..801baa909 100644 --- a/main/src/main/java/io/split/android/client/network/CertificatePinningConfigurationProvider.java +++ b/main/src/main/java/io/split/android/client/network/CertificatePinningConfigurationProvider.java @@ -1,8 +1,10 @@ package io.split.android.client.network; +import com.google.gson.annotations.SerializedName; import com.google.gson.reflect.TypeToken; import java.lang.reflect.Type; +import java.util.HashSet; import java.util.Map; import java.util.Set; @@ -13,14 +15,18 @@ public class CertificatePinningConfigurationProvider { public static CertificatePinningConfiguration getCertificatePinningConfiguration(String pinsJson) { try { - Type type = new TypeToken>>() { + Type type = new TypeToken>>() { }.getType(); - Map> certificatePins = Json.fromJson(pinsJson, type); + Map> certificatePins = Json.fromJson(pinsJson, type); if (certificatePins != null && !certificatePins.isEmpty()) { CertificatePinningConfiguration.Builder builder = CertificatePinningConfiguration.builder(); - for (Map.Entry> entry : certificatePins.entrySet()) { - builder.addPins(entry.getKey(), entry.getValue()); + for (Map.Entry> entry : certificatePins.entrySet()) { + Set pins = new HashSet<>(); + for (CertificatePinDto dto : entry.getValue()) { + pins.add(new CertificatePin(dto.pin, dto.algorithm)); + } + builder.addPins(entry.getKey(), pins); } return builder @@ -32,4 +38,11 @@ public static CertificatePinningConfiguration getCertificatePinningConfiguration return null; } + + private static class CertificatePinDto { + @SerializedName("pin") + byte[] pin; + @SerializedName("algo") + String algorithm; + } } diff --git a/main/src/main/java/io/split/android/client/network/DefaultBase64Decoder.java b/main/src/main/java/io/split/android/client/network/DefaultBase64Decoder.java deleted file mode 100644 index c84903fb6..000000000 --- a/main/src/main/java/io/split/android/client/network/DefaultBase64Decoder.java +++ /dev/null @@ -1,11 +0,0 @@ -package io.split.android.client.network; - -import io.split.android.client.utils.Base64Util; - -class DefaultBase64Decoder implements Base64Decoder { - - @Override - public byte[] decode(String base64) { - return Base64Util.bytesDecode(base64); - } -} diff --git a/main/src/main/java/io/split/android/client/network/SplitAuthenticatedRequest.java b/main/src/main/java/io/split/android/client/network/SplitAuthenticatedRequest.java index 9b426385c..cddb6370e 100644 --- a/main/src/main/java/io/split/android/client/network/SplitAuthenticatedRequest.java +++ b/main/src/main/java/io/split/android/client/network/SplitAuthenticatedRequest.java @@ -8,7 +8,7 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -public class SplitAuthenticatedRequest implements AuthenticatedRequest { +public class SplitAuthenticatedRequest implements AuthenticatedRequest { private final String mUrl; private final Map mHeaders = new ConcurrentHashMap<>(); diff --git a/main/src/main/java/io/split/android/client/network/SplitBasicAuthenticator.java b/main/src/main/java/io/split/android/client/network/SplitBasicAuthenticator.java index bd49d9ca4..b87c6699f 100644 --- a/main/src/main/java/io/split/android/client/network/SplitBasicAuthenticator.java +++ b/main/src/main/java/io/split/android/client/network/SplitBasicAuthenticator.java @@ -19,7 +19,7 @@ class SplitBasicAuthenticator extends SplitAuthenticator { @Nullable @Override - public SplitAuthenticatedRequest authenticate(@NonNull SplitAuthenticatedRequest request) { + public AuthenticatedRequest authenticate(@NonNull AuthenticatedRequest request) { String credential = basic(mUsername, mPassword); request.setHeader(PROXY_AUTHORIZATION_HEADER, credential); diff --git a/main/src/main/java/io/split/android/client/network/SplitUrlConnectionAuthenticator.java b/main/src/main/java/io/split/android/client/network/SplitUrlConnectionAuthenticator.java index fdb97f302..2c0cd3d5a 100644 --- a/main/src/main/java/io/split/android/client/network/SplitUrlConnectionAuthenticator.java +++ b/main/src/main/java/io/split/android/client/network/SplitUrlConnectionAuthenticator.java @@ -12,7 +12,7 @@ class SplitUrlConnectionAuthenticator { } HttpURLConnection authenticate(HttpURLConnection connection) { - SplitAuthenticatedRequest authenticatedRequest = mProxyAuthenticator.authenticate(new SplitAuthenticatedRequest(connection)); + AuthenticatedRequest authenticatedRequest = mProxyAuthenticator.authenticate(new SplitAuthenticatedRequest(connection)); if (authenticatedRequest != null) { Map headers = authenticatedRequest.getHeaders(); diff --git a/main/src/test/java/io/split/android/client/SplitClientConfigTest.java b/main/src/test/java/io/split/android/client/SplitClientConfigTest.java index b97ea6381..4163818ed 100644 --- a/main/src/test/java/io/split/android/client/SplitClientConfigTest.java +++ b/main/src/test/java/io/split/android/client/SplitClientConfigTest.java @@ -16,6 +16,7 @@ import java.util.concurrent.TimeUnit; import io.split.android.client.fallback.FallbackTreatmentsConfiguration; +import io.split.android.client.network.AuthenticatedRequest; import io.split.android.client.network.CertificatePinningConfiguration; import io.split.android.client.network.ProxyConfiguration; import io.split.android.client.network.SplitAuthenticatedRequest; @@ -298,7 +299,7 @@ public void proxyAuthenticatorAndProxyConfigurationSetLogWarning() { .proxyAuthenticator(new SplitAuthenticator() { @Nullable @Override - public SplitAuthenticatedRequest authenticate(@NonNull SplitAuthenticatedRequest request) { + public AuthenticatedRequest authenticate(@NonNull AuthenticatedRequest request) { return null; } }) diff --git a/main/src/test/java/io/split/android/client/network/HttpClientTest.java b/main/src/test/java/io/split/android/client/network/HttpClientTest.java index 3ecc24ee2..a2f2c8c86 100644 --- a/main/src/test/java/io/split/android/client/network/HttpClientTest.java +++ b/main/src/test/java/io/split/android/client/network/HttpClientTest.java @@ -320,7 +320,7 @@ public MockResponse dispatch(RecordedRequest request) { .setUrlSanitizer(mUrlSanitizerMock) .setProxyAuthenticator(new SplitAuthenticator() { @Override - public SplitAuthenticatedRequest authenticate(@NonNull SplitAuthenticatedRequest request) { + public AuthenticatedRequest authenticate(@NonNull AuthenticatedRequest request) { authLatch.countDown(); request.setHeader("Proxy-Authorization", "my-auth"); @@ -375,7 +375,7 @@ public MockResponse dispatch(RecordedRequest request) { .setUrlSanitizer(mUrlSanitizerMock) .setProxyAuthenticator(new SplitAuthenticator() { @Override - public SplitAuthenticatedRequest authenticate(@NonNull SplitAuthenticatedRequest request) { + public AuthenticatedRequest authenticate(@NonNull AuthenticatedRequest request) { authLatch.countDown(); request.setHeader("Proxy-Authorization", "my-auth"); diff --git a/main/src/test/java/io/split/android/client/network/SplitAuthenticatorTest.java b/main/src/test/java/io/split/android/client/network/SplitAuthenticatorTest.java index 3380c43a1..dae394a09 100644 --- a/main/src/test/java/io/split/android/client/network/SplitAuthenticatorTest.java +++ b/main/src/test/java/io/split/android/client/network/SplitAuthenticatorTest.java @@ -18,9 +18,9 @@ public class SplitAuthenticatorTest { @Test public void authenticatorModifiesHeaders() { - Authenticator> splitAuthenticator = new Authenticator>() { + Authenticator splitAuthenticator = new Authenticator() { @Override - public AuthenticatedRequest authenticate(@NonNull AuthenticatedRequest request) { + public AuthenticatedRequest authenticate(@NonNull AuthenticatedRequest request) { request.setHeader("new-header", "value"); return request; @@ -48,7 +48,7 @@ public AuthenticatedRequest authenticate(@NonNull AuthenticatedRequ assertEquals("value", finalHeaders.get("new-header")); } - private static class AuthenticatedMockRequest implements AuthenticatedRequest { + private static class AuthenticatedMockRequest implements AuthenticatedRequest { private final MockRequest mRequest; diff --git a/main/src/test/java/io/split/android/client/network/SplitBasicAuthenticatorTest.java b/main/src/test/java/io/split/android/client/network/SplitBasicAuthenticatorTest.java index 7b56e0291..5b0f27531 100644 --- a/main/src/test/java/io/split/android/client/network/SplitBasicAuthenticatorTest.java +++ b/main/src/test/java/io/split/android/client/network/SplitBasicAuthenticatorTest.java @@ -29,7 +29,7 @@ public void callingAuthenticateUsesEncoder() { @Test public void callingAuthenticateReturnsCorrectHeaderInRequest() { SplitBasicAuthenticator authenticator = new SplitBasicAuthenticator("user", "pass", mBase64Encoder); - SplitAuthenticatedRequest request = authenticator.authenticate(mock(SplitAuthenticatedRequest.class)); + AuthenticatedRequest request = authenticator.authenticate(mock(SplitAuthenticatedRequest.class)); verify(request).setHeader("Proxy-Authorization", "Basic user:pass"); } From ef7778ba8adcba475289315ea3fc96c76e7588cb Mon Sep 17 00:00:00 2001 From: Gaston Thea Date: Mon, 9 Feb 2026 16:25:35 -0300 Subject: [PATCH 2/3] Http client config --- .../network/HttpClientConfiguration.java | 142 ++++++++++++++++++ .../network/HttpClientConfigurationTest.java | 97 ++++++++++++ 2 files changed, 239 insertions(+) create mode 100644 http-domain/src/main/java/io/split/android/client/network/HttpClientConfiguration.java create mode 100644 http-domain/src/test/java/io/split/android/client/network/HttpClientConfigurationTest.java diff --git a/http-domain/src/main/java/io/split/android/client/network/HttpClientConfiguration.java b/http-domain/src/main/java/io/split/android/client/network/HttpClientConfiguration.java new file mode 100644 index 000000000..6bd6f7d58 --- /dev/null +++ b/http-domain/src/main/java/io/split/android/client/network/HttpClientConfiguration.java @@ -0,0 +1,142 @@ +package io.split.android.client.network; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + + +public class HttpClientConfiguration { + + private final long mConnectionTimeout; + private final long mReadTimeout; + @Nullable + private final HttpProxy mProxy; + @Nullable + private final CertificatePinningConfiguration mCertificatePinningConfiguration; + @Nullable + private final DevelopmentSslConfig mDevelopmentSslConfig; + @Nullable + private final SplitAuthenticator mProxyAuthenticator; + + private HttpClientConfiguration(Builder builder) { + mConnectionTimeout = builder.mConnectionTimeout; + mReadTimeout = builder.mReadTimeout; + mProxy = builder.mProxy; + mCertificatePinningConfiguration = builder.mCertificatePinningConfiguration; + mDevelopmentSslConfig = builder.mDevelopmentSslConfig; + mProxyAuthenticator = builder.mProxyAuthenticator; + } + + public long getConnectionTimeout() { + return mConnectionTimeout; + } + + public long getReadTimeout() { + return mReadTimeout; + } + + @Nullable + public HttpProxy getProxy() { + return mProxy; + } + + @Nullable + public CertificatePinningConfiguration getCertificatePinningConfiguration() { + return mCertificatePinningConfiguration; + } + + @Nullable + public DevelopmentSslConfig getDevelopmentSslConfig() { + return mDevelopmentSslConfig; + } + + @Nullable + public SplitAuthenticator getProxyAuthenticator() { + return mProxyAuthenticator; + } + + @NonNull + public static Builder builder() { + return new Builder(); + } + + public static class Builder { + + private long mConnectionTimeout; + private long mReadTimeout; + @Nullable + private HttpProxy mProxy; + @Nullable + private CertificatePinningConfiguration mCertificatePinningConfiguration; + @Nullable + private DevelopmentSslConfig mDevelopmentSslConfig; + @Nullable + private SplitAuthenticator mProxyAuthenticator; + + private Builder() { + } + + /** + * Sets the connection timeout in milliseconds. + */ + @NonNull + public Builder connectionTimeout(long connectionTimeout) { + mConnectionTimeout = connectionTimeout; + return this; + } + + /** + * Sets the read timeout in milliseconds. + */ + @NonNull + public Builder readTimeout(long readTimeout) { + mReadTimeout = readTimeout; + return this; + } + + /** + * Sets the HTTP proxy configuration. + */ + @NonNull + public Builder proxy(@Nullable HttpProxy proxy) { + mProxy = proxy; + return this; + } + + /** + * Sets the certificate pinning configuration. + */ + @NonNull + public Builder certificatePinningConfiguration(@Nullable CertificatePinningConfiguration configuration) { + mCertificatePinningConfiguration = configuration; + return this; + } + + /** + * Sets the development SSL configuration. + *

+ * This is intended for development/testing environments only. + */ + @NonNull + public Builder developmentSslConfig(@Nullable DevelopmentSslConfig developmentSslConfig) { + mDevelopmentSslConfig = developmentSslConfig; + return this; + } + + /** + * Sets the proxy authenticator. + */ + @NonNull + public Builder proxyAuthenticator(@Nullable SplitAuthenticator proxyAuthenticator) { + mProxyAuthenticator = proxyAuthenticator; + return this; + } + + /** + * Builds the configuration. + */ + @NonNull + public HttpClientConfiguration build() { + return new HttpClientConfiguration(this); + } + } +} diff --git a/http-domain/src/test/java/io/split/android/client/network/HttpClientConfigurationTest.java b/http-domain/src/test/java/io/split/android/client/network/HttpClientConfigurationTest.java new file mode 100644 index 000000000..f722a3439 --- /dev/null +++ b/http-domain/src/test/java/io/split/android/client/network/HttpClientConfigurationTest.java @@ -0,0 +1,97 @@ +package io.split.android.client.network; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; + +import org.junit.Test; + +public class HttpClientConfigurationTest { + + @Test + public void builderSetsConnectionTimeout() { + HttpClientConfiguration config = HttpClientConfiguration.builder() + .connectionTimeout(15_000) + .build(); + + assertEquals(15_000, config.getConnectionTimeout()); + } + + @Test + public void builderSetsReadTimeout() { + HttpClientConfiguration config = HttpClientConfiguration.builder() + .readTimeout(30_000) + .build(); + + assertEquals(30_000, config.getReadTimeout()); + } + + @Test + public void builderSetsProxy() { + HttpProxy proxy = HttpProxy.newBuilder("proxy.example.com", 8080).build(); + HttpClientConfiguration config = HttpClientConfiguration.builder() + .proxy(proxy) + .build(); + + assertNotNull(config.getProxy()); + assertEquals("proxy.example.com", config.getProxy().getHost()); + assertEquals(8080, config.getProxy().getPort()); + } + + @Test + public void builderSetsCertificatePinningConfiguration() { + CertificatePinningConfiguration certConfig = CertificatePinningConfiguration.builder() + .addPin("example.com", "sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=") + .build(); + HttpClientConfiguration config = HttpClientConfiguration.builder() + .certificatePinningConfiguration(certConfig) + .build(); + + assertNotNull(config.getCertificatePinningConfiguration()); + } + + @Test + public void builderSetsDevelopmentSslConfig() { + // DevelopmentSslConfig requires non-null args; just verify null default + HttpClientConfiguration config = HttpClientConfiguration.builder().build(); + assertNull(config.getDevelopmentSslConfig()); + } + + @Test + public void builderSetsProxyAuthenticator() { + HttpClientConfiguration config = HttpClientConfiguration.builder().build(); + assertNull(config.getProxyAuthenticator()); + } + + @Test + public void defaultValuesAreZeroAndNull() { + HttpClientConfiguration config = HttpClientConfiguration.builder().build(); + + assertEquals(0, config.getConnectionTimeout()); + assertEquals(0, config.getReadTimeout()); + assertNull(config.getProxy()); + assertNull(config.getCertificatePinningConfiguration()); + assertNull(config.getDevelopmentSslConfig()); + assertNull(config.getProxyAuthenticator()); + } + + @Test + public void builderSetsAllFields() { + HttpProxy proxy = HttpProxy.newBuilder("proxy.example.com", 8080).build(); + CertificatePinningConfiguration certConfig = CertificatePinningConfiguration.builder() + .addPin("example.com", "sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=") + .build(); + + HttpClientConfiguration config = HttpClientConfiguration.builder() + .connectionTimeout(10_000) + .readTimeout(20_000) + .proxy(proxy) + .certificatePinningConfiguration(certConfig) + .build(); + + assertEquals(10_000, config.getConnectionTimeout()); + assertEquals(20_000, config.getReadTimeout()); + assertNotNull(config.getProxy()); + assertNotNull(config.getCertificatePinningConfiguration()); + } +} From 153daedaa3af5a14606000da25e1e6a2ba781727 Mon Sep 17 00:00:00 2001 From: Gaston Thea Date: Mon, 9 Feb 2026 17:24:22 -0300 Subject: [PATCH 3/3] Fix instrumented test --- .../androidTest/java/tests/integration/ProxyFactoryTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/main/src/androidTest/java/tests/integration/ProxyFactoryTest.java b/main/src/androidTest/java/tests/integration/ProxyFactoryTest.java index 28f80e19d..cfbe02240 100644 --- a/main/src/androidTest/java/tests/integration/ProxyFactoryTest.java +++ b/main/src/androidTest/java/tests/integration/ProxyFactoryTest.java @@ -27,7 +27,7 @@ import io.split.android.client.SplitFactoryBuilder; import io.split.android.client.api.Key; import io.split.android.client.events.SplitEvent; -import io.split.android.client.network.SplitAuthenticatedRequest; +import io.split.android.client.network.AuthenticatedRequest; import io.split.android.client.network.SplitAuthenticator; import io.split.android.client.service.impressions.ImpressionsMode; import io.split.android.client.service.synchronizer.ThreadUtils; @@ -248,7 +248,7 @@ public MockResponse dispatch(RecordedRequest request) { .serviceEndpoints(endpoints) .proxyAuthenticator(new SplitAuthenticator() { @Override - public SplitAuthenticatedRequest authenticate(@NonNull SplitAuthenticatedRequest request) { + public AuthenticatedRequest authenticate(@NonNull AuthenticatedRequest request) { request.setHeader("Proxy-Authorization", "Bearer 1234567890"); return request; }