代理服务器持久连接关闭

时间:2015-03-09 18:17:39

标签: objective-c proxy osx-yosemite nsstream nsurlprotocol

我正在为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 wireshark

编辑2 :它似乎与HTTPS有关...如果我将服务器更改为纯http而不是https,它将完美运行。

0 个答案:

没有答案