From e44c7f40622750e7b374312c9eb6f6983a84b3ae Mon Sep 17 00:00:00 2001 From: Mark Tolmacs <47425833+mark-plukkido@users.noreply.github.com> Date: Wed, 8 Apr 2020 03:05:25 -0700 Subject: [PATCH] =?UTF-8?q?Fix=20IOS=20crash=20in=20Network=20Plugin=20due?= =?UTF-8?q?=20to=20incorrect=20processing=20of=20data=20U=E2=80=A6=20(#978?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Summary: Fix IOS crash in Network Plugin due to incorrect processing of data URLs (https://github.com/facebook/flipper/issues/974) Fix https://github.com/facebook/flipper/issues/974 by skipping response processing in FlipperKitNetworkPlugin.mm if the response is not an instance of NSHTTPURLResponse, which data URLs are not. My assumption is that data URLs are not the ones Flipper Network Plugin users are interested in, given the type of information being extracted in the didObserveResponse method which are only present in NSHTTPURLReponse types. ## Changelog Fix IOS crash in Network Plugin due to unchecked casting of data URLs Pull Request resolved: https://github.com/facebook/flipper/pull/978 Test Plan: 1. `npx react-native init issue974 --version react-native@0.62.1` 2. `cd issue974/ios/Pods/FlipperKit/iOS/Plugins/` 3. `curl -L https://patch-diff.githubusercontent.com/raw/facebook/flipper/pull/978.patch | git apply -v -p3` 4. `cd ../../../../../` 5. `curl -L https://github.com/facebook/flipper/files/4434063/rn-data-uri-test.patch.txt | git apply -v react-native run-ios` 6. Verify that the app does not crash the IOS app with ``` Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSURLResponse allHeaderFields]: unrecognized selector sent to instance ' ``` #### The React Native app patch used to verify the PR working and resolving the issue https://github.com/facebook/flipper/issues/974 [rn-data-uri-test.patch.txt](https://github.com/facebook/flipper/files/4434063/rn-data-uri-test.patch.txt) Reviewed By: mweststrate Differential Revision: D20861168 Pulled By: cekkaewnumchai fbshipit-source-id: bae960650ecc0efbb8ae4641aba4c62c74f06bf0 --- .../FlipperKitNetworkPlugin/FlipperKitNetworkPlugin.mm | 5 +++++ .../FlipperKitNetworkPlugin/SKResponseInfo.m | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/iOS/Plugins/FlipperKitNetworkPlugin/FlipperKitNetworkPlugin/FlipperKitNetworkPlugin.mm b/iOS/Plugins/FlipperKitNetworkPlugin/FlipperKitNetworkPlugin/FlipperKitNetworkPlugin.mm index ab17894db..f102aeeaf 100644 --- a/iOS/Plugins/FlipperKitNetworkPlugin/FlipperKitNetworkPlugin/FlipperKitNetworkPlugin.mm +++ b/iOS/Plugins/FlipperKitNetworkPlugin/FlipperKitNetworkPlugin/FlipperKitNetworkPlugin.mm @@ -78,6 +78,11 @@ } - (void)didObserveResponse:(SKResponseInfo*)response { + // Only track HTTP(S) calls, data URLs cannot be casted to NSHTTPURLResponse + if (![response.response isKindOfClass:[NSHTTPURLResponse class]]) { + return; + } + NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*)response.response; NSMutableArray*>* headers = [NSMutableArray new]; diff --git a/iOS/Plugins/FlipperKitNetworkPlugin/FlipperKitNetworkPlugin/SKResponseInfo.m b/iOS/Plugins/FlipperKitNetworkPlugin/FlipperKitNetworkPlugin/SKResponseInfo.m index 1213dd16d..668e03c13 100644 --- a/iOS/Plugins/FlipperKitNetworkPlugin/FlipperKitNetworkPlugin/SKResponseInfo.m +++ b/iOS/Plugins/FlipperKitNetworkPlugin/FlipperKitNetworkPlugin/SKResponseInfo.m @@ -29,6 +29,11 @@ } + (BOOL)shouldStripReponseBodyWithResponse:(NSURLResponse*)response { + // Only HTTP(S) responses have Content-Type headers + if (![response isKindOfClass:[NSHTTPURLResponse class]]) { + return YES; + } + NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*)response; NSString* contentType = httpResponse.allHeaderFields[@"content-type"]; if (!contentType) {