Skip to content

Commit 8490569

Browse files
committed
switch to /b endpoint
1 parent a478728 commit 8490569

File tree

9 files changed

+42
-95
lines changed

9 files changed

+42
-95
lines changed

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

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
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.encodeToBase64
54
import java.io.BufferedReader
65
import java.io.Closeable
76
import java.io.IOException
@@ -13,11 +12,11 @@ import java.net.URL
1312
import java.util.zip.GZIPOutputStream
1413

1514
class HTTPClient(private val writeKey: String) {
16-
internal val authHeader = authorizationHeader(writeKey)
1715

1816
fun settings(cdnHost: String): Connection {
1917
val connection: HttpURLConnection =
2018
openConnection("https://$cdnHost/projects/$writeKey/settings")
19+
connection.setRequestProperty("Content-Type", "application/json; charset=utf-8")
2120
val responseCode = connection.responseCode
2221
if (responseCode != HttpURLConnection.HTTP_OK) {
2322
connection.disconnect()
@@ -27,19 +26,14 @@ class HTTPClient(private val writeKey: String) {
2726
}
2827

2928
fun upload(apiHost: String): Connection {
30-
val connection: HttpURLConnection = openConnection("https://$apiHost/batch")
31-
connection.setRequestProperty("Authorization", authHeader)
29+
val connection: HttpURLConnection = openConnection("https://$apiHost/b")
30+
connection.setRequestProperty("Content-Type", "text/plain")
3231
connection.setRequestProperty("Content-Encoding", "gzip")
3332
connection.doOutput = true
3433
connection.setChunkedStreamingMode(0)
3534
return connection.createPostConnection()
3635
}
3736

38-
private fun authorizationHeader(writeKey: String): String {
39-
val auth = "$writeKey:"
40-
return "Basic ${encodeToBase64(auth)}"
41-
}
42-
4337
/**
4438
* Configures defaults for connections opened with [.upload], and [ ][.projectSettings].
4539
*/
@@ -54,7 +48,6 @@ class HTTPClient(private val writeKey: String) {
5448
connection.connectTimeout = 15_000 // 15s
5549
connection.readTimeout = 20_1000 // 20s
5650

57-
connection.setRequestProperty("Content-Type", "application/json; charset=utf-8")
5851
connection.setRequestProperty(
5952
"User-Agent",
6053
"analytics-kotlin/$LIBRARY_VERSION"

core/src/main/java/com/segment/analytics/kotlin/core/platform/plugins/DestinationMetadataPlugin.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ import kotlinx.serialization.json.JsonArray
1212
import kotlinx.serialization.json.add
1313
import kotlinx.serialization.json.buildJsonArray
1414

15+
/**
16+
* DestinationMetadataPlugin adds `_metadata` information to payloads that Segment uses to
17+
* determine delivery of events to cloud/device-mode destinations
18+
*/
1519
class DestinationMetadataPlugin : Plugin {
1620
override val type: Plugin.Type = Plugin.Type.Enrichment
1721
override lateinit var analytics: Analytics

core/src/main/java/com/segment/analytics/kotlin/core/utilities/Base64Utils.kt

Lines changed: 0 additions & 44 deletions
This file was deleted.

core/src/main/java/com/segment/analytics/kotlin/core/utilities/EventsFileManager.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ class EventsFileManager(
134134
return
135135
}
136136
// close events array and batch object
137-
val contents = """],"sentAt":"${Instant.now()}"}"""
137+
val contents = """],"sentAt":"${Instant.now()}","writeKey":"$writeKey"}"""
138138
writeToFile(contents.toByteArray(), file)
139139
file.renameTo(File(directory, file.nameWithoutExtension))
140140
os?.close()

core/src/test/kotlin/com/segment/analytics/kotlin/core/HTTPClientTests.kt

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@ import com.segment.analytics.kotlin.core.Constants.LIBRARY_VERSION
44
import io.mockk.clearConstructorMockk
55
import io.mockk.every
66
import io.mockk.spyk
7-
import org.junit.jupiter.api.Assertions.*
7+
import org.junit.jupiter.api.Assertions.assertEquals
8+
import org.junit.jupiter.api.Assertions.assertTrue
9+
import org.junit.jupiter.api.Assertions.fail
810
import org.junit.jupiter.api.Test
911
import org.junit.jupiter.api.TestInstance
1012
import java.io.IOException
@@ -21,11 +23,6 @@ class HTTPClientTests {
2123
httpClient = HTTPClient("1vNgUqwJeCHmqgI9S1sOm9UHCyfYqbaQ")
2224
}
2325

24-
@Test
25-
fun `authHeader is correctly computed`() {
26-
assertEquals("Basic MXZOZ1Vxd0plQ0htcWdJOVMxc09tOVVIQ3lmWXFiYVE6", httpClient.authHeader)
27-
}
28-
2926
@Test
3027
fun `upload connection has correct configuration`() {
3128
httpClient.settings("cdn-settings.segment.com/v1").connection.let {
@@ -44,14 +41,15 @@ class HTTPClientTests {
4441
fun `settings connection has correct configuration`() {
4542
httpClient.upload("api.segment.io/v1").connection.let {
4643
assertEquals(
47-
"https://api.segment.io/v1/batch",
44+
"https://api.segment.io/v1/b",
4845
it.url.toString()
4946
)
5047
assertEquals(
5148
"analytics-kotlin/$LIBRARY_VERSION",
5249
it.getRequestProperty("User-Agent")
5350
)
5451
assertEquals("gzip", it.getRequestProperty("Content-Encoding"))
52+
assertEquals("text/plain", it.getRequestProperty("Content-Type"))
5553
// ideally we would also test if auth Header is set, but due to security concerns this
5654
// is not possible https://bit.ly/3CVpR3J
5755
}

core/src/test/kotlin/com/segment/analytics/kotlin/core/platform/plugins/SegmentDestinationTests.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,9 +184,10 @@ class SegmentDestinationTests {
184184
verify(timeout = 2000) { connection.close() }
185185
with(String(outputBytes)) {
186186
val contentsJson: JsonObject = Json.decodeFromString(this)
187-
assertEquals(2, contentsJson.size)
187+
assertEquals(3, contentsJson.size) // batch, sentAt, writeKey
188188
assertTrue(contentsJson.containsKey("batch"))
189189
assertTrue(contentsJson.containsKey("sentAt"))
190+
assertTrue(contentsJson.containsKey("writeKey"))
190191
assertEquals(1, contentsJson["batch"]?.jsonArray?.size)
191192
val eventInFile = contentsJson["batch"]?.jsonArray?.get(0)
192193
val eventInFile2 =

core/src/test/kotlin/com/segment/analytics/kotlin/core/utilities/Base64UtilsTest.kt

Lines changed: 0 additions & 21 deletions
This file was deleted.

core/src/test/kotlin/com/segment/analytics/kotlin/core/utilities/EventsFileManagerTest.kt

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,15 @@ import kotlinx.coroutines.runBlocking
88
import kotlinx.serialization.encodeToString
99
import kotlinx.serialization.json.buildJsonObject
1010
import kotlinx.serialization.json.put
11-
import org.junit.jupiter.api.Assertions.*
11+
import org.junit.jupiter.api.Assertions.assertEquals
12+
import org.junit.jupiter.api.Assertions.assertFalse
13+
import org.junit.jupiter.api.Assertions.assertTrue
1214
import org.junit.jupiter.api.BeforeEach
1315
import org.junit.jupiter.api.Test
1416
import java.io.File
1517
import java.io.FileOutputStream
1618
import java.time.Instant
17-
import java.util.*
19+
import java.util.Date
1820

1921
internal class EventsFileManagerTest{
2022
private val epochTimestamp = Date(0).toInstant().toString()
@@ -134,7 +136,7 @@ internal class EventsFileManagerTest{
134136
file.rollover()
135137
val fileUrls = file.read()
136138
assertEquals(1, fileUrls.size)
137-
val expectedContents = """ {"batch":[${eventString}],"sentAt":"$epochTimestamp"} """.trim()
139+
val expectedContents = """ {"batch":[${eventString}],"sentAt":"$epochTimestamp","writeKey":"123"}""".trim()
138140
val newFile = File(directory, "123-0")
139141
assertTrue(newFile.exists())
140142
val actualContents = newFile.readText()
@@ -161,7 +163,7 @@ internal class EventsFileManagerTest{
161163
file.read().let {
162164
assertEquals(1, it.size)
163165
val expectedContents =
164-
""" {"batch":[${eventString}],"sentAt":"$epochTimestamp"} """.trim()
166+
""" {"batch":[${eventString}],"sentAt":"$epochTimestamp","writeKey":"123"}""".trim()
165167
val newFile = File(directory, "123-0")
166168
assertTrue(newFile.exists())
167169
val actualContents = newFile.readText()

core/src/test/kotlin/com/segment/analytics/kotlin/core/utilities/StorageImplTest.kt

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,34 @@
11
package com.segment.analytics.kotlin.core.utilities
22

3-
import com.segment.analytics.kotlin.core.*
3+
import com.segment.analytics.kotlin.core.Configuration
4+
import com.segment.analytics.kotlin.core.Settings
5+
import com.segment.analytics.kotlin.core.Storage
6+
import com.segment.analytics.kotlin.core.System
7+
import com.segment.analytics.kotlin.core.TrackEvent
8+
import com.segment.analytics.kotlin.core.UserInfo
9+
import com.segment.analytics.kotlin.core.emptyJsonObject
410
import com.segment.analytics.kotlin.core.utils.clearPersistentStorage
511
import com.segment.analytics.kotlin.core.utils.spyStore
612
import kotlinx.coroutines.runBlocking
713
import kotlinx.coroutines.test.TestCoroutineDispatcher
814
import kotlinx.coroutines.test.TestCoroutineScope
915
import kotlinx.serialization.decodeFromString
1016
import kotlinx.serialization.encodeToString
11-
import kotlinx.serialization.json.*
12-
import org.junit.jupiter.api.Assertions.*
17+
import kotlinx.serialization.json.Json
18+
import kotlinx.serialization.json.JsonObject
19+
import kotlinx.serialization.json.buildJsonObject
20+
import kotlinx.serialization.json.jsonArray
21+
import kotlinx.serialization.json.put
22+
import org.junit.jupiter.api.Assertions.assertEquals
23+
import org.junit.jupiter.api.Assertions.assertNotNull
24+
import org.junit.jupiter.api.Assertions.assertNull
25+
import org.junit.jupiter.api.Assertions.assertTrue
1326
import org.junit.jupiter.api.BeforeEach
1427
import org.junit.jupiter.api.Nested
1528
import org.junit.jupiter.api.Test
1629
import sovran.kotlin.Action
17-
import sovran.kotlin.Store
1830
import java.io.File
19-
import java.util.*
31+
import java.util.Date
2032

2133
internal class StorageImplTest {
2234

@@ -177,9 +189,10 @@ internal class StorageImplTest {
177189
fileUrl!!.let {
178190
val contentsStr = File(it).inputStream().readBytes().toString(Charsets.UTF_8)
179191
val contentsJson: JsonObject = Json.decodeFromString(contentsStr)
180-
assertEquals(2, contentsJson.size)
192+
assertEquals(3, contentsJson.size) // batch, sentAt, writeKey
181193
assertTrue(contentsJson.containsKey("batch"))
182194
assertTrue(contentsJson.containsKey("sentAt"))
195+
assertTrue(contentsJson.containsKey("writeKey"))
183196
assertEquals(1, contentsJson["batch"]?.jsonArray?.size)
184197
val eventInFile = contentsJson["batch"]?.jsonArray?.get(0)
185198
val eventInFile2 = Json.decodeFromString(
@@ -229,9 +242,10 @@ internal class StorageImplTest {
229242
fileUrl!!.let {
230243
val contentsStr = File(it).inputStream().readBytes().toString(Charsets.UTF_8)
231244
val contentsJson: JsonObject = Json.decodeFromString(contentsStr)
232-
assertEquals(2, contentsJson.size)
245+
assertEquals(3, contentsJson.size) // batch, sentAt, writeKey
233246
assertTrue(contentsJson.containsKey("batch"))
234247
assertTrue(contentsJson.containsKey("sentAt"))
248+
assertTrue(contentsJson.containsKey("writeKey"))
235249
assertEquals(2, contentsJson["batch"]?.jsonArray?.size)
236250
val eventInFile = contentsJson["batch"]?.jsonArray?.get(0)
237251
val eventInFile2 = Json.decodeFromString(

0 commit comments

Comments
 (0)