diff --git a/library/src/main/java/com/chuckerteam/chucker/api/ChuckerInterceptor.kt b/library/src/main/java/com/chuckerteam/chucker/api/ChuckerInterceptor.kt
index 9d603e743..bb5b7f19b 100755
--- a/library/src/main/java/com/chuckerteam/chucker/api/ChuckerInterceptor.kt
+++ b/library/src/main/java/com/chuckerteam/chucker/api/ChuckerInterceptor.kt
@@ -6,19 +6,17 @@ import com.chuckerteam.chucker.internal.data.entity.HttpTransaction
import com.chuckerteam.chucker.internal.support.CacheDirectoryProvider
import com.chuckerteam.chucker.internal.support.DepletingSource
import com.chuckerteam.chucker.internal.support.FileFactory
-import com.chuckerteam.chucker.internal.support.IOUtils
import com.chuckerteam.chucker.internal.support.Logger
import com.chuckerteam.chucker.internal.support.ReportingSink
+import com.chuckerteam.chucker.internal.support.RequestProcessor
import com.chuckerteam.chucker.internal.support.TeeSource
import com.chuckerteam.chucker.internal.support.contentType
import com.chuckerteam.chucker.internal.support.hasBody
import com.chuckerteam.chucker.internal.support.hasSupportedContentEncoding
-import com.chuckerteam.chucker.internal.support.isGzipped
import com.chuckerteam.chucker.internal.support.isProbablyPlainText
import com.chuckerteam.chucker.internal.support.uncompress
import okhttp3.Headers
import okhttp3.Interceptor
-import okhttp3.Request
import okhttp3.Response
import okhttp3.ResponseBody.Companion.asResponseBody
import okio.Buffer
@@ -53,8 +51,8 @@ public class ChuckerInterceptor private constructor(
private val maxContentLength = builder.maxContentLength
private val cacheDirectoryProvider = builder.cacheDirectoryProvider ?: CacheDirectoryProvider { context.filesDir }
private val alwaysReadResponseBody = builder.alwaysReadResponseBody
- private val io = IOUtils(builder.context)
private val headersToRedact = builder.headersToRedact.toMutableSet()
+ private val requestProcessor = RequestProcessor(context, collector, maxContentLength)
/** Adds [headerName] into [headersToRedact] */
public fun redactHeader(vararg headerName: String) {
@@ -63,11 +61,8 @@ public class ChuckerInterceptor private constructor(
@Throws(IOException::class)
override fun intercept(chain: Interceptor.Chain): Response {
- val request = chain.request()
val transaction = HttpTransaction()
-
- processRequest(request, transaction)
- collector.onRequestSent(transaction)
+ val request = requestProcessor.process(chain.request(), transaction)
val response = try {
chain.proceed(request)
@@ -81,39 +76,6 @@ public class ChuckerInterceptor private constructor(
return multiCastResponseBody(response, transaction)
}
- /**
- * Processes a [Request] and populates corresponding fields of a [HttpTransaction].
- */
- private fun processRequest(request: Request, transaction: HttpTransaction) {
- val requestBody = request.body
-
- val encodingIsSupported = request.headers.hasSupportedContentEncoding
-
- transaction.apply {
- setRequestHeaders(request.headers)
- populateUrl(request.url)
-
- isRequestBodyPlainText = encodingIsSupported
- requestDate = System.currentTimeMillis()
- method = request.method
- requestContentType = requestBody?.contentType()?.toString()
- requestPayloadSize = requestBody?.contentLength() ?: 0L
- }
-
- if (requestBody != null && encodingIsSupported) {
- val source = io.getNativeSource(Buffer(), request.isGzipped)
- val buffer = source.buffer
- requestBody.writeTo(buffer)
- val charset = requestBody.contentType()?.charset() ?: UTF_8
- if (buffer.isProbablyPlainText) {
- val content = io.readFromBuffer(buffer, charset, maxContentLength)
- transaction.requestBody = content
- } else {
- transaction.isRequestBodyPlainText = false
- }
- }
- }
-
/**
* Processes [Response] metadata and populates corresponding fields of a [HttpTransaction].
*/
diff --git a/library/src/main/java/com/chuckerteam/chucker/internal/data/entity/HttpTransaction.kt b/library/src/main/java/com/chuckerteam/chucker/internal/data/entity/HttpTransaction.kt
index 3c6d403e1..ca7e49ce9 100644
--- a/library/src/main/java/com/chuckerteam/chucker/internal/data/entity/HttpTransaction.kt
+++ b/library/src/main/java/com/chuckerteam/chucker/internal/data/entity/HttpTransaction.kt
@@ -41,7 +41,7 @@ internal class HttpTransaction(
@ColumnInfo(name = "requestContentType") var requestContentType: String?,
@ColumnInfo(name = "requestHeaders") var requestHeaders: String?,
@ColumnInfo(name = "requestBody") var requestBody: String?,
- @ColumnInfo(name = "isRequestBodyPlainText") var isRequestBodyPlainText: Boolean = true,
+ @ColumnInfo(name = "isRequestBodyPlainText") var isRequestBodyPlainText: Boolean = false,
@ColumnInfo(name = "responseCode") var responseCode: Int?,
@ColumnInfo(name = "responseMessage") var responseMessage: String?,
@ColumnInfo(name = "error") var error: String?,
diff --git a/library/src/main/java/com/chuckerteam/chucker/internal/support/IOUtils.kt b/library/src/main/java/com/chuckerteam/chucker/internal/support/IOUtils.kt
deleted file mode 100644
index a059d7546..000000000
--- a/library/src/main/java/com/chuckerteam/chucker/internal/support/IOUtils.kt
+++ /dev/null
@@ -1,37 +0,0 @@
-package com.chuckerteam.chucker.internal.support
-
-import android.content.Context
-import com.chuckerteam.chucker.R
-import okio.Buffer
-import okio.BufferedSource
-import okio.GzipSource
-import okio.buffer
-import java.io.EOFException
-import java.nio.charset.Charset
-import kotlin.math.min
-
-internal class IOUtils(private val context: Context) {
-
- fun readFromBuffer(buffer: Buffer, charset: Charset, maxContentLength: Long): String {
- val bufferSize = buffer.size
- val maxBytes = min(bufferSize, maxContentLength)
- var body = ""
- try {
- body = buffer.readString(maxBytes, charset)
- } catch (e: EOFException) {
- body += context.getString(R.string.chucker_body_unexpected_eof)
- }
-
- if (bufferSize > maxContentLength) {
- body += context.getString(R.string.chucker_body_content_truncated)
- }
- return body
- }
-
- fun getNativeSource(input: BufferedSource, isGzipped: Boolean): BufferedSource = if (isGzipped) {
- val source = GzipSource(input)
- source.use { it.buffer() }
- } else {
- input
- }
-}
diff --git a/library/src/main/java/com/chuckerteam/chucker/internal/support/LimitingSource.kt b/library/src/main/java/com/chuckerteam/chucker/internal/support/LimitingSource.kt
new file mode 100644
index 000000000..e9162de74
--- /dev/null
+++ b/library/src/main/java/com/chuckerteam/chucker/internal/support/LimitingSource.kt
@@ -0,0 +1,19 @@
+package com.chuckerteam.chucker.internal.support
+
+import okio.Buffer
+import okio.ForwardingSource
+import okio.Source
+
+internal class LimitingSource(
+ delegate: Source,
+ private val bytesCountThreshold: Long,
+) : ForwardingSource(delegate) {
+ private var bytesRead = 0L
+ val isThresholdReached get() = bytesRead >= bytesCountThreshold
+
+ override fun read(sink: Buffer, byteCount: Long) = if (!isThresholdReached) {
+ super.read(sink, byteCount).also { bytesRead += it }
+ } else {
+ -1L
+ }
+}
diff --git a/library/src/main/java/com/chuckerteam/chucker/internal/support/OkHttpUtils.kt b/library/src/main/java/com/chuckerteam/chucker/internal/support/OkHttpUtils.kt
index be46a80fb..023bcbceb 100644
--- a/library/src/main/java/com/chuckerteam/chucker/internal/support/OkHttpUtils.kt
+++ b/library/src/main/java/com/chuckerteam/chucker/internal/support/OkHttpUtils.kt
@@ -1,7 +1,6 @@
package com.chuckerteam.chucker.internal.support
import okhttp3.Headers
-import okhttp3.Request
import okhttp3.Response
import okio.Source
import okio.gzip
@@ -47,18 +46,6 @@ internal val Response.contentType: String?
return this.header("Content-Type")
}
-/** Checks if the OkHttp response uses gzip encoding. */
-internal val Response.isGzipped: Boolean
- get() {
- return this.headers.containsGzip
- }
-
-/** Checks if the OkHttp request uses gzip encoding. */
-internal val Request.isGzipped: Boolean
- get() {
- return this.headers.containsGzip
- }
-
private val Headers.containsGzip: Boolean
get() {
return this["Content-Encoding"].equals("gzip", ignoreCase = true)
diff --git a/library/src/main/java/com/chuckerteam/chucker/internal/support/RequestProcessor.kt b/library/src/main/java/com/chuckerteam/chucker/internal/support/RequestProcessor.kt
new file mode 100644
index 000000000..e5904d473
--- /dev/null
+++ b/library/src/main/java/com/chuckerteam/chucker/internal/support/RequestProcessor.kt
@@ -0,0 +1,66 @@
+package com.chuckerteam.chucker.internal.support
+
+import android.content.Context
+import com.chuckerteam.chucker.R
+import com.chuckerteam.chucker.api.ChuckerCollector
+import com.chuckerteam.chucker.internal.data.entity.HttpTransaction
+import okhttp3.Request
+import okio.Buffer
+import okio.IOException
+import kotlin.text.Charsets.UTF_8
+
+internal class RequestProcessor(
+ private val context: Context,
+ private val collector: ChuckerCollector,
+ private val maxContentLength: Long,
+) {
+ fun process(request: Request, transaction: HttpTransaction): Request {
+ processMetadata(request, transaction)
+ processBody(request, transaction)
+ collector.onRequestSent(transaction)
+ return request
+ }
+
+ private fun processMetadata(request: Request, transaction: HttpTransaction) {
+ transaction.apply {
+ setRequestHeaders(request.headers)
+ populateUrl(request.url)
+
+ requestDate = System.currentTimeMillis()
+ method = request.method
+ requestContentType = request.body?.contentType()?.toString()
+ requestPayloadSize = request.body?.contentLength()
+ }
+ }
+
+ private fun processBody(request: Request, transaction: HttpTransaction) {
+ val body = request.body ?: return
+
+ val isEncodingSupported = request.headers.hasSupportedContentEncoding
+ if (!isEncodingSupported) {
+ return
+ }
+
+ val limitingSource = try {
+ Buffer().apply { body.writeTo(this) }
+ } catch (e: IOException) {
+ Logger.error("Failed to read request payload", e)
+ return
+ }.uncompress(request.headers).let { LimitingSource(it, maxContentLength) }
+
+ val contentBuffer = Buffer().apply { limitingSource.use { writeAll(it) } }
+ if (!contentBuffer.isProbablyPlainText) {
+ return
+ }
+
+ transaction.isRequestBodyPlainText = true
+ try {
+ transaction.requestBody = contentBuffer.readString(body.contentType()?.charset() ?: UTF_8)
+ } catch (e: IOException) {
+ Logger.error("Failed to process request payload", e)
+ }
+ if (limitingSource.isThresholdReached) {
+ transaction.requestBody += context.getString(R.string.chucker_body_content_truncated)
+ }
+ }
+}
diff --git a/library/src/main/res/values/strings.xml b/library/src/main/res/values/strings.xml
index 542795e7d..b73f051e0 100644
--- a/library/src/main/res/values/strings.xml
+++ b/library/src/main/res/values/strings.xml
@@ -37,7 +37,6 @@
(body is empty)
(encoded or binary body omitted)
Search
- \n\n--- Unexpected end of content ---
\n\n--- Content truncated ---
Network
Errors
diff --git a/library/src/test/java/com/chuckerteam/chucker/ChuckerInterceptorDelegate.kt b/library/src/test/java/com/chuckerteam/chucker/ChuckerInterceptorDelegate.kt
index 726f55327..e2129ec6c 100644
--- a/library/src/test/java/com/chuckerteam/chucker/ChuckerInterceptorDelegate.kt
+++ b/library/src/test/java/com/chuckerteam/chucker/ChuckerInterceptorDelegate.kt
@@ -22,7 +22,7 @@ internal class ChuckerInterceptorDelegate(
private val transactions = CopyOnWriteArrayList()
private val mockContext = mockk {
- every { getString(any()) } returns ""
+ every { getString(R.string.chucker_body_content_truncated) } returns "\n\n--- Content truncated ---"
}
private val mockCollector = mockk {
every { onRequestSent(any()) } returns Unit
diff --git a/library/src/test/java/com/chuckerteam/chucker/api/ChuckerInterceptorTest.kt b/library/src/test/java/com/chuckerteam/chucker/api/ChuckerInterceptorTest.kt
index d4e1d7a14..1176301df 100644
--- a/library/src/test/java/com/chuckerteam/chucker/api/ChuckerInterceptorTest.kt
+++ b/library/src/test/java/com/chuckerteam/chucker/api/ChuckerInterceptorTest.kt
@@ -21,6 +21,7 @@ import okio.Buffer
import okio.ByteString
import okio.ByteString.Companion.encodeUtf8
import okio.GzipSink
+import okio.buffer
import org.junit.Rule
import org.junit.jupiter.api.assertThrows
import org.junit.jupiter.api.extension.ExtendWith
@@ -421,5 +422,79 @@ internal class ChuckerInterceptorTest {
assertThat(transaction.isRequestBodyPlainText).isFalse()
}
+ @ParameterizedTest
+ @EnumSource(value = ClientFactory::class)
+ fun requestBody_isAvailableToServer(factory: ClientFactory) {
+ server.enqueue(MockResponse())
+ val client = factory.create(chuckerInterceptor)
+
+ val request = "Hello, world!".toRequestBody().toServerRequest()
+ client.newCall(request).execute().readByteStringBody()
+ val serverRequestContent = server.takeRequest().body.readByteString()
+
+ assertThat(serverRequestContent.utf8()).isEqualTo("Hello, world!")
+ }
+
+ @ParameterizedTest
+ @EnumSource(value = ClientFactory::class)
+ fun plainTextRequestBody_isAvailableToChucker(factory: ClientFactory) {
+ server.enqueue(MockResponse())
+ val client = factory.create(chuckerInterceptor)
+
+ val request = "Hello, world!".toRequestBody().toServerRequest()
+ client.newCall(request).execute().readByteStringBody()
+
+ val transaction = chuckerInterceptor.expectTransaction()
+ assertThat(transaction.isRequestBodyPlainText).isTrue()
+ assertThat(transaction.requestBody).isEqualTo("Hello, world!")
+ assertThat(transaction.requestPayloadSize).isEqualTo(request.body!!.contentLength())
+ }
+
+ @ParameterizedTest
+ @EnumSource(value = ClientFactory::class)
+ fun gzippedRequestBody_isGunzippedForChucker(factory: ClientFactory) {
+ server.enqueue(MockResponse())
+ val client = factory.create(chuckerInterceptor)
+
+ val gzippedBytes = Buffer().apply {
+ GzipSink(this).buffer().use { sink -> sink.writeUtf8("Hello, world!") }
+ }.readByteString()
+ val request = gzippedBytes.toRequestBody().toServerRequest()
+ .newBuilder()
+ .header("Content-Encoding", "gzip")
+ .build()
+ client.newCall(request).execute().readByteStringBody()
+
+ val transaction = chuckerInterceptor.expectTransaction()
+ assertThat(transaction.isRequestBodyPlainText).isTrue()
+ assertThat(transaction.requestBody).isEqualTo("Hello, world!")
+ assertThat(transaction.requestPayloadSize).isEqualTo(request.body!!.contentLength())
+ }
+
+ @ParameterizedTest
+ @EnumSource(value = ClientFactory::class)
+ fun requestBody_isTruncatedToMaxContentLength(factory: ClientFactory) {
+ server.enqueue(MockResponse())
+ val chuckerInterceptor = ChuckerInterceptorDelegate(
+ maxContentLength = SEGMENT_SIZE,
+ cacheDirectoryProvider = { tempDir },
+ )
+ val client = factory.create(chuckerInterceptor)
+
+ val request = "!".repeat(SEGMENT_SIZE.toInt() * 10).toRequestBody().toServerRequest()
+ client.newCall(request).execute().readByteStringBody()
+
+ val transaction = chuckerInterceptor.expectTransaction()
+ assertThat(transaction.isRequestBodyPlainText).isTrue()
+ assertThat(transaction.requestBody).isEqualTo(
+ """
+ ${"!".repeat(SEGMENT_SIZE.toInt())}
+
+ --- Content truncated ---
+ """.trimIndent()
+ )
+ assertThat(transaction.requestPayloadSize).isEqualTo(request.body!!.contentLength())
+ }
+
private fun RequestBody.toServerRequest() = Request.Builder().url(serverUrl).post(this).build()
}
diff --git a/library/src/test/java/com/chuckerteam/chucker/internal/support/IOUtilsTest.kt b/library/src/test/java/com/chuckerteam/chucker/internal/support/IOUtilsTest.kt
deleted file mode 100644
index 64cb2a365..000000000
--- a/library/src/test/java/com/chuckerteam/chucker/internal/support/IOUtilsTest.kt
+++ /dev/null
@@ -1,71 +0,0 @@
-package com.chuckerteam.chucker.internal.support
-
-import android.content.Context
-import com.chuckerteam.chucker.R
-import com.google.common.truth.Truth.assertThat
-import io.mockk.every
-import io.mockk.mockk
-import io.mockk.verify
-import okio.Buffer
-import org.junit.jupiter.api.Test
-import java.io.EOFException
-import java.nio.charset.Charset
-
-internal class IOUtilsTest {
-
- private val mockContext = mockk()
- private val ioUtils = IOUtils(mockContext)
-
- @Test
- fun readFromBuffer_contentNotTruncated() {
- val mockBuffer = mockk()
- every { mockBuffer.size } returns 100L
- every { mockBuffer.readString(any(), any()) } returns "{ \"message\": \"just a mock body\"}"
-
- val result = ioUtils.readFromBuffer(mockBuffer, Charset.defaultCharset(), 200L)
-
- assertThat(result).isEqualTo("{ \"message\": \"just a mock body\"}")
- verify { mockBuffer.readString(100L, Charset.defaultCharset()) }
- }
-
- @Test
- fun readFromBuffer_contentTruncated() {
- val mockBuffer = mockk()
- every { mockBuffer.size } returns 100L
- every { mockBuffer.readString(any(), any()) } returns "{ \"message\": \"just a mock body\"}"
- every { mockContext.getString(R.string.chucker_body_content_truncated) } returns "\\n\\n--- Content truncated ---"
-
- val result = ioUtils.readFromBuffer(mockBuffer, Charset.defaultCharset(), 50L)
-
- assertThat(result).isEqualTo("{ \"message\": \"just a mock body\"}\\n\\n--- Content truncated ---")
- verify { mockBuffer.readString(50L, Charset.defaultCharset()) }
- }
-
- @Test
- fun readFromBuffer_unexpectedEOF() {
- val mockBuffer = mockk()
- every { mockBuffer.size } returns 100L
- every { mockBuffer.readString(any(), any()) } throws EOFException()
- every { mockContext.getString(R.string.chucker_body_unexpected_eof) } returns "\\n\\n--- Unexpected end of content ---"
-
- val result = ioUtils.readFromBuffer(mockBuffer, Charset.defaultCharset(), 200L)
-
- assertThat(result).isEqualTo("\\n\\n--- Unexpected end of content ---")
- }
-
- @Test
- fun getNativeSource_withNotGzipped() {
- val buffer = Buffer()
-
- val nativeSource = ioUtils.getNativeSource(buffer, false)
- assertThat(nativeSource).isEqualTo(buffer)
- }
-
- @Test
- fun getNativeSource_withGzipped() {
- val buffer = Buffer()
-
- val nativeSource = ioUtils.getNativeSource(buffer, true)
- assertThat(nativeSource).isNotEqualTo(buffer)
- }
-}
diff --git a/library/src/test/java/com/chuckerteam/chucker/internal/support/LimitingSourceTest.kt b/library/src/test/java/com/chuckerteam/chucker/internal/support/LimitingSourceTest.kt
new file mode 100644
index 000000000..f54d719d4
--- /dev/null
+++ b/library/src/test/java/com/chuckerteam/chucker/internal/support/LimitingSourceTest.kt
@@ -0,0 +1,65 @@
+package com.chuckerteam.chucker.internal.support
+
+import com.chuckerteam.chucker.SEGMENT_SIZE
+import com.google.common.truth.Truth.assertThat
+import okio.Buffer
+import okio.buffer
+import org.junit.jupiter.api.Test
+
+internal class LimitingSourceTest {
+ @Test
+ fun limitedBytes_doNotExceedLimit() {
+ val content = "!".repeat(10 * SEGMENT_SIZE.toInt())
+ val originalSource = Buffer().writeUtf8(content)
+ val limitingSource = LimitingSource(originalSource, 2 * SEGMENT_SIZE)
+
+ val limitedContent = limitingSource.buffer().readByteString().utf8()
+
+ assertThat(limitedContent).isEqualTo("!".repeat(2 * SEGMENT_SIZE.toInt()))
+ }
+
+ @Test
+ fun originalBytes_areNotDepleted() {
+ val content = "!".repeat(10 * SEGMENT_SIZE.toInt())
+ val originalSource = Buffer().writeUtf8(content)
+ val limitingSource = LimitingSource(originalSource, 2 * SEGMENT_SIZE)
+
+ limitingSource.buffer().readByteString()
+ val originalContent = originalSource.buffer.readByteString().utf8()
+
+ assertThat(originalContent).isEqualTo("!".repeat(8 * SEGMENT_SIZE.toInt()))
+ }
+
+ @Test
+ fun bytesLimitIsNotReached_whenBelowThreshold() {
+ val content = "!".repeat(3 * SEGMENT_SIZE.toInt())
+ val originalSource = Buffer().writeUtf8(content)
+ val limitingSource = LimitingSource(originalSource, 4 * SEGMENT_SIZE)
+
+ limitingSource.buffer().readByteString()
+
+ assertThat(limitingSource.isThresholdReached).isFalse()
+ }
+
+ @Test
+ fun bytesLimitIsReached_whenEqualToThreshold() {
+ val content = "!".repeat(3 * SEGMENT_SIZE.toInt())
+ val originalSource = Buffer().writeUtf8(content)
+ val limitingSource = LimitingSource(originalSource, 3 * SEGMENT_SIZE)
+
+ limitingSource.buffer().readByteString()
+
+ assertThat(limitingSource.isThresholdReached).isTrue()
+ }
+
+ @Test
+ fun bytesLimitIsReached_whenAboveThreshold() {
+ val content = "!".repeat(3 * SEGMENT_SIZE.toInt())
+ val originalSource = Buffer().writeUtf8(content)
+ val limitingSource = LimitingSource(originalSource, 2 * SEGMENT_SIZE)
+
+ limitingSource.buffer().readByteString()
+
+ assertThat(limitingSource.isThresholdReached).isTrue()
+ }
+}
diff --git a/library/src/test/java/com/chuckerteam/chucker/internal/support/OkHttpUtilsTest.kt b/library/src/test/java/com/chuckerteam/chucker/internal/support/OkHttpUtilsTest.kt
index fc4831490..9c0329342 100644
--- a/library/src/test/java/com/chuckerteam/chucker/internal/support/OkHttpUtilsTest.kt
+++ b/library/src/test/java/com/chuckerteam/chucker/internal/support/OkHttpUtilsTest.kt
@@ -5,7 +5,6 @@ import io.mockk.every
import io.mockk.mockk
import okhttp3.Headers
import okhttp3.Headers.Companion.headersOf
-import okhttp3.Request
import okhttp3.Response
import okio.Buffer
import okio.BufferedSource
@@ -45,38 +44,6 @@ internal class OkHttpUtilsTest {
assertThat(mockResponse.isChunked).isTrue()
}
- @Test
- fun responseIsGzipped_withOtherEncoding_returnsTrue() {
- val mockResponse = mockk()
- every { mockResponse.headers } returns headersOf("Content-Encoding", "gzip")
-
- assertThat(mockResponse.isGzipped).isTrue()
- }
-
- @Test
- fun responseIsGzipped_withOtherEncoding_returnsFalse() {
- val mockResponse = mockk()
- every { mockResponse.headers } returns headersOf("Content-Encoding", "identity")
-
- assertThat(mockResponse.isGzipped).isFalse()
- }
-
- @Test
- fun requestIsGzipped_withOtherEncoding_returnsTrue() {
- val mockRequest = mockk()
- every { mockRequest.headers } returns headersOf("Content-Encoding", "gzip")
-
- assertThat(mockRequest.isGzipped).isTrue()
- }
-
- @Test
- fun requestIsGzipped_withOtherEncoding_returnsFalse() {
- val mockRequest = mockk()
- every { mockRequest.headers } returns headersOf("Content-Encoding", "identity")
-
- assertThat(mockRequest.isGzipped).isFalse()
- }
-
@Test
fun uncompressSource_withGzippedContent() {
val content = "Hello there!"