我正在为 osx 应用程序实现代理支持。
我创建了一个自定义NSURLProtocol
,它非常适合无需身份验证的代理。在本地网络中的 Windows 计算机上尝试使用 CCProxy 和 FreeProxy。
但是,当代理身份验证开启时,前几秒钟内的任何请求都可以正常工作,然后连接会在 5 秒内从 ESTABLISHED 变为 CLOSE_WAIT。代理再次显示 0 连接,之后在应用程序中任何 HTTP 请求都会得到 407,即使 proxy-auth 标头已预先设置。
我的代码如下所示:
// set the auth fields
CFStringRef usernameRef = (__bridge CFStringRef)appProxyPrefs.proxyUserName;
CFStringRef passwordRef = (__bridge CFStringRef)appProxyPrefs.proxyPassword;
CFHTTPMessageAddAuthentication(copyOfOriginal, nil, usernameRef, passwordRef, kCFHTTPAuthenticationSchemeBasic, YES);
...
// useless
CFHTTPMessageSetHeaderFieldValue(copyOfOriginal, (__bridge CFStringRef)@"Connection", (CFStringRef)(@"Keep-Alive"));
...
// create stream, callback, schedule
// apply proxy settings to the stream
if (isNoProxyOverride)
CFReadStreamSetProperty(myReadStream, kCFStreamPropertyHTTPProxy, (__bridge CFTypeRef)(noProxyDict));
else
CFReadStreamSetProperty(myReadStream, kCFStreamPropertyHTTPProxy, (__bridge CFTypeRef)(manualProxyDict));
...
CFReadStreamSetProperty(myReadStream, kCFStreamPropertyHTTPAttemptPersistentConnection, kCFBooleanTrue);
if (!CFReadStreamOpen(myReadStream)) { // error }
else
{
// check if there is a prev stream
if (currentStream != nil)
{
[currentStream close];
currentStream = nil;
}
currentStream = (__bridge NSInputStream *)(myReadStream);
}
如您所见,我尝试将先前的连接存储在静态输入流中,并仅在打开新连接后才释放它,但似乎没用。
还尝试按照NSStream TCP Keep-alive iOSkCFStreamEventOpenCompleted
中的建议将底层套接字设置为保持活动状态,但仍然没有成功。
为什么连接关闭?我怎样才能调试它或使它工作?连接的错误是代理变得疯狂吗?
谢谢。
编辑 1:
编辑2:它似乎与HTTPS有关......如果我将服务器更改为纯http而不是https,它将完美运行。