Remove all null values for request headers
Summary: NSMutableURLRequest appears to be running `[headerValue count]` on every value of the NSDictionary that `allHTTPHeaderFields` is set to, meaning that any `null` values passed to headers in an XHR throw an exception. This differs from the implementation of XHR in browsers, which just ignore any `null` values for headers. PR doesn't currently include tests, happy to add those if this is something you'd consider merging Closes https://github.com/facebook/react-native/pull/6903 Differential Revision: D3256727 fb-gh-sync-id: 58e8db9c86a1fe7fbd95cba7dcf916957d179e0c fbshipit-source-id: 58e8db9c86a1fe7fbd95cba7dcf916957d179e0c
This commit is contained in:
parent
9ca8c09d62
commit
5723915eaa
|
@ -190,6 +190,19 @@ RCT_EXPORT_MODULE()
|
||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (NSDictionary<NSString *, id> *)stripNullsInRequestHeaders:(NSDictionary<NSString *, id> *)headers
|
||||||
|
{
|
||||||
|
NSMutableDictionary *result = [NSMutableDictionary dictionaryWithCapacity:headers.count];
|
||||||
|
for (NSString *key in headers.allKeys) {
|
||||||
|
id val = headers[key];
|
||||||
|
if (val != [NSNull null]) {
|
||||||
|
result[key] = val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
- (RCTURLRequestCancellationBlock)buildRequest:(NSDictionary<NSString *, id> *)query
|
- (RCTURLRequestCancellationBlock)buildRequest:(NSDictionary<NSString *, id> *)query
|
||||||
completionBlock:(void (^)(NSURLRequest *request))block
|
completionBlock:(void (^)(NSURLRequest *request))block
|
||||||
{
|
{
|
||||||
|
@ -198,7 +211,7 @@ RCT_EXPORT_MODULE()
|
||||||
NSURL *URL = [RCTConvert NSURL:query[@"url"]]; // this is marked as nullable in JS, but should not be null
|
NSURL *URL = [RCTConvert NSURL:query[@"url"]]; // this is marked as nullable in JS, but should not be null
|
||||||
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL];
|
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL];
|
||||||
request.HTTPMethod = [RCTConvert NSString:RCTNilIfNull(query[@"method"])].uppercaseString ?: @"GET";
|
request.HTTPMethod = [RCTConvert NSString:RCTNilIfNull(query[@"method"])].uppercaseString ?: @"GET";
|
||||||
request.allHTTPHeaderFields = [RCTConvert NSDictionary:query[@"headers"]];
|
request.allHTTPHeaderFields = [self stripNullsInRequestHeaders:[RCTConvert NSDictionary:query[@"headers"]]];
|
||||||
request.timeoutInterval = [RCTConvert NSTimeInterval:query[@"timeout"]];
|
request.timeoutInterval = [RCTConvert NSTimeInterval:query[@"timeout"]];
|
||||||
NSDictionary<NSString *, id> *data = [RCTConvert NSDictionary:RCTNilIfNull(query[@"data"])];
|
NSDictionary<NSString *, id> *data = [RCTConvert NSDictionary:RCTNilIfNull(query[@"data"])];
|
||||||
return [self processDataForHTTPQuery:data callback:^(NSError *error, NSDictionary<NSString *, id> *result) {
|
return [self processDataForHTTPQuery:data callback:^(NSError *error, NSDictionary<NSString *, id> *result) {
|
||||||
|
|
Loading…
Reference in New Issue