From dd51b38101a329abdf5edb9218e4bcda585c48eb Mon Sep 17 00:00:00 2001 From: Pieter De Baets Date: Mon, 29 Apr 2024 21:10:28 -0700 Subject: [PATCH] Fix missing close for canceled bundle downloads Summary: `Response` is `Closeable`, so we must close it even if the download is no longer relevant. Found while running with StrictMode enabled and reloading quickly multiple times. Changelog: [Internal] Reviewed By: NickGerleman Differential Revision: D56629079 fbshipit-source-id: 041bf295313cbf78b7f2bb6580c50fdc2a324728 --- .../react/devsupport/BundleDownloader.java | 26 +++++++++---------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/BundleDownloader.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/BundleDownloader.java index 6a4b50e04ad..f1e317a3f8c 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/BundleDownloader.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/BundleDownloader.java @@ -105,7 +105,6 @@ public class BundleDownloader { final String bundleURL, final @Nullable BundleInfo bundleInfo, Request.Builder requestBuilder) { - final Request request = requestBuilder.url(bundleURL).addHeader("Accept", "multipart/mixed").build(); mDownloadBundleFromURLCall = Assertions.assertNotNull(mClient.newCall(request)); @@ -129,20 +128,19 @@ public class BundleDownloader { @Override public void onResponse(Call call, final Response response) throws IOException { - // ignore callback if call was cancelled - if (mDownloadBundleFromURLCall == null || mDownloadBundleFromURLCall.isCanceled()) { - mDownloadBundleFromURLCall = null; - return; - } - mDownloadBundleFromURLCall = null; - - final String url = response.request().url().toString(); - - // Make sure the result is a multipart response and parse the boundary. - String contentType = response.header("content-type"); - Pattern regex = Pattern.compile("multipart/mixed;.*boundary=\"([^\"]+)\""); - Matcher match = regex.matcher(contentType); try (Response r = response) { + // ignore callback if call was cancelled + if (mDownloadBundleFromURLCall == null || mDownloadBundleFromURLCall.isCanceled()) { + mDownloadBundleFromURLCall = null; + return; + } + mDownloadBundleFromURLCall = null; + + final String url = response.request().url().toString(); + // Make sure the result is a multipart response and parse the boundary. + String contentType = response.header("content-type"); + Pattern regex = Pattern.compile("multipart/mixed;.*boundary=\"([^\"]+)\""); + Matcher match = regex.matcher(contentType); if (match.find()) { processMultipartResponse(url, r, match.group(1), outputFile, bundleInfo, callback); } else {