我有一个使用QTcpSocket作为代理的应用程序来拦截HTTP请求。我也试图将其扩展到为HTTPS工作,但似乎它没有按照我的预期工作。由于应用程序的独特性,使用QHttp是不可能的。
目前,我有以下内容:
serverConnection = new QTcpSocket();
serverConnection->setProxy(proxy);
serverConnection->connectToHost(url_hostname, url_port);
serverConnection->write(request.toAscii());
connect(serverConnection, SIGNAL(readyRead()), this, SLOT(readServerData()), Qt::DirectConnection);
我尝试使用QSslSocket做一些非常相似的事情,但遗憾的是结果并非我的预期。
serverSConnection = new QSslSocket();
serverSConnection->connectToHostEncrypted(url_hostname, url_port);
if (!serverSConnection->waitForEncrypted()) {
qDebug() << "waitForEncrypted failed";
}
serverSConnection->write(request.toAscii());
connect(serverSConnection, SIGNAL(readyRead()), this, SLOT(readSServerData()), Qt::DirectConnection);
使用QSslSocket执行请求似乎会触发: HTTP / 1.1 406不可接受
我发送的请求看起来与以下内容类似:
Received Request: "CONNECT www.somesslhost.com:443 HTTP/1.1
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.13) Gecko/2009080315 Ubuntu/9.04 (jaunty) Firefox/3.0.13
Proxy-Connection: keep-alive
Host: www.somesslhost.com
使用我丢失的QSslSocket通过我的应用程序发送HTTPS请求有什么特别之处吗?
答案 0 :(得分:1)
根据目前的信息,我只能认为你做错了。
如果您的客户端应该向您的应用程序发送纯HTTP请求并将它们转发到HTTPS服务器,那么您的方法很好。
如果您的客户端能够使用HTTPS并将您的应用程序用作标准代理服务器,那么您不应该像这样连接到服务器。你得到406是因为你试图说服目标服务器充当你和你自己之间的代理。
我认为你可以看一下Tunneling SSL Through a WWW Proxy。基本上,您应该解析传入的请求,建立与服务器的“原始”连接,使用企业确认响应客户端,然后只是前后转发数据包。
整个SSL协商将在您的客户端和目标服务器之间进行,代理服务器只能转发加密的数据包,而不能解密它们。
答案 1 :(得分:0)
我很困惑 - 你说:
我有一个正在运行的应用程序 作为使用QTcpSocket的代理 拦截HTTP请求。
“拦截”是什么意思?您是否正在尝试编写HTTP代理应用程序?请更清楚&amp;具体,我们可以帮助你。