summaryrefslogtreecommitdiff
path: root/src/nexusinterface.cpp
diff options
context:
space:
mode:
authorSilarn <jrim@rimpo.org>2019-01-28 13:19:26 -0600
committerSilarn <jrim@rimpo.org>2019-02-18 21:28:07 -0600
commit72de94ee89887c0956a9b76a4d5e97b655b9b26a (patch)
tree5d794ca7c09a5840021c54a2a60624126370173e /src/nexusinterface.cpp
parent56f9ba159b72a303ea388f466fa4e5ed57a6f45b (diff)
Add a retry for rate limited requests and requeue requests with 429 err
Diffstat (limited to 'src/nexusinterface.cpp')
-rw-r--r--src/nexusinterface.cpp14
1 files changed, 11 insertions, 3 deletions
diff --git a/src/nexusinterface.cpp b/src/nexusinterface.cpp
index 080b4f7e..0b0d990c 100644
--- a/src/nexusinterface.cpp
+++ b/src/nexusinterface.cpp
@@ -155,6 +155,10 @@ NexusInterface::NexusInterface(PluginContainer *pluginContainer)
m_AccessManager = new NXMAccessManager(this, m_MOVersion.displayString(3));
m_DiskCache = new QNetworkDiskCache(this);
connect(m_AccessManager, SIGNAL(requestNXMDownload(QString)), this, SLOT(downloadRequestedNXM(QString)));
+
+ m_RetryTimer.setSingleShot(true);
+ m_RetryTimer.setInterval(1000);
+ m_RetryTimer.callOnTimeout(this, &NexusInterface::nextRequest);
}
NXMAccessManager *NexusInterface::getAccessManager()
@@ -471,6 +475,7 @@ void NexusInterface::nextRequest()
if (m_RemainingRequests <= 0) {
qWarning() << tr("You've exceeded the Nexus API rate limit and requests are now being throttled.");
+ m_RetryTimer.start();
return;
}
@@ -551,12 +556,15 @@ void NexusInterface::requestFinished(std::list<NXMRequestInfo>::iterator iter)
QNetworkReply *reply = iter->m_Reply;
if (reply->error() != QNetworkReply::NoError) {
- qWarning("request failed: %s", reply->errorString().toUtf8().constData());
- emit nxmRequestFailed(iter->m_GameName, iter->m_ModID, iter->m_FileID, iter->m_UserData, iter->m_ID, reply->error(), reply->errorString());
int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
if (statusCode == 429) {
m_RemainingRequests = 0;
- qWarning() << tr("Requests have hit the rate limit threshold and are now being throttled.");
+ qWarning("Requests have hit the rate limit threshold and are now being throttled. This request will be retried.");
+ qWarning("Error: %s", reply->errorString().toUtf8().constData());
+ m_RequestQueue.enqueue(*iter);
+ } else {
+ qWarning("request failed: %s", reply->errorString().toUtf8().constData());
+ emit nxmRequestFailed(iter->m_GameName, iter->m_ModID, iter->m_FileID, iter->m_UserData, iter->m_ID, reply->error(), reply->errorString());
}
} else {
int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();