Skip to content

Commit

Permalink
dispatch async RCTNetworking methods (facebook#39761)
Browse files Browse the repository at this point in the history
Summary:
Pull Request resolved: facebook#39761

Changelog: [Internal]
as part of the sync void tm methods test, there are some modules that do not behave correctly when trying to execute their methods on the js thread.

to maintain the old behavior, we dispatch them explicitly in the implementation.

Reviewed By: mdvacca

Differential Revision: D49693966

fbshipit-source-id: ea0d069d5d98b81066e9bedfe3214bf103ab2a2e
  • Loading branch information
philIip authored and facebook-github-bot committed Oct 4, 2023
1 parent 8eb8205 commit b7a290a
Showing 1 changed file with 48 additions and 33 deletions.
81 changes: 48 additions & 33 deletions packages/react-native/Libraries/Network/RCTNetworking.mm
Original file line number Diff line number Diff line change
Expand Up @@ -700,49 +700,64 @@ - (RCTNetworkTask *)networkTaskWithRequest:(NSURLRequest *)request
: (JS::NativeNetworkingIOS::SpecSendRequestQuery &)query callback
: (RCTResponseSenderBlock)responseSender)
{
NSDictionary *queryDict = @{
@"method" : query.method(),
@"url" : query.url(),
@"data" : query.data(),
@"headers" : query.headers(),
@"responseType" : query.responseType(),
@"incrementalUpdates" : @(query.incrementalUpdates()),
@"timeout" : @(query.timeout()),
@"withCredentials" : @(query.withCredentials()),
};
NSString *method = query.method();
NSString *url = query.url();
id<NSObject> data = query.data();
id<NSObject> headers = query.headers();
NSString *queryResponseType = query.responseType();
bool queryIncrementalUpdates = query.incrementalUpdates();
double timeout = query.timeout();
bool withCredentials = query.withCredentials();

dispatch_async(_methodQueue, ^{
NSDictionary *queryDict = @{
@"method" : method,
@"url" : url,
@"data" : data,
@"headers" : headers,
@"responseType" : queryResponseType,
@"incrementalUpdates" : @(queryIncrementalUpdates),
@"timeout" : @(timeout),
@"withCredentials" : @(withCredentials),
};

// TODO: buildRequest returns a cancellation block, but there's currently
// no way to invoke it, if, for example the request is cancelled while
// loading a large file to build the request body
[self buildRequest:queryDict
completionBlock:^(NSURLRequest *request) {
NSString *responseType = [RCTConvert NSString:queryDict[@"responseType"]];
BOOL incrementalUpdates = [RCTConvert BOOL:queryDict[@"incrementalUpdates"]];
[self sendRequest:request
responseType:responseType
incrementalUpdates:incrementalUpdates
responseSender:responseSender];
}];
// TODO: buildRequest returns a cancellation block, but there's currently
// no way to invoke it, if, for example the request is cancelled while
// loading a large file to build the request body
[self buildRequest:queryDict
completionBlock:^(NSURLRequest *request) {
NSString *responseType = [RCTConvert NSString:queryDict[@"responseType"]];
BOOL incrementalUpdates = [RCTConvert BOOL:queryDict[@"incrementalUpdates"]];
[self sendRequest:request
responseType:responseType
incrementalUpdates:incrementalUpdates
responseSender:responseSender];
}];
});
}

RCT_EXPORT_METHOD(abortRequest : (double)requestID)
{
[_tasksByRequestID[[NSNumber numberWithDouble:requestID]] cancel];
[_tasksByRequestID removeObjectForKey:[NSNumber numberWithDouble:requestID]];
dispatch_async(_methodQueue, ^{
[self->_tasksByRequestID[[NSNumber numberWithDouble:requestID]] cancel];
[self->_tasksByRequestID removeObjectForKey:[NSNumber numberWithDouble:requestID]];
});
}

RCT_EXPORT_METHOD(clearCookies : (RCTResponseSenderBlock)responseSender)
{
NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
if (!storage.cookies.count) {
responseSender(@[ @NO ]);
return;
}
dispatch_async(_methodQueue, ^{
NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
if (!storage.cookies.count) {
responseSender(@[ @NO ]);
return;
}

for (NSHTTPCookie *cookie in storage.cookies) {
[storage deleteCookie:cookie];
}
responseSender(@[ @YES ]);
for (NSHTTPCookie *cookie in storage.cookies) {
[storage deleteCookie:cookie];
}
responseSender(@[ @YES ]);
});
}

- (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:
Expand Down

0 comments on commit b7a290a

Please sign in to comment.