无法在kCFStreamPropertyHTTPProxy参数上将代理设置为CFStream

时间:2014-06-30 07:44:25

标签: ios proxy core-foundation cfnetwork

我有一个关于配置CF流以使用系统指定代理的问题。即使这个手动配置字典的简单示例也不起作用, isSet 字段将设置为 false 。 开发人员可以使用哪些选项将字典应用于 kCFStreamPropertyHTTPProxy 参数?

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

我真的很感激任何帮助,因为我几个月来一直在努力解决这个问题而无法找到答案。

最诚挚的问候, 塞吉

2 个答案:

答案 0 :(得分:0)

所有这些都是因为使用了基于套接字连接的普通流而不是使用CFReadStreamCreateForStreamedHTTPRequest创建的HTTP读取流(我不知道为什么Apple没有提供一些信息以及属性名称描述)

答案 1 :(得分:0)

以下代码约为ASIHttpRequest如何处理代理设置。如果代理类型是套接字,则应使用kCFStreamPropertySOCKSProxy。只是你的答案的补充。

if ([self proxyHost] && [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);
    }