首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自定义QSslSocket用于QNetworkAccessManager

自定义QSslSocket用于QNetworkAccessManager
EN

Stack Overflow用户
提问于 2015-05-04 20:41:41
回答 1查看 1K关注 0票数 1

在我的项目中,我需要使用特定版本的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。当时给出的答案太笼统了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-05 15:36:21

我想我找到了解决办法。在createRequest中,我可以使用我的自定义套接字/ssl类,然后将读取的数据传递给一个新的自定义QNetworkReply对象,该对象将以Qt格式设置这些数据(从char*到QByteArray)。到目前为止,我已经测试过了,而且效果很好。

代码语言:javascript
复制
//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(...);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30039578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档