[英]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.