使用受密码保护的代理服务器请求 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 请求