From b124709bf89b72f228968f25842c52ff3f13d205 Mon Sep 17 00:00:00 2001 From: Minh Vu Date: Sun, 9 Aug 2026 21:02:09 +0200 Subject: [PATCH 1/2] fix(android): avoid double-counting upload progress --- .../modules/network/ProgressRequestBody.kt | 2 +- .../network/ProgressRequestBodyTest.kt | 48 +++++++++++++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 packages/react-native/ReactAndroid/src/test/java/com/facebook/react/modules/network/ProgressRequestBodyTest.kt 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..67dedae1bb0e --- /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 +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( + RequestBody.create(checkNotNull(MediaType.parse("application/octet-stream")), content), + 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, + ) +} From 705c44a36a1ca34f33bee4affa497546414bacbd Mon Sep 17 00:00:00 2001 From: Minh Vu Date: Sun, 9 Aug 2026 21:25:39 +0200 Subject: [PATCH 2/2] test(android): use non-deprecated request body factory --- .../facebook/react/modules/network/ProgressRequestBodyTest.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 index 67dedae1bb0e..bc5c90ee7b3e 100644 --- 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 @@ -11,7 +11,7 @@ package com.facebook.react.modules.network import okhttp3.MediaType -import okhttp3.RequestBody +import okhttp3.RequestBody.Companion.toRequestBody import okio.Buffer import org.assertj.core.api.Assertions.assertThat import org.junit.Test @@ -24,7 +24,7 @@ class ProgressRequestBodyTest { val progressUpdates = mutableListOf() val requestBody = ProgressRequestBody( - RequestBody.create(checkNotNull(MediaType.parse("application/octet-stream")), content), + content.toRequestBody(checkNotNull(MediaType.parse("application/octet-stream"))), ProgressListener { bytesWritten, contentLength, done -> progressUpdates.add(ProgressUpdate(bytesWritten, contentLength, done)) },