Запрос прокси-сервера NSUrlSession завершается неудачно с кодом ошибки 310 (kCFErrorHTTPSProxyConnectionFailure) - PullRequest
0 голосов
/ 13 июня 2019

Я пытаюсь отправить запрос POST на определенный URL-адрес через прокси-сервер. Чтобы проверить, что код, который я пишу, работает, я установил squidman на свою машину и запустил прокси-сервер на порт 33074 . Я протестировал прокси-сервер, изменив настройки сети, чтобы использовать прокси-сервер при выполнении запросов HTTP / HTTPS, и он работает нормально.

Теперь я написал следующий код:

    NSDictionary* proxyConfig = @{
        (NSString*) kCFNetworkProxiesHTTPSEnable: @(1),
        (NSString*) kCFNetworkProxiesHTTPSProxy: @"127.0.0.1",
        (NSString*) kCFNetworkProxiesHTTPSPort: @"33074",
    };

    NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration];
    [sessionConfig setTimeoutIntervalForRequest:60];
    [sessionConfig setConnectionProxyDictionary:proxyConfig];

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
    [request setURL:[NSURL URLWithString:@"https://the-host-where-im-posting"]];
    [request setHTTPMethod:@"POST"];
    [request setValue:[[NSString alloc] initWithFormat:@"%lu",length] forHTTPHeaderField:@"Content-Length"];
    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    [request setHTTPBody:data];

    NSURLSession *session = [self createHttpSession];
    NSURLSessionDataTask* dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
        if(httpResponse.statusCode == 200){
            //...
        } else {
            LOGERROR(@"Error: %@", error);
        }
    }

Проблема в том, что запрос не был выполнен успешно, и в журнале регистрируется следующая ошибка:

Ошибка: Ошибка Domain = kCFErrorDomainCFNetwork Code = 310 "(null)" UserInfo = {_ kCFStreamErrorCodeKey = -2096, _kCFStreamErrorDomainKey = 4}

Дополнительная информация:
1. Следует отметить, что запросы отправляются без необходимости установки словаря proxyConfig.
2. Похожая ошибка сообщается, если я пытаюсь отправить запрос, используя HTTP через прокси (соответственно изменяя ключи в словаре proxyConfig) с небольшим различием в коде ошибки и _kCFStreamErrorCodeKey: 306 вместо 310 и -2094 вместо -2096.
3. Процесс, выполняющий запрос, запускается как демон.

Что именно я делаю не так? Чего мне не хватает?

1 Ответ

0 голосов
/ 18 июня 2019

Я устанавливал для поля kCFNetworkProxiesHTTPSPort из словаря proxyConfig значение типа NSString.Внимательно прочитав документацию к нему, я заметил следующее:

Ключ для номера порта, связанного с прокси HTTPS; значение представляет собой CFNumber , который является номером порта.

В библиотеке обнаружен объект, который не является CFNumber и использует порт по умолчанию для связи HTTPS для подключения кпрокси вместо (443).Это плохая обработка ошибок imho.По сути, он молча пытался сделать запрос, используя порт, о котором я не знал.Изменение словаря proxyConfig на следующее устранило проблему:

NSDictionary* proxyConfig = @{
    (NSString*) kCFNetworkProxiesHTTPSEnable: @(1),
    (NSString*) kCFNetworkProxiesHTTPSProxy: @"127.0.0.1",
    (NSString*) kCFNetworkProxiesHTTPSPort: @(33074),
};
...