#include "QtHttps.h" #include "lightlog.h" #include #include "spdlog/spdlog.h" QtHttps::QtHttps(QObject *parent) : QObject(parent) { /* 初始化函数 */ m_manager = new QNetworkAccessManager(this); /* 检查是否支持OpenSSL */ bool isSupport = QSslSocket::supportsSsl(); QString opensslVersion = QSslSocket::sslLibraryVersionString(); QString openSSLBuildVersion = QSslSocket::sslLibraryBuildVersionString(); LOG_INFO("OpenSSL is support : " + QString::number(isSupport)); LOG_INFO("OpenSSL version : " + opensslVersion); LOG_INFO("OpenSSL build version : " + openSSLBuildVersion); /* 查看支持的协议 */ auto list = m_manager->supportedSchemes(); for(auto &item : list) { LOG_INFO("supportedSchemes : " + item); } } QtHttps::~QtHttps() { delete m_manager; if(m_file != nullptr) { if(m_file->isOpen()) { m_file->close(); } delete m_file; m_file = nullptr; } if(m_reply != nullptr) { m_reply->deleteLater(); m_reply = nullptr; } } bool QtHttps::Get(const QString &url) { if(m_manager == nullptr) { LOG_WARN("m_manager is nullptr"); return false; } QNetworkRequest request; request.setUrl(QUrl(url)); /* 等待返回 */ m_reply = m_manager->get(request); connect(m_reply, &QNetworkReply::finished, this, &QtHttps::do_replyFinished); connect(m_reply, &QNetworkReply::readyRead, this, &QtHttps::do_replyReadyRead); connect(m_reply, &QNetworkReply::downloadProgress, this, &QtHttps::do_downloadProgress); /* 转发信号 */ connect(m_reply, &QNetworkReply::downloadProgress, this, &QtHttps::signal_downloadProgress); connect(m_reply, &QNetworkReply::finished, this, &QtHttps::signal_replyFinished); return true; } /* 获取请求头信息 */ bool QtHttps::GetHead(const QString &url) { if(m_manager == nullptr) { LOG_WARN("m_manager is nullptr"); return false; } QNetworkRequest request; // QSslConfiguration conf = request.sslConfiguration(); // conf.setPeerVerifyMode(QSslSocket::VerifyNone); // conf.setProtocol(QSsl::TlsV1SslV3); // request.setSslConfiguration(conf); request.setUrl(url); m_reply = m_manager->head(request); connect(m_reply, &QNetworkReply::finished, this, &QtHttps::do_replyFinished); connect(m_reply, &QNetworkReply::readyRead, this, &QtHttps::do_replyReadyRead); // connect(m_reply, &QNetworkReply::downloadProgress, this, &QtHttps::do_downloadProgress); /* 转发信号 */ connect(m_reply, &QNetworkReply::downloadProgress, this, &QtHttps::signal_downloadProgress); connect(m_reply, &QNetworkReply::finished, this, &QtHttps::signal_replyFinished); return true; } void QtHttps::Post(const QString &url, const QByteArray &data) { } /* 下载文件 */ void QtHttps::downloadFile(const QString &url, const QString &filePath) { if(m_manager == nullptr) { LOG_WARN("m_manager is nullptr"); return; } /* 检查文件有效性 */ m_file = new QFile(this); m_file->setFileName(filePath); if(!m_file->open(QIODevice::WriteOnly | QIODevice::Truncate)) { LOG_WARN("open file failed , file path : " + filePath); m_file->close(); delete m_file; m_file = nullptr; return; } /* 发送请求 */ QNetworkRequest request; request.setUrl(QUrl(url)); m_reply = m_manager->get(request); /* 链接信号和槽 */ connect(m_reply, &QNetworkReply::finished, this, &QtHttps::do_replyFinished); connect(m_reply, &QNetworkReply::readyRead, this, &QtHttps::do_replyReadyRead); connect(m_reply, &QNetworkReply::downloadProgress, this, &QtHttps::do_downloadProgress); /* 转发信号 */ connect(m_reply, &QNetworkReply::downloadProgress, this, &QtHttps::signal_downloadProgress); connect(m_reply, &QNetworkReply::finished, this, &QtHttps::signal_replyFinished); } /* 请求完成的槽函数 */ void QtHttps::do_replyFinished() { LOG_DEBUG("do_replyFinished"); /* 获取状态码 */ auto retCode = m_reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); if(m_reply->error() == QNetworkReply::NoError) { LOG_DEBUG("reply : " + QString::number(retCode)); auto list = m_reply->rawHeaderList(); for(auto &item : list) { SPDLOG_INFO("{} : {}", item.toStdString(), m_reply->rawHeader(item).toStdString()); // LOG_DEBUG(item + " : " + m_reply->rawHeader(item)); } /* 检查文件是否打开 */ if(m_file != nullptr) { if(m_file->isOpen()) { m_file->close(); } delete m_file; m_file = nullptr; } } else { LOG_WARN("reply error : " + QString::number(retCode) + " " + m_reply->errorString()); } /* 检查文件是否打开 */ if(m_file != nullptr) { if(m_file->isOpen()) { m_file->close(); } delete m_file; m_file = nullptr; } /* 记得设置这个,需要手动释放 */ m_reply->deleteLater(); m_reply = nullptr; } /* 读取数据 */ void QtHttps::do_replyReadyRead() { // LOG_DEBUG("do_replyReadyRead"); if(m_file != nullptr) { m_file->write(m_reply->readAll()); } } /* 下载进度 */ void QtHttps::do_downloadProgress(qint64 bytesReceived, qint64 bytesTotal) { LOG_DEBUG("do_downloadProgress"); LOG_DEBUG("bytesReceived : " + QString::number(bytesReceived)); LOG_DEBUG("bytesTotal : " + QString::number(bytesTotal)); } void QtHttps::do_error(QNetworkReply::NetworkError code) { }