我在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;
}
我在这里错过了哪些明显的东西?
答案 0 :(得分:1)
您没有创建CFHTTPRead
或写入流,因此套接字流忽略
kCFStreamPropertyHTTPProxy
。
答案 1 :(得分:0)
来自苹果文档:
没有任何迹象表明这不起作用。文档提到使用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)。