in Source/TNLRequestOperation.m [1328:1384]
static void _network_prepStep_applyGlobalHeadersToScratchURLRequest(TNLRequestOperation * __nullable const self, tnl_request_preparation_block_t nextBlock)
{
if (!self) {
return;
}
TNLAssert(nextBlock != nil);
TNLAssert([self _network_isPreparing]);
NSArray<id<TNLHTTPHeaderProvider>> *headerProviders = [TNLRequestOperationQueue allGlobalHeaderProviders];
if (headerProviders.count > 0) {
// Since HTTP headers are case-insensitive,
// we want to use the setValue:forHTTPHeaderField:
// for every single header to use the built in
// case-insensitive behavior built into NSURLRequest
// Pull out the dictionaries
NSDictionary<NSString *, NSString *> *existingHeaders = self->_scratchURLRequest.allHTTPHeaderFields;
NSMutableDictionary<NSString *, NSString *> *defaultHeaders = [[NSMutableDictionary alloc] init];
NSMutableDictionary<NSString *, NSString *> *overrideHeaders = [[NSMutableDictionary alloc] init];
NSURLRequest *immutableScratchRequest = [self->_scratchURLRequest copy];
for (id<TNLHTTPHeaderProvider> headerProvider in headerProviders) {
NSDictionary<NSString *, NSString *> *tmpDict;
if ([headerProvider respondsToSelector:@selector(tnl_allDefaultHTTPHeaderFieldsForRequest:URLRequest:)]) {
tmpDict = [headerProvider tnl_allDefaultHTTPHeaderFieldsForRequest:self->_originalRequest
URLRequest:immutableScratchRequest];
[defaultHeaders addEntriesFromDictionary:tmpDict];
}
if ([headerProvider respondsToSelector:@selector(tnl_allOverrideHTTPHeaderFieldsForRequest:URLRequest:)]) {
tmpDict = [headerProvider tnl_allOverrideHTTPHeaderFieldsForRequest:self->_originalRequest
URLRequest:immutableScratchRequest];
[overrideHeaders addEntriesFromDictionary:tmpDict];
}
}
// Clear the headers on the request to start
self->_scratchURLRequest.allHTTPHeaderFields = nil;
// 1) default headers
[defaultHeaders enumerateKeysAndObjectsUsingBlock:^(NSString * _Nonnull key, NSString * _Nonnull obj, BOOL * _Nonnull stop) {
[self->_scratchURLRequest setValue:obj forHTTPHeaderField:key];
}];
// 2) specified headers
[existingHeaders enumerateKeysAndObjectsUsingBlock:^(NSString * _Nonnull key, NSString * _Nonnull obj, BOOL * _Nonnull stop) {
[self->_scratchURLRequest setValue:obj forHTTPHeaderField:key];
}];
// 3) override headers
[overrideHeaders enumerateKeysAndObjectsUsingBlock:^(NSString * _Nonnull key, NSString * _Nonnull obj, BOOL * _Nonnull stop) {
[self->_scratchURLRequest setValue:obj forHTTPHeaderField:key];
}];
}
nextBlock();
}