在iOS上设置代理CFStreams不起作用

时间:2012-08-02 19:14:30

标签: objective-c ios proxy asyncsocket

我在Mac上设置了一个squid http代理,我已经设置了我的Mac来共享其无线连接。在我手机上的wifi连接信息中,我设置了我的HTTP代理设置:

Server: 10.0.2.1
Port:   3128
Authentication: off

在我的iOS应用程序中,我有两种访问网络的方法。对于http请求,我使用的是NSURLRequest,对于其他TCP连接,我使用的是AsyncSocket库。

使用NSURLRequest的所有请求都使用代理而没有问题(对于SSL,代理充当HTTP CONNECT隧道)。但是,我似乎无法将代理用于AsyncSocket连接。

我确实更新了AsyncSocket库,以便在创建CFStream时调用以下内容,例如:

//for printing out the proxy settings
static void printEntry (const void* key, const void* value, void* context) {
    CFShow(key);
    CFShow(value);
}

- (BOOL)createStreamsFromNative:(CFSocketNativeHandle)native error:(NSError **)errPtr
{
    // Create the socket & streams.
    CFStreamCreatePairWithSocket(kCFAllocatorDefault, native, &theReadStream, &theWriteStream);
    .
    .
    .
    CFDictionaryRef proxyDict = CFNetworkCopySystemProxySettings();
    CFDictionaryApplyFunction(proxyDict, printEntry, NULL); // I see the proxy settings are correct here

    CFReadStreamSetProperty(theReadStream, kCFStreamPropertyHTTPProxy, proxyDict);
    CFWriteStreamSetProperty(theWriteStream, kCFStreamPropertyHTTPProxy, proxyDict);

    CFRelease(proxyDict);
    return YES;
}

我在这里错过了哪些明显的东西?

2 个答案:

答案 0 :(得分:1)

您没有创建CFHTTPRead或写入流,因此套接字流忽略 kCFStreamPropertyHTTPProxy

答案 1 :(得分:0)

来自苹果文档:

https://developer.apple.com/library/ios/#DOCUMENTATION/Networking/Conceptual/CFNetwork/CFStreamTasks/CFStreamTasks.html#//apple_ref/doc/uid/TP30001132-CH6-DontLinkElementID_16

没有任何迹象表明这不起作用。文档提到使用CFStreams,而不是CFHTTPStreams。

由于我无法让它工作,因为文档说明并且我的时间已经不多了,我实现了自己的HTTP代理代码,这最终太难了。如果配置指示已设置HTTP代理,我将初始连接重定向到代理并使用以下标头发起HTTP请求:

CONNECT <real host>:<real port> HTTP/1.1
Host: <real host>
Proxy-Connection: keep-alive
Connection: keep-alive

在收到带有200响应代码的完整http响应后,我开始套接字通信,就像直接与服务器通信一样(例如调用startTLS开始SSL)。