Skip to content

Commit

Permalink
explicitly dispatch async RCTNetworking methods
Browse files Browse the repository at this point in the history
Differential Revision: D49693966

fbshipit-source-id: e8abba7d09782aa833db780f3d4360a1e726ea08
  • Loading branch information
philIip authored and facebook-github-bot committed Oct 4, 2023
1 parent 083771d commit f9520eb
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 f9520eb

Please sign in to comment.