在我的项目中,我需要使用特定版本的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。当时给出的答案过于通用
答案 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(...);
}