我正在为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 iOS中的建议将基础套接字设置为kCFStreamEventOpenCompleted
保持活动状态,但仍然没有成功。
为什么连接关闭?我怎么能调试它或让它工作? 连接的错误是代理变得疯狂吗?
感谢。
修改1 :
编辑2 :它似乎与HTTPS有关...如果我将服务器更改为纯http而不是https,它将完美运行。