forked from ondra/server-sdk
96 lines
2.7 KiB
C++
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
|