Qt4 QSslSocket触发HTTP 406 responseq

时间:2009-09-05 08:12:34

标签: qt ssl

我有一个使用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请求有什么特别之处吗?

2 个答案:

答案 0 :(得分:1)

根据目前的信息,我只能认为你做错了。

如果您的客户端应该向您的应用程序发送纯HTTP请求并将它们转发到HTTPS服务器,那么您的方法很好。

如果您的客户端能够使用HTTPS并将您的应用程序用作标准代理服务器,那么您不应该像这样连接到服务器。你得到406是因为你试图说服目标服务器充当你和你自己之间的代理。

我认为你可以看一下Tunneling SSL Through a WWW Proxy。基本上,您应该解析传入的请求,建立与服务器的“原始”连接,使用企业确认响应客户端,然后只是前后转发数据包。

整个SSL协商将在您的客户端和目标服务器之间进行,代理服务器只能转发加密的数据包,而不能解密它们。

答案 1 :(得分:0)

我很困惑 - 你说:

  

我有一个正在运行的应用程序   作为使用QTcpSocket的代理   拦截HTTP请求。

“拦截”是什么意思?您是否正在尝试编写HTTP代理应用程序?请更清楚&amp;具体,我们可以帮助你。