diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/network/NetworkEventUtil.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/network/NetworkEventUtil.kt index 997b446b7de36a..37254dc974d0e8 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/network/NetworkEventUtil.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/network/NetworkEventUtil.kt @@ -17,16 +17,21 @@ import com.facebook.react.bridge.WritableMap import com.facebook.react.bridge.buildReadableArray import com.facebook.react.common.build.ReactBuildConfig import com.facebook.react.internal.featureflags.ReactNativeFeatureFlags +import java.io.IOException import java.net.SocketTimeoutException import okhttp3.Headers import okhttp3.Protocol import okhttp3.Request +import okhttp3.RequestBody import okhttp3.Response +import okio.Buffer /** * Utility class for reporting network lifecycle events to JavaScript and InspectorNetworkReporter. */ internal object NetworkEventUtil { + private const val MAX_BODY_PREVIEW_SIZE = 512 * 1024 // 512KB + @JvmStatic fun onCreateRequest(devToolsRequestId: String, request: Request) { if (ReactNativeFeatureFlags.enableNetworkEventReporting()) { @@ -35,9 +40,7 @@ internal object NetworkEventUtil { if (ReactBuildConfig.DEBUG) { // Debug build: Process request body for preview (CDP only) - requestBody = - (request.body() as? ProgressRequestBody)?.getBodyPreview() - ?: request.body()?.toString().orEmpty() + request.body()?.let { body -> requestBody = getRequestBodyPreview(body) } } InspectorNetworkReporter.reportRequestStart( @@ -306,4 +309,25 @@ internal object NetworkEventUtil { } return responseHeaders } + + private fun getRequestBodyPreview(requestBody: RequestBody): String { + if (requestBody.isOneShot()) { + return "[Preview unavailable]" + } + + return try { + val buffer = Buffer() + requestBody.writeTo(buffer) + + val size = buffer.size() + if (size <= MAX_BODY_PREVIEW_SIZE) { + buffer.readUtf8() + } else { + buffer.readUtf8(MAX_BODY_PREVIEW_SIZE.toLong()) + "... (truncated, ${size} bytes total)" + } + } catch (e: IOException) { + // Fallback + "[Preview unavailable]" + } + } } 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 c5eb0b9a054e1c..df98bd7eefced6 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 @@ -78,9 +78,4 @@ internal class ProgressRequestBody( } ) } - - fun getBodyPreview(): String { - // TODO: Safely implement request body previews - return "[Preview unavailable]" - } }