使用受密码保护的代理服务器请求 https 时,来自 QNetworkAccessManager::get 的 QNetworkReply::UnknownNetworkError

Posted

技术标签:

【中文标题】使用受密码保护的代理服务器请求 https 时,来自 QNetworkAccessManager::get 的 QNetworkReply::UnknownNetworkError【英文标题】:QNetworkReply::UnknownNetworkError from QNetworkAccessManager::get when requesting https with a password protected proxy server 【发布时间】:2011-09-18 23:41:21 【问题描述】:

我遇到了 QNetworkAccessManager 的问题。以下是我正在做的一些简要说明:

QNetworkAccessManager* manager = new QNetworkAccessManager(this);
manager->setProxy(proxy);
QUrl url("https://www.example.com");
QNetworkRequest request(url);
manager->get(request);

为了在受密码保护的代理服务器上测试代码,我使用了 Polipo。在为服务器设置密码并使用非 https url (http://www.example.com) 时,我通常会发出 proxyAuthenticationRequired() 信号。但是,对于 https url,我没有发出该信号(或 sslErrors() 信号),并且发出的finished() 信号使用等于 QNetworkReply::UnknownNetworkError 的reply->error() 发出。我确定这不是 Polipo 问题,因为浏览器仍在询问代理服务器的用户名/密码,尽管在凭据不正确的情况下,他们不会像 http url 那样说“代理身份验证失败”,只是说页面不能被打开。所以我需要知道如何配置 qt 类或其 ssl 类来请求身份验证并解决这个问题。

我正在使用 Qt 4.5.2。

谢谢!

【问题讨论】:

【参考方案1】:

即使有错误,你也应该检查:

回复内容reply->readAll(),可能包含服务器生成的错误页面, reply->errorString() 中的错误文本

返回的HTTP状态码
reply >attribute( QNetworkRequest::HttpStatusCodeAttribute).toInt()

【讨论】:

抱歉回复晚了。 readAll() 返回空字符串,errorString() 说“HTTP 请求失败”,HTTP 状态码为 0。但是,我调试了 Qt 代码,发现这些是套接字错误的结果。 Http 请求使用了返回错误代码 QAbstractSocket::ProxyConnectionClosedError 和错误消息“代理连接过早关闭”的 http 套接字。这对你有什么影响吗? @user951745 我刚刚安装了 polipo 并用wireshark和netcat做了一些测试,似乎使用https隧道,如果没有凭据或给定的凭据错误,polipo正在关闭连接而不是返回代理身份验证错误。甚至 Chrome 也会显示“ERR_EMPTY_RESPONSE”错误,并且不会询问用户名/密码。 谢谢! Chrome 确实显示错误,我很困惑 IE 如何解决此问题并理解需要代理凭据。这主要意味着 Qt 是好的,而代理服务器是错误的。我只是想用一些代理服务器测试我的程序并以 polipo 结束。现在我想我应该寻找另一个可以让我在本地计算机上测试的软件(我找不到受密码保护的在线代理)。再次感谢!

以上是关于使用受密码保护的代理服务器请求 https 时,来自 QNetworkAccessManager::get 的 QNetworkReply::UnknownNetworkError的主要内容,如果未能解决你的问题,请参考以下文章

尝试拦截 iOS 请求时 charles 代理出错,但 charles 代理证书已配置且受信任

如何禁止“应用程序请求访问受保护的项目”弹出窗口

强制 cURL 在代理上使用 GET 来处理 HTTPs 请求

提供密码时受密码保护的页面未正确重定向

从工作灯适配器调用受密码保护的 URL 时如何输入用户凭据?

反向代理