2

我已经在我的 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 连接的代理。

每当创建 CFStreams 时,我确实更新了 AsyncSocket 库以调用以下内容,例如:

//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;
}

我在这里错过了什么明显的东西吗?

4

2 回答 2

1

您没有创建CFHTTPRead或编写流,因此套接字流正在忽略 kCFStreamPropertyHTTPProxy.

于 2012-08-10T04:42:05.327 回答
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)。

于 2012-09-02T19:30:38.977 回答