diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/network/ProgressRequestBody.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/network/ProgressRequestBody.kt index 24d677a7ec3f..c91af6c0576a 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/network/ProgressRequestBody.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/network/ProgressRequestBody.kt @@ -59,7 +59,7 @@ internal class ProgressRequestBody( @Throws(IOException::class) override fun write(data: ByteArray, offset: Int, byteCount: Int) { - super.write(data, offset, byteCount) + out.write(data, offset, byteCount) count += byteCount.toLong() sendProgressUpdate() } diff --git a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/modules/network/ProgressRequestBodyTest.kt b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/modules/network/ProgressRequestBodyTest.kt new file mode 100644 index 000000000000..bc5c90ee7b3e --- /dev/null +++ b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/modules/network/ProgressRequestBodyTest.kt @@ -0,0 +1,48 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +// Conflicting okhttp versions +@file:Suppress("DEPRECATION_ERROR") + +package com.facebook.react.modules.network + +import okhttp3.MediaType +import okhttp3.RequestBody.Companion.toRequestBody +import okio.Buffer +import org.assertj.core.api.Assertions.assertThat +import org.junit.Test + +class ProgressRequestBodyTest { + + @Test + fun testBulkWritesDoNotDoubleCountProgress() { + val content = ByteArray(8 * 1024) { it.toByte() } + val progressUpdates = mutableListOf() + val requestBody = + ProgressRequestBody( + content.toRequestBody(checkNotNull(MediaType.parse("application/octet-stream"))), + ProgressListener { bytesWritten, contentLength, done -> + progressUpdates.add(ProgressUpdate(bytesWritten, contentLength, done)) + }, + ) + val output = Buffer() + + requestBody.writeTo(output) + + assertThat(output.readByteArray()).isEqualTo(content) + assertThat(progressUpdates).isNotEmpty() + assertThat(progressUpdates.maxOf { it.bytesWritten }).isEqualTo(content.size.toLong()) + assertThat(progressUpdates.last()) + .isEqualTo(ProgressUpdate(content.size.toLong(), content.size.toLong(), true)) + } + + private data class ProgressUpdate( + val bytesWritten: Long, + val contentLength: Long, + val done: Boolean, + ) +}