Skip to content

Commit ef7778b

Browse files
committed
Http client config
1 parent b168028 commit ef7778b

File tree

2 files changed

+239
-0
lines changed

2 files changed

+239
-0
lines changed
Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
package io.split.android.client.network;
2+
3+
import androidx.annotation.NonNull;
4+
import androidx.annotation.Nullable;
5+
6+
7+
public class HttpClientConfiguration {
8+
9+
private final long mConnectionTimeout;
10+
private final long mReadTimeout;
11+
@Nullable
12+
private final HttpProxy mProxy;
13+
@Nullable
14+
private final CertificatePinningConfiguration mCertificatePinningConfiguration;
15+
@Nullable
16+
private final DevelopmentSslConfig mDevelopmentSslConfig;
17+
@Nullable
18+
private final SplitAuthenticator mProxyAuthenticator;
19+
20+
private HttpClientConfiguration(Builder builder) {
21+
mConnectionTimeout = builder.mConnectionTimeout;
22+
mReadTimeout = builder.mReadTimeout;
23+
mProxy = builder.mProxy;
24+
mCertificatePinningConfiguration = builder.mCertificatePinningConfiguration;
25+
mDevelopmentSslConfig = builder.mDevelopmentSslConfig;
26+
mProxyAuthenticator = builder.mProxyAuthenticator;
27+
}
28+
29+
public long getConnectionTimeout() {
30+
return mConnectionTimeout;
31+
}
32+
33+
public long getReadTimeout() {
34+
return mReadTimeout;
35+
}
36+
37+
@Nullable
38+
public HttpProxy getProxy() {
39+
return mProxy;
40+
}
41+
42+
@Nullable
43+
public CertificatePinningConfiguration getCertificatePinningConfiguration() {
44+
return mCertificatePinningConfiguration;
45+
}
46+
47+
@Nullable
48+
public DevelopmentSslConfig getDevelopmentSslConfig() {
49+
return mDevelopmentSslConfig;
50+
}
51+
52+
@Nullable
53+
public SplitAuthenticator getProxyAuthenticator() {
54+
return mProxyAuthenticator;
55+
}
56+
57+
@NonNull
58+
public static Builder builder() {
59+
return new Builder();
60+
}
61+
62+
public static class Builder {
63+
64+
private long mConnectionTimeout;
65+
private long mReadTimeout;
66+
@Nullable
67+
private HttpProxy mProxy;
68+
@Nullable
69+
private CertificatePinningConfiguration mCertificatePinningConfiguration;
70+
@Nullable
71+
private DevelopmentSslConfig mDevelopmentSslConfig;
72+
@Nullable
73+
private SplitAuthenticator mProxyAuthenticator;
74+
75+
private Builder() {
76+
}
77+
78+
/**
79+
* Sets the connection timeout in milliseconds.
80+
*/
81+
@NonNull
82+
public Builder connectionTimeout(long connectionTimeout) {
83+
mConnectionTimeout = connectionTimeout;
84+
return this;
85+
}
86+
87+
/**
88+
* Sets the read timeout in milliseconds.
89+
*/
90+
@NonNull
91+
public Builder readTimeout(long readTimeout) {
92+
mReadTimeout = readTimeout;
93+
return this;
94+
}
95+
96+
/**
97+
* Sets the HTTP proxy configuration.
98+
*/
99+
@NonNull
100+
public Builder proxy(@Nullable HttpProxy proxy) {
101+
mProxy = proxy;
102+
return this;
103+
}
104+
105+
/**
106+
* Sets the certificate pinning configuration.
107+
*/
108+
@NonNull
109+
public Builder certificatePinningConfiguration(@Nullable CertificatePinningConfiguration configuration) {
110+
mCertificatePinningConfiguration = configuration;
111+
return this;
112+
}
113+
114+
/**
115+
* Sets the development SSL configuration.
116+
* <p>
117+
* This is intended for development/testing environments only.
118+
*/
119+
@NonNull
120+
public Builder developmentSslConfig(@Nullable DevelopmentSslConfig developmentSslConfig) {
121+
mDevelopmentSslConfig = developmentSslConfig;
122+
return this;
123+
}
124+
125+
/**
126+
* Sets the proxy authenticator.
127+
*/
128+
@NonNull
129+
public Builder proxyAuthenticator(@Nullable SplitAuthenticator proxyAuthenticator) {
130+
mProxyAuthenticator = proxyAuthenticator;
131+
return this;
132+
}
133+
134+
/**
135+
* Builds the configuration.
136+
*/
137+
@NonNull
138+
public HttpClientConfiguration build() {
139+
return new HttpClientConfiguration(this);
140+
}
141+
}
142+
}
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
package io.split.android.client.network;
2+
3+
import static org.junit.Assert.assertEquals;
4+
import static org.junit.Assert.assertNotNull;
5+
import static org.junit.Assert.assertNull;
6+
7+
import org.junit.Test;
8+
9+
public class HttpClientConfigurationTest {
10+
11+
@Test
12+
public void builderSetsConnectionTimeout() {
13+
HttpClientConfiguration config = HttpClientConfiguration.builder()
14+
.connectionTimeout(15_000)
15+
.build();
16+
17+
assertEquals(15_000, config.getConnectionTimeout());
18+
}
19+
20+
@Test
21+
public void builderSetsReadTimeout() {
22+
HttpClientConfiguration config = HttpClientConfiguration.builder()
23+
.readTimeout(30_000)
24+
.build();
25+
26+
assertEquals(30_000, config.getReadTimeout());
27+
}
28+
29+
@Test
30+
public void builderSetsProxy() {
31+
HttpProxy proxy = HttpProxy.newBuilder("proxy.example.com", 8080).build();
32+
HttpClientConfiguration config = HttpClientConfiguration.builder()
33+
.proxy(proxy)
34+
.build();
35+
36+
assertNotNull(config.getProxy());
37+
assertEquals("proxy.example.com", config.getProxy().getHost());
38+
assertEquals(8080, config.getProxy().getPort());
39+
}
40+
41+
@Test
42+
public void builderSetsCertificatePinningConfiguration() {
43+
CertificatePinningConfiguration certConfig = CertificatePinningConfiguration.builder()
44+
.addPin("example.com", "sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=")
45+
.build();
46+
HttpClientConfiguration config = HttpClientConfiguration.builder()
47+
.certificatePinningConfiguration(certConfig)
48+
.build();
49+
50+
assertNotNull(config.getCertificatePinningConfiguration());
51+
}
52+
53+
@Test
54+
public void builderSetsDevelopmentSslConfig() {
55+
// DevelopmentSslConfig requires non-null args; just verify null default
56+
HttpClientConfiguration config = HttpClientConfiguration.builder().build();
57+
assertNull(config.getDevelopmentSslConfig());
58+
}
59+
60+
@Test
61+
public void builderSetsProxyAuthenticator() {
62+
HttpClientConfiguration config = HttpClientConfiguration.builder().build();
63+
assertNull(config.getProxyAuthenticator());
64+
}
65+
66+
@Test
67+
public void defaultValuesAreZeroAndNull() {
68+
HttpClientConfiguration config = HttpClientConfiguration.builder().build();
69+
70+
assertEquals(0, config.getConnectionTimeout());
71+
assertEquals(0, config.getReadTimeout());
72+
assertNull(config.getProxy());
73+
assertNull(config.getCertificatePinningConfiguration());
74+
assertNull(config.getDevelopmentSslConfig());
75+
assertNull(config.getProxyAuthenticator());
76+
}
77+
78+
@Test
79+
public void builderSetsAllFields() {
80+
HttpProxy proxy = HttpProxy.newBuilder("proxy.example.com", 8080).build();
81+
CertificatePinningConfiguration certConfig = CertificatePinningConfiguration.builder()
82+
.addPin("example.com", "sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=")
83+
.build();
84+
85+
HttpClientConfiguration config = HttpClientConfiguration.builder()
86+
.connectionTimeout(10_000)
87+
.readTimeout(20_000)
88+
.proxy(proxy)
89+
.certificatePinningConfiguration(certConfig)
90+
.build();
91+
92+
assertEquals(10_000, config.getConnectionTimeout());
93+
assertEquals(20_000, config.getReadTimeout());
94+
assertNotNull(config.getProxy());
95+
assertNotNull(config.getCertificatePinningConfiguration());
96+
}
97+
}

0 commit comments

Comments
 (0)