QtHttps.cpp 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. #include "QtHttps.h"
  2. #include "lightlog.h"
  3. #include <QEventLoop>
  4. #include "spdlog/spdlog.h"
  5. QtHttps::QtHttps(QObject *parent) :
  6. QObject(parent)
  7. {
  8. /* 初始化函数 */
  9. m_manager = new QNetworkAccessManager(this);
  10. /* 检查是否支持OpenSSL */
  11. bool isSupport = QSslSocket::supportsSsl();
  12. QString opensslVersion = QSslSocket::sslLibraryVersionString();
  13. QString openSSLBuildVersion = QSslSocket::sslLibraryBuildVersionString();
  14. LOG_INFO("OpenSSL is support : " + QString::number(isSupport));
  15. LOG_INFO("OpenSSL version : " + opensslVersion);
  16. LOG_INFO("OpenSSL build version : " + openSSLBuildVersion);
  17. /* 查看支持的协议 */
  18. auto list = m_manager->supportedSchemes();
  19. for(auto &item : list)
  20. {
  21. LOG_INFO("supportedSchemes : " + item);
  22. }
  23. }
  24. QtHttps::~QtHttps()
  25. {
  26. delete m_manager;
  27. if(m_file != nullptr)
  28. {
  29. if(m_file->isOpen())
  30. {
  31. m_file->close();
  32. }
  33. delete m_file;
  34. m_file = nullptr;
  35. }
  36. if(m_reply != nullptr)
  37. {
  38. m_reply->deleteLater();
  39. m_reply = nullptr;
  40. }
  41. }
  42. bool QtHttps::Get(const QString &url)
  43. {
  44. if(m_manager == nullptr)
  45. {
  46. LOG_WARN("m_manager is nullptr");
  47. return false;
  48. }
  49. QNetworkRequest request;
  50. request.setUrl(QUrl(url));
  51. /* 等待返回 */
  52. m_reply = m_manager->get(request);
  53. connect(m_reply, &QNetworkReply::finished, this, &QtHttps::do_replyFinished);
  54. connect(m_reply, &QNetworkReply::readyRead, this, &QtHttps::do_replyReadyRead);
  55. connect(m_reply, &QNetworkReply::downloadProgress, this, &QtHttps::do_downloadProgress);
  56. /* 转发信号 */
  57. connect(m_reply, &QNetworkReply::downloadProgress, this, &QtHttps::signal_downloadProgress);
  58. connect(m_reply, &QNetworkReply::finished, this, &QtHttps::signal_replyFinished);
  59. return true;
  60. }
  61. /* 获取请求头信息 */
  62. bool QtHttps::GetHead(const QString &url)
  63. {
  64. if(m_manager == nullptr)
  65. {
  66. LOG_WARN("m_manager is nullptr");
  67. return false;
  68. }
  69. QNetworkRequest request;
  70. // QSslConfiguration conf = request.sslConfiguration();
  71. // conf.setPeerVerifyMode(QSslSocket::VerifyNone);
  72. // conf.setProtocol(QSsl::TlsV1SslV3);
  73. // request.setSslConfiguration(conf);
  74. request.setUrl(url);
  75. m_reply = m_manager->head(request);
  76. connect(m_reply, &QNetworkReply::finished, this, &QtHttps::do_replyFinished);
  77. connect(m_reply, &QNetworkReply::readyRead, this, &QtHttps::do_replyReadyRead);
  78. // connect(m_reply, &QNetworkReply::downloadProgress, this, &QtHttps::do_downloadProgress);
  79. /* 转发信号 */
  80. connect(m_reply, &QNetworkReply::downloadProgress, this, &QtHttps::signal_downloadProgress);
  81. connect(m_reply, &QNetworkReply::finished, this, &QtHttps::signal_replyFinished);
  82. return true;
  83. }
  84. void QtHttps::Post(const QString &url, const QByteArray &data)
  85. {
  86. }
  87. /* 下载文件 */
  88. void QtHttps::downloadFile(const QString &url, const QString &filePath)
  89. {
  90. if(m_manager == nullptr)
  91. {
  92. LOG_WARN("m_manager is nullptr");
  93. return;
  94. }
  95. /* 检查文件有效性 */
  96. m_file = new QFile(this);
  97. m_file->setFileName(filePath);
  98. if(!m_file->open(QIODevice::WriteOnly | QIODevice::Truncate))
  99. {
  100. LOG_WARN("open file failed , file path : " + filePath);
  101. m_file->close();
  102. delete m_file;
  103. m_file = nullptr;
  104. return;
  105. }
  106. /* 发送请求 */
  107. QNetworkRequest request;
  108. request.setUrl(QUrl(url));
  109. m_reply = m_manager->get(request);
  110. /* 链接信号和槽 */
  111. connect(m_reply, &QNetworkReply::finished, this, &QtHttps::do_replyFinished);
  112. connect(m_reply, &QNetworkReply::readyRead, this, &QtHttps::do_replyReadyRead);
  113. connect(m_reply, &QNetworkReply::downloadProgress, this, &QtHttps::do_downloadProgress);
  114. /* 转发信号 */
  115. connect(m_reply, &QNetworkReply::downloadProgress, this, &QtHttps::signal_downloadProgress);
  116. connect(m_reply, &QNetworkReply::finished, this, &QtHttps::signal_replyFinished);
  117. }
  118. /* 请求完成的槽函数 */
  119. void QtHttps::do_replyFinished()
  120. {
  121. LOG_DEBUG("do_replyFinished");
  122. /* 获取状态码 */
  123. auto retCode = m_reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
  124. if(m_reply->error() == QNetworkReply::NoError)
  125. {
  126. LOG_DEBUG("reply : " + QString::number(retCode));
  127. auto list = m_reply->rawHeaderList();
  128. for(auto &item : list)
  129. {
  130. SPDLOG_INFO("{} : {}", item.toStdString(), m_reply->rawHeader(item).toStdString());
  131. // LOG_DEBUG(item + " : " + m_reply->rawHeader(item));
  132. }
  133. /* 检查文件是否打开 */
  134. if(m_file != nullptr)
  135. {
  136. if(m_file->isOpen())
  137. {
  138. m_file->close();
  139. }
  140. delete m_file;
  141. m_file = nullptr;
  142. }
  143. }
  144. else
  145. {
  146. LOG_WARN("reply error : " + QString::number(retCode) + " " + m_reply->errorString());
  147. }
  148. /* 检查文件是否打开 */
  149. if(m_file != nullptr)
  150. {
  151. if(m_file->isOpen())
  152. {
  153. m_file->close();
  154. }
  155. delete m_file;
  156. m_file = nullptr;
  157. }
  158. /* 记得设置这个,需要手动释放 */
  159. m_reply->deleteLater();
  160. m_reply = nullptr;
  161. }
  162. /* 读取数据 */
  163. void QtHttps::do_replyReadyRead()
  164. {
  165. // LOG_DEBUG("do_replyReadyRead");
  166. if(m_file != nullptr)
  167. {
  168. m_file->write(m_reply->readAll());
  169. }
  170. }
  171. /* 下载进度 */
  172. void QtHttps::do_downloadProgress(qint64 bytesReceived, qint64 bytesTotal)
  173. {
  174. LOG_DEBUG("do_downloadProgress");
  175. LOG_DEBUG("bytesReceived : " + QString::number(bytesReceived));
  176. LOG_DEBUG("bytesTotal : " + QString::number(bytesTotal));
  177. }
  178. void QtHttps::do_error(QNetworkReply::NetworkError code)
  179. {
  180. }