QNetworkAccessManager的自定义QSslSocket

时间:2015-05-04 20:41:41

标签: c++ qt

在我的项目中,我需要使用特定版本的OpenSSL。我同时使用Qt 4.8.6和Qt 5.4.0。 我想创建一个自定义QSslSocket传递给QNetworkAccessManager,它将用于QWebView。

我注意到在Qt 4.8.6中只支持TLS 1.0,新的协议版本不是。

有没有办法以简单的方式将子类QSslSocket(带有TLS 1.2版本)传递给QNetworkAccessManager?查看源代码,它是公开使用隐藏的(QSslSocket是私有实现的朋友)?

注意:我不想使用QHttp,因为它在新的Qt库中不再公开,因此很难移植。

编辑: 5年前就出现了类似的问题(QNetworkAccessManager/QNetworkReply with custom QTcpSocket?),但仍然无法直接修改QSslSocket。当时给出的答案过于通用

1 个答案:

答案 0 :(得分:1)

我想我找到了解决方案。在createRequest中,我可以使用我的自定义socket / ssl类,然后将读取数据传递给新的自定义QNetworkReply对象,该对象将以Qt格式(从char *到QByteArray)设置这些数据。 到目前为止,我已经对它进行了测试,但它确实有效。

//see http://code.woboq.org/kde/qt4/src/network/access/qnetworkreplydataimpl_p.h.html
class SubclassedNetworkReply : public QNetworkReply
{
  public:
    SubclassedNetworkReply(QObject *parent, const QNetworkRequest &req, const QNetworkAccessManager::Operation op, char* data);

    void abort() override;
    void close() override;
    qint64 bytesAvailable() const override;
    qint64 readData(char *data, qint64 maxlen) override;
    bool isSequential () const override;
};

QNetworkReply* SubclassedNetworkAccessManager::createRequest(...)
{
  if(url.scheme().contains("https"))
  {
    //Here you can use your custom QSslSocket/SSL Class to get the char* data

    //Here you create your custom reply, which will acquire the char* data and convert it to a QByteArray which will shown in the QWebView
    QNetworkReply *reply = new SubclassedNetworkReply(this, request, operation, data);
    return reply;  
  }
  return QNetworkAccessManager::createRequest(...);
}