在我的项目中,我需要使用特定版本的OpenSSL。我使用的是QT4.8.6和QT5.4.0。我希望创建一个要传递给QNetworkAccessManager的自定义QNetworkAccessManager,它将用于QWebView。
我注意到,在QT4.8.6中,只支持TLS1.0,更新的协议版本则不支持。
是否有一种方法可以轻松地将子类QSslSocket (带有TLS 1.2版本)传递给QNetworkAccessManager?从源代码来看,它是不被公共使用的(QSslSocket是私有实现的朋友)?
注释:--我不想使用QHttp,因为它在新的Qt库中不再是公共的,这使得移植变得很困难。
编辑:有一个类似的问题(QNetworkAccessManager/QNetworkReply with custom QTcpSocket?),这是5年前提出的,但是仍然不能直接修改QSslSocket。当时给出的答案太笼统了。
发布于 2015-05-05 15:36:21
我想我找到了解决办法。在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(...);
}https://stackoverflow.com/questions/30039578
复制相似问题