Skip to content

Commit 95aa864

Browse files
authored
Http 2 client (#281)
* create OkHttpURLConnection * simplify * bypass all public methods * make okHttpClient customizable * refactor * add unit tests * auto convert to post when getOutput is called * remove gzip from OkHttpURLConnection.kt * embed okhttp * fix failed tests * fix failed tests * fix flaky tests * fix flaky tests * add tests to verify connection is http2 * refactor to avoid redundant code * fix flaky tests
1 parent abe517c commit 95aa864

File tree

9 files changed

+1354
-12
lines changed

9 files changed

+1354
-12
lines changed

android/src/test/java/com/segment/analytics/kotlin/android/AndroidContextCollectorTests.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,9 @@ class AndroidContextCollectorTests {
8282
}
8383
assertTrue(this.containsKey("device"))
8484
this["device"]?.jsonObject?.let {
85-
assertEquals("unknown", it["id"].asString())
85+
it["id"].asString().let { id ->
86+
assertTrue(id == "unknown" || id == "")
87+
}
8688
assertEquals("robolectric", it["manufacturer"].asString())
8789
assertEquals("robolectric", it["model"].asString())
8890
assertEquals("robolectric", it["name"].asString())

core/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ dependencies {
2525
// MAIN DEPS
2626
api 'com.segment:sovran-kotlin:1.2.2'
2727
api "org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.1"
28+
api 'com.squareup.okhttp3:okhttp:4.12.0'
2829
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1'
2930

3031
// TESTING

core/src/main/java/com/segment/analytics/kotlin/core/HTTPClient.kt

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package com.segment.analytics.kotlin.core
22

33
import com.segment.analytics.kotlin.core.Constants.LIBRARY_VERSION
4+
import com.segment.analytics.kotlin.core.utilities.OkHttpURLConnection
5+
import okhttp3.OkHttpClient
6+
import okhttp3.Protocol
47
import java.io.BufferedReader
58
import java.io.Closeable
69
import java.io.IOException
@@ -9,7 +12,9 @@ import java.io.OutputStream
912
import java.net.HttpURLConnection
1013
import java.net.MalformedURLException
1114
import java.net.URL
15+
import java.util.concurrent.TimeUnit
1216
import java.util.zip.GZIPOutputStream
17+
1318
class HTTPClient(
1419
private val writeKey: String,
1520
private val requestFactory: RequestFactory = RequestFactory()
@@ -138,7 +143,15 @@ internal class HTTPException(
138143
}
139144
}
140145

141-
open class RequestFactory {
146+
open class RequestFactory(
147+
httpClient: OkHttpClient? = null
148+
) {
149+
private val okHttpClient = httpClient ?: OkHttpClient.Builder()
150+
.protocols(listOf(Protocol.HTTP_2, Protocol.HTTP_1_1))
151+
.connectTimeout(15, TimeUnit.SECONDS)
152+
.readTimeout(20, TimeUnit.SECONDS)
153+
.build()
154+
142155
open fun settings(cdnHost: String, writeKey: String): HttpURLConnection {
143156
val connection: HttpURLConnection = openConnection("https://$cdnHost/projects/$writeKey/settings")
144157
connection.setRequestProperty("Content-Type", "application/json; charset=utf-8")
@@ -170,9 +183,9 @@ open class RequestFactory {
170183
Analytics.reportInternalError(error)
171184
throw error
172185
}
173-
val connection = requestedURL.openConnection() as HttpURLConnection
186+
val connection = requestedURL.openOkHttpConnection() as HttpURLConnection
174187
connection.connectTimeout = 15_000 // 15s
175-
connection.readTimeout = 20_1000 // 20s
188+
connection.readTimeout = 20_000 // 20s
176189

177190
connection.setRequestProperty(
178191
"User-Agent",
@@ -181,4 +194,8 @@ open class RequestFactory {
181194
connection.doInput = true
182195
return connection
183196
}
197+
198+
private fun URL.openOkHttpConnection(): OkHttpURLConnection {
199+
return OkHttpURLConnection(this, okHttpClient)
200+
}
184201
}

0 commit comments

Comments
 (0)