server-sdk/src/core/requestmanager.cpp
2019-11-06 08:57:42 +01:00

96 lines
2.7 KiB
C++

#include "requestmanager.h"
#include "request.h"
#ifdef CORESDK_ZLIB
#include "compression.h"
#endif
#include <memory>
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::processRequest(const std::shared_ptr<Request>& 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> 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<QSslError> &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<QNetworkReply*>(sender());
Q_ASSERT(mRequestMap.contains(reply));
std::shared_ptr<Request> 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