From 3a6ca63219ad0358567b9b8995bccacaf06ae485 Mon Sep 17 00:00:00 2001 From: Ryan Brooks Date: Wed, 21 Aug 2024 15:39:16 -0700 Subject: [PATCH] Add gzip compression on reaper report --- .../reaper/ReaperReportUploadWorker.kt | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/reaper/reaper/src/main/kotlin/com/emergetools/reaper/ReaperReportUploadWorker.kt b/reaper/reaper/src/main/kotlin/com/emergetools/reaper/ReaperReportUploadWorker.kt index 64a30c3d..3d2daf6e 100644 --- a/reaper/reaper/src/main/kotlin/com/emergetools/reaper/ReaperReportUploadWorker.kt +++ b/reaper/reaper/src/main/kotlin/com/emergetools/reaper/ReaperReportUploadWorker.kt @@ -23,12 +23,14 @@ import okhttp3.Request import okhttp3.RequestBody.Companion.toRequestBody import okhttp3.Response import okhttp3.internal.closeQuietly +import java.io.ByteArrayOutputStream import java.io.DataInputStream import java.io.EOFException import java.io.File import java.io.FileInputStream import java.io.FileOutputStream import java.io.IOException +import java.util.zip.GZIPOutputStream import kotlin.coroutines.resumeWithException internal class ReaperReportUploadWorker( @@ -175,11 +177,14 @@ internal class ReaperReportUploadWorker( stream.write(reportString.encodeToByteArray()) } + val compressedReport = gzipCompressReport(reportString) + val url = "$baseUrl/report" val request = Request.Builder().apply { header("Authorization", "Bearer $apiKey") + header("Content-Encoding", "gzip") url(url) - post(reportString.toRequestBody("application/json; charset=utf-8".toMediaTypeOrNull())) + post(compressedReport.toRequestBody("application/json; charset=utf-8".toMediaTypeOrNull())) }.build() client.newCall(request).executeAsync().use { response -> @@ -196,6 +201,14 @@ internal class ReaperReportUploadWorker( } } + private fun gzipCompressReport(reportString: String): ByteArray { + val byteArrayOutputStream = ByteArrayOutputStream() + GZIPOutputStream(byteArrayOutputStream).use { gzip -> + gzip.write(reportString.toByteArray()) + } + return byteArrayOutputStream.toByteArray() + } + @OptIn(ExperimentalCoroutinesApi::class) private suspend fun Call.executeAsync(): Response = suspendCancellableCoroutine { continuation -> continuation.invokeOnCancellation {