static void _network_prepStep_applyGlobalHeadersToScratchURLRequest()

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();
}