diff --git a/src/common/NetworkCommon.hpp b/src/common/NetworkCommon.hpp index b214f5472..858069e4e 100644 --- a/src/common/NetworkCommon.hpp +++ b/src/common/NetworkCommon.hpp @@ -10,7 +10,7 @@ class Outcome; class NetworkResult; using NetworkSuccessCallback = std::function; -using NetworkErrorCallback = std::function; +using NetworkErrorCallback = std::function; using NetworkReplyCreatedCallback = std::function; enum class NetworkRequestType { diff --git a/src/common/NetworkPrivate.cpp b/src/common/NetworkPrivate.cpp index 9d0b99f30..b1333cc6e 100644 --- a/src/common/NetworkPrivate.cpp +++ b/src/common/NetworkPrivate.cpp @@ -130,15 +130,16 @@ void loadUncached(const std::shared_ptr &data) if (data->timer_->isActive()) { - QObject::connect(data->timer_, &QTimer::timeout, worker, - [reply, data]() { - log("Aborted!"); - reply->abort(); - if (data->onError_) - { - data->onError_(-2); - } - }); + QObject::connect( + data->timer_, &QTimer::timeout, worker, [reply, data]() { + log("Aborted!"); + reply->abort(); + if (data->onError_) + { + data->onError_( + NetworkResult({}, NetworkResult::timedoutStatus)); + } + }); } if (data->onReplyCreated_) @@ -157,7 +158,7 @@ void loadUncached(const std::shared_ptr &data) { if (data->onError_) { - data->onError_(reply->error()); + data->onError_(NetworkResult({}, reply->error())); } return; } @@ -165,7 +166,10 @@ void loadUncached(const std::shared_ptr &data) QByteArray bytes = reply->readAll(); writeToCache(data, bytes); - NetworkResult result(bytes); + auto status = + reply->attribute(QNetworkRequest::HttpStatusCodeAttribute); + + NetworkResult result(bytes, status.toInt()); DebugCount::increase("http request success"); // log("starting {}", data->request_.url().toString()); @@ -223,7 +227,7 @@ void loadCached(const std::shared_ptr &data) { // XXX: check if bytes is empty? QByteArray bytes = cachedFile.readAll(); - NetworkResult result(bytes); + NetworkResult result(bytes, 200); if (data->onSuccess_) { diff --git a/src/common/NetworkResult.cpp b/src/common/NetworkResult.cpp index 25fa24831..17b12df07 100644 --- a/src/common/NetworkResult.cpp +++ b/src/common/NetworkResult.cpp @@ -8,8 +8,9 @@ namespace chatterino { -NetworkResult::NetworkResult(const QByteArray &data) +NetworkResult::NetworkResult(const QByteArray &data, int status) : data_(data) + , status_(status) { } @@ -57,4 +58,9 @@ const QByteArray &NetworkResult::getData() const return this->data_; } +int NetworkResult::status() const +{ + return this->status_; +} + } // namespace chatterino diff --git a/src/common/NetworkResult.hpp b/src/common/NetworkResult.hpp index df8e28d06..4fcc13b3c 100644 --- a/src/common/NetworkResult.hpp +++ b/src/common/NetworkResult.hpp @@ -8,7 +8,7 @@ namespace chatterino { class NetworkResult { public: - NetworkResult(const QByteArray &data); + NetworkResult(const QByteArray &data, int status); /// Parses the result as json and returns the root as an object. /// Returns empty object if parsing failed. @@ -19,8 +19,12 @@ public: /// Parses the result as json and returns the document. rapidjson::Document parseRapidJson() const; const QByteArray &getData() const; + int status() const; + + static constexpr int timedoutStatus = -2; private: + int status_; QByteArray data_; }; diff --git a/src/messages/Image.cpp b/src/messages/Image.cpp index a0c82418d..675e7d156 100644 --- a/src/messages/Image.cpp +++ b/src/messages/Image.cpp @@ -364,7 +364,7 @@ void Image::actuallyLoad() return Success; }) - .onError([weak = weakOf(this)](auto /*result*/) -> bool { + .onError([weak = weakOf(this)](auto /*result*/) { auto shared = weak.lock(); if (!shared) return false; diff --git a/src/providers/LinkResolver.cpp b/src/providers/LinkResolver.cpp index ee4cee690..50f6c9716 100644 --- a/src/providers/LinkResolver.cpp +++ b/src/providers/LinkResolver.cpp @@ -49,8 +49,6 @@ void LinkResolver::getLinkInfo( }) .onError([successCallback, url](auto /*result*/) { successCallback("No link info found", Link(Link::Url, url)); - - return true; }) .execute(); // }); diff --git a/src/providers/ffz/FfzEmotes.cpp b/src/providers/ffz/FfzEmotes.cpp index f25d03feb..5f2906145 100644 --- a/src/providers/ffz/FfzEmotes.cpp +++ b/src/providers/ffz/FfzEmotes.cpp @@ -203,25 +203,22 @@ void FfzEmotes::loadChannel( return Success; }) - .onError([channelId](int result) { - if (result == 203) + .onError([channelId](NetworkResult result) { + if (result.status() == 203) { // User does not have any FFZ emotes - return true; } - - if (result == -2) + else if (result.status() == NetworkResult::timedoutStatus) { // TODO: Auto retry in case of a timeout, with a delay log("Fetching FFZ emotes for channel {} failed due to timeout", channelId); - return true; } - - log("Error fetching FFZ emotes for channel {}, error {}", channelId, - result); - - return true; + else + { + log("Error fetching FFZ emotes for channel {}, error {}", + channelId, result.status()); + } }) .execute(); } diff --git a/src/providers/twitch/TwitchAccount.cpp b/src/providers/twitch/TwitchAccount.cpp index 3659edb67..2556c35e0 100644 --- a/src/providers/twitch/TwitchAccount.cpp +++ b/src/providers/twitch/TwitchAccount.cpp @@ -170,13 +170,11 @@ void TwitchAccount::ignoreByID( NetworkRequest(url, NetworkRequestType::Put) .authorizeTwitchV5(this->getOAuthClient(), this->getOAuthToken()) - .onError([=](int errorCode) { + .onError([=](NetworkResult result) { onFinished(IgnoreResult_Failed, "An unknown error occured while trying to ignore user " + - targetName + " (" + QString::number(errorCode) + - ")"); - - return true; + targetName + " (" + + QString::number(result.status()) + ")"); }) .onSuccess([=](auto result) -> Outcome { auto document = result.parseRapidJson(); @@ -247,13 +245,11 @@ void TwitchAccount::unignoreByID( NetworkRequest(url, NetworkRequestType::Delete) .authorizeTwitchV5(this->getOAuthClient(), this->getOAuthToken()) - .onError([=](int errorCode) { + .onError([=](NetworkResult result) { onFinished( UnignoreResult_Failed, "An unknown error occured while trying to unignore user " + - targetName + " (" + QString::number(errorCode) + ")"); - - return true; + targetName + " (" + QString::number(result.status()) + ")"); }) .onSuccess([=](auto result) -> Outcome { auto document = result.parseRapidJson(); @@ -281,8 +277,8 @@ void TwitchAccount::checkFollow(const QString targetUserID, NetworkRequest(url) .authorizeTwitchV5(this->getOAuthClient(), this->getOAuthToken()) - .onError([=](int errorCode) { - if (errorCode == 203) + .onError([=](NetworkResult result) { + if (result.status() == 203) { onFinished(FollowResult_NotFollowing); } @@ -290,8 +286,6 @@ void TwitchAccount::checkFollow(const QString targetUserID, { onFinished(FollowResult_Failed); } - - return true; }) .onSuccess([=](auto result) -> Outcome { auto document = result.parseRapidJson(); @@ -328,13 +322,11 @@ void TwitchAccount::unfollowUser(const QString userID, NetworkRequest(requestUrl, NetworkRequestType::Delete) .authorizeTwitchV5(this->getOAuthClient(), this->getOAuthToken()) - .onError([successCallback](int code) { - if (code >= 200 && code <= 299) + .onError([successCallback](NetworkResult result) { + if (result.status() >= 200 && result.status() <= 299) { successCallback(); } - - return true; }) .onSuccess([successCallback](const auto &document) -> Outcome { successCallback(); @@ -370,9 +362,9 @@ void TwitchAccount::loadEmotes() NetworkRequest(url) .authorizeTwitchV5(this->getOAuthClient(), this->getOAuthToken()) - .onError([=](int errorCode) { - log("[TwitchAccount::loadEmotes] Error {}", errorCode); - if (errorCode == 203) + .onError([=](NetworkResult result) { + log("[TwitchAccount::loadEmotes] Error {}", result.status()); + if (result.status() == 203) { // onFinished(FollowResult_NotFollowing); } @@ -380,8 +372,6 @@ void TwitchAccount::loadEmotes() { // onFinished(FollowResult_Failed); } - - return true; }) .onSuccess([=](auto result) -> Outcome { this->parseEmotes(result.parseRapidJson()); @@ -411,9 +401,8 @@ void TwitchAccount::autoModAllow(const QString msgID) .payload(qba) .authorizeTwitchV5(this->getOAuthClient(), this->getOAuthToken()) - .onError([=](int errorCode) { - log("[TwitchAccounts::autoModAllow] Error {}", errorCode); - return true; + .onError([=](NetworkResult result) { + log("[TwitchAccounts::autoModAllow] Error {}", result.status()); }) .execute(); } @@ -431,9 +420,8 @@ void TwitchAccount::autoModDeny(const QString msgID) .payload(qba) .authorizeTwitchV5(this->getOAuthClient(), this->getOAuthToken()) - .onError([=](int errorCode) { - log("[TwitchAccounts::autoModDeny] Error {}", errorCode); - return true; + .onError([=](NetworkResult result) { + log("[TwitchAccounts::autoModDeny] Error {}", result.status()); }) .execute(); } @@ -516,9 +504,8 @@ void TwitchAccount::loadEmoteSetData(std::shared_ptr emoteSet) NetworkRequest(Env::get().twitchEmoteSetResolverUrl.arg(emoteSet->key)) .cache() - .onError([](int errorCode) -> bool { - log("Error code {} while loading emote set data", errorCode); - return true; + .onError([](NetworkResult result) { + log("Error code {} while loading emote set data", result.status()); }) .onSuccess([emoteSet](auto result) -> Outcome { auto root = result.parseRapidJson(); diff --git a/src/singletons/Updates.cpp b/src/singletons/Updates.cpp index b419d5fda..b5fcea2ff 100644 --- a/src/singletons/Updates.cpp +++ b/src/singletons/Updates.cpp @@ -83,7 +83,7 @@ void Updates::installUpdates() NetworkRequest(this->updatePortable_) .timeout(600000) - .onError([this](int) -> bool { + .onError([this](NetworkResult) { this->setStatus_(DownloadFailed); postToThread([] { @@ -94,8 +94,6 @@ void Updates::installUpdates() box->show(); box->raise(); }); - - return true; }) .onSuccess([this](auto result) -> Outcome { QByteArray object = result.getData(); @@ -136,7 +134,7 @@ void Updates::installUpdates() NetworkRequest(this->updateExe_) .timeout(600000) - .onError([this](int) -> bool { + .onError([this](NetworkResult) { this->setStatus_(DownloadFailed); QMessageBox *box = new QMessageBox( @@ -145,7 +143,6 @@ void Updates::installUpdates() "downloading the update."); box->setAttribute(Qt::WA_DeleteOnClose); box->exec(); - return true; }) .onSuccess([this](auto result) -> Outcome { QByteArray object = result.getData(); diff --git a/src/widgets/dialogs/LogsPopup.cpp b/src/widgets/dialogs/LogsPopup.cpp index 0333fbb28..b5d030037 100644 --- a/src/widgets/dialogs/LogsPopup.cpp +++ b/src/widgets/dialogs/LogsPopup.cpp @@ -88,10 +88,7 @@ void LogsPopup::getLogviewerLogs(const QString &roomID) NetworkRequest(url) .caller(this) - .onError([this](int /*errorCode*/) { - this->getOverrustleLogs(); - return true; - }) + .onError([this](NetworkResult) { this->getOverrustleLogs(); }) .onSuccess([this, roomID](auto result) -> Outcome { auto data = result.parseJson(); std::vector messages; @@ -140,7 +137,7 @@ void LogsPopup::getOverrustleLogs() NetworkRequest(url) .caller(this) - .onError([this](int /*errorCode*/) { + .onError([this](NetworkResult) { auto box = new QMessageBox( QMessageBox::Information, "Error getting logs", "No logs could be found for channel " + this->channelName_); @@ -150,8 +147,6 @@ void LogsPopup::getOverrustleLogs() box->raise(); this->close(); box->exec(); - - return true; }) .onSuccess([this](auto result) -> Outcome { auto data = result.parseJson();