static int os_http_post()

in Sources/Producer/LogProducerConfig.m [33:127]


static int os_http_post(const char *url,
                char **header_array,
                int header_count,
                const void *data,
                int data_len,
                post_log_result *http_response)
{
    size_t request_id_len = sizeof(char) * 256;
    http_response->requestID = (char*) malloc(request_id_len);
    memset(http_response->requestID, 0, request_id_len);
    
    size_t error_message_len = sizeof(char) * 256;
    http_response->errorMessage = (char*) malloc(error_message_len);
    memset(http_response->errorMessage, 0, error_message_len);
    
    if(url == NULL || *url == 0 || header_array == NULL || header_count < 1 || data == NULL || data_len <= 0) {
        http_response->statusCode = 400;
        strcpy(http_response->requestID, "");
        strcpy(http_response->errorMessage, "request is incorrect");
        return 400; // bad request
    }
    
    NSString *urlString = [NSString stringWithUTF8String:url];
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
    [request setHTTPMethod:@"POST"];
    [request setURL:[NSURL URLWithString:urlString]];

    // set headers
    for(int i=0; i<header_count; i++) {
        char *kv = header_array[i];
        if(kv != NULL) {
            char *eq = strchr(kv, ':');
            if(eq != NULL && eq != kv && eq[1] != 0) {
                *eq = 0;
                [request addValue:[NSString stringWithUTF8String:eq+1] forHTTPHeaderField:[NSString stringWithUTF8String:kv]];
                *eq = '='; // restore
            }
        }
    }

    // set body
    NSData *postData = [NSData dataWithBytes:data length:data_len];
    [request setHTTPBody:postData];

    // send
    NSError *error = nil;
    NSHTTPURLResponse *response = nil;
    NSData *resData = [SLSURLSession sendSynchronousRequest:request
                                          returningResponse:&response
                                                      error:&error
    ];
    if(response != nil){
        int responseCode = (int)[response statusCode];
        http_response->statusCode = responseCode;
        
        NSDictionary *fields = [response allHeaderFields];
        NSString *timeVal = fields[@"x-log-time"];
        if ([timeVal length] != 0) {
            NSInteger serverTime = [timeVal integerValue];
            if (serverTime > 1500000000 && serverTime < 4294967294) {
                [TimeUtils updateServerTime:serverTime];
            }
        }
        
        if (responseCode != 200) {
            NSString *res = [[NSString alloc] initWithData:resData encoding:NSUTF8StringEncoding];
            strncpy(http_response->requestID, res.length > 0 ? [res UTF8String] : "", request_id_len);
            
            SLSLog(@"%ld %@ %@", [response statusCode], [response allHeaderFields], res);
        } else {
            NSString *requestId = fields[@"x-log-requestid"];
            strncpy(http_response->requestID, requestId.length > 0 ? [requestId UTF8String] : "", request_id_len);
        }

        return responseCode;
    } else {
        http_response->statusCode = -1;
        strcpy(http_response->requestID, "");
        
        if(error != nil){
            NSString *errorMessage = [NSString stringWithFormat:@"domain: %@, code: %ld, description: %@", error.domain, (long)error.code,  error.localizedDescription];
            SLSLog(@"os_http_post error: %@", errorMessage);
            
            strncpy(http_response->errorMessage, [errorMessage UTF8String], error_message_len);
            
            if (error.code == kCFURLErrorUserCancelledAuthentication) {
                return 401;
            }
            if (error.code == kCFURLErrorBadServerResponse) {
                return 500;
            }
        }
        return -1;
    }
}