gpt4 book ai didi

c++ - QNetworkAccessManager 的自定义 QSslSocket

转载 作者:行者123 更新时间:2023-11-30 05:43:55 25 4
gpt4 key购买 nike

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

我注意到在 Qt 4.8.6 中仅支持 TLS 1.0,不支持较新的协议(protocol)版本。

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

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

编辑: 5 年前有一个类似的问题(QNetworkAccessManager/QNetworkReply with custom QTcpSocket?),但仍然无法直接修改 QSslSocket。当年给的答案太笼统了

最佳答案

我想我已经找到了解决方案。在 createRequest 中,我可以使用我的自定义套接字/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(...);
}

关于c++ - QNetworkAccessManager 的自定义 QSslSocket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30039578/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com