Не удается установить прокси в CFStream для параметра kCFStreamPropertyHTTPProxy

#ios #proxy #core-foundation #cfnetwork

#iOS #прокси #ядро-основа #cfnetwork

Вопрос:

У меня вопрос о настройке потоков CF для использования указанного в системе прокси. Даже этот простой пример с настроенным вручную словарем не будет работать, и для поля isSet будет установлено значение false. Какой набор параметров ожидается от разработчика, чтобы иметь возможность применять словарь к параметру kCFStreamPropertyHTTPProxy?

 CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
CFStreamCreatePairWithSocketToHost(kCFAllocatorSystemDefault, CFSTR("apple.com"), 80, amp;readStream, amp;writeStream);
NSDictionary *proxySettings = @{(NSString *)kCFStreamPropertyHTTPProxyHost:@"10.0.1.2", (NSString *)kCFStreamPropertyHTTPProxyPort:@(8888)};
Boolean isSet = CFReadStreamSetProperty(readStream, kCFStreamPropertyHTTPProxy, (__bridge CFTypeRef)proxySettings);
  

Я действительно буду признателен за любую помощь, потому что я борюсь с этой проблемой уже несколько месяцев и не могу найти ответа.

С наилучшими пожеланиями, Сергей

Ответ №1:

Все это было из-за использования простых потоков на основе подключения к сокетам вместо потока чтения HTTP, который создается с CFReadStreamCreateForStreamedHTTPRequest помощью (я не знаю, почему у Apple нет некоторой информации вместе с описанием имени свойства)

Ответ №2:

Следующий код посвящен ASIHttpRequest тому, как обрабатывать настройки прокси. Если тип прокси -сокета, вы должны использовать kCFStreamPropertySOCKSProxy . Просто дополнение к вашему ответу.

 if ([self proxyHost] amp;amp; [self proxyPort]) {
    NSString *hostKey;
    NSString *portKey;

    if (![self proxyType]) {
        [self setProxyType:(NSString *)kCFProxyTypeHTTP];
    }

    if ([[self proxyType] isEqualToString:(NSString *)kCFProxyTypeSOCKS]) {
        hostKey = (NSString *)kCFStreamPropertySOCKSProxyHost;
        portKey = (NSString *)kCFStreamPropertySOCKSProxyPort;
    } else {
        hostKey = (NSString *)kCFStreamPropertyHTTPProxyHost;
        portKey = (NSString *)kCFStreamPropertyHTTPProxyPort;
        if ([[[[self url] scheme] lowercaseString] isEqualToString:@"https"]) {
            hostKey = (NSString *)kCFStreamPropertyHTTPSProxyHost;
            portKey = (NSString *)kCFStreamPropertyHTTPSProxyPort;
        }
    }
    NSMutableDictionary *proxyToUse = [NSMutableDictionary dictionaryWithObjectsAndKeys:[self proxyHost],hostKey,[NSNumber numberWithInt:[self proxyPort]],portKey,nil];

    if ([[self proxyType] isEqualToString:(NSString *)kCFProxyTypeSOCKS]) {
        CFReadStreamSetProperty((CFReadStreamRef)[self readStream], kCFStreamPropertySOCKSProxy, proxyToUse);
    } else {
        CFReadStreamSetProperty((CFReadStreamRef)[self readStream], kCFStreamPropertyHTTPProxy, proxyToUse);
    }