#include "requestmanager.h" #include "request.h" #ifdef CORESDK_ZLIB #include "compression.h" #endif #include namespace core { /** * @brief Wrapper around QNetworkAccessManger to handle soap protocol * @param parent */ RequestManager::RequestManager(QObject *parent) : QObject(parent) { connect(&mNetworkAccessManager, &QNetworkAccessManager::authenticationRequired, [](){ qCWarning(sdknetwork) << "server need authentication"; }); } /** * @brief Soap::downloadRequest * @param soapRequest */ void RequestManager::downloadRequest(const std::shared_ptr& request) { QNetworkReply *reply = mNetworkAccessManager.post(request->networkRequest(), request->requestData()); mRequestMap.insert(reply, request); connect(reply, &QNetworkReply::sslErrors, this, &RequestManager::sslErrors); connect(reply, &QNetworkReply::downloadProgress, this, &RequestManager::downloadProgress); connect(reply, &QNetworkReply::finished, this, [=]() { std::shared_ptr request = mRequestMap.value(reply); mRequestMap.remove(reply); reply->deleteLater(); emit request->finished(); emit downloadFinished(request); }); } /** * @brief Handle sslErrors -> only debug output * @param sslErrors ( from QNetworkReply::sslErrors ) */ void RequestManager::sslErrors(const QList &sslErrors) { for (const QSslError &error : sslErrors) { qCDebug(sdknetwork) << QStringLiteral("SSL error:") << error.errorString(); } } /** * @brief called upon download progess -> adding data into QByteArray * @param bytesReceived ( can be different from actual data -> compression ) * @param bytesTotal ( can be different from actual data -> compression ) */ void RequestManager::downloadProgress(qint64 bytesReceived, qint64 bytesTotal) { // Get Reply ( now only one ) //Q_ASSERT(mCurrentReply); auto *reply = qobject_cast(sender()); Q_ASSERT(mRequestMap.contains(reply)); std::shared_ptr request = mRequestMap.value(reply); //Q_ASSERT(reply == mCurrentReply); QString encoding; // Check encoding for (const auto & pair : reply->rawHeaderPairs()) { if (pair.first == QStringLiteral("Content-Encoding")) { encoding = pair.second; } } QByteArray data = reply->readAll(); // Decompress gzip data #ifdef CORESDK_ZLIB if (encoding.toLower() == "gzip" && !data.isEmpty() ) { data = Compression::decompress(data); } #endif // Append data to request request->appendData(data); emit progresss(bytesReceived, bytesTotal); } } // core