void sls_ios_http_header_inject_func()

in Sources/Producer/LogProducerConfig.m [201:240]


void sls_ios_http_header_inject_func(log_producer_config *config, char **src_headers, int src_count, char **dest_headers, int *dest_count) {
    NSMutableArray<NSString *> *headers = [NSMutableArray array];
    for (int i = 0; i < src_count; i ++) {
        char *kv = src_headers[i];
        if (NULL == kv) {
            continue;
        }
        
        char *eq = strchr(kv, ':');
        if (NULL == eq || eq == kv || eq[1] == 0) {
            continue;
        }
        *eq = 0;
        
        [headers addObject:[NSString stringWithUTF8String:kv]];
        [headers addObject:[NSString stringWithUTF8String:(eq+1)]];
    }
    
    LogProducerConfig *producer = (__bridge LogProducerConfig *)(config->user_params);
    NSArray<NSString *> *injectedHeaders = producer->_injector(headers);
    if(nil == injectedHeaders || injectedHeaders.count == 0) {
        return;
    }
    
    NSUInteger count = injectedHeaders.count / 2;
    for (int i = 0; i < count; i ++) {
        const char *key = [[injectedHeaders objectAtIndex:2*i] UTF8String];
        const char *value = [[injectedHeaders objectAtIndex:2*i+1] UTF8String];
        unsigned long len = strlen(key) + strlen(value) + strlen(":") + 1;
        
        // dynamic alloc 'len' of char* for reduce mem cost
        char *kv = (char *) malloc(sizeof(char) * len);
        memset(kv, 0, sizeof(char) * len);
        strcat(kv, key);
        strcat(kv, ":");
        strcat(kv, value);
        dest_headers[i] = kv;
        (*dest_count)++;
    }
}