簡體   English   中英

QNetworkAccessManager的自定義QSslSocket

[英]Custom QSslSocket for QNetworkAccessManager

在我的項目中,我需要使用特定版本的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庫中不再公開,從而使其難以移植。

編輯:還有一個類似的問題( 帶有自定義QTcpSocket的QNetworkAccessManager / QNetworkReply? ),在5年前提出,但是仍然無法直接修改QSslSocket。 當時給出的答案太籠統了

我想我已經找到了解決方案。 在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(...);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM