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