Set a timeout of 5 seconds on musicbrainz network requests. Fixes issue #1390

This commit is contained in:
David Sansome 2011-03-13 13:17:35 +00:00
parent ad7223f8b3
commit db8359838a
6 changed files with 74 additions and 2 deletions

View File

@ -21,6 +21,7 @@
#include <QDir>
#include <QNetworkAccessManager>
#include <QNetworkDiskCache>
#include <QNetworkReply>
#include "utilities.h"
@ -99,3 +100,31 @@ QNetworkReply* NetworkAccessManager::createRequest(
return QNetworkAccessManager::createRequest(op, new_request, outgoingData);
}
NetworkTimeouts::NetworkTimeouts(int timeout_msec, QObject* parent)
: timeout_msec_(timeout_msec) {
}
void NetworkTimeouts::AddReply(QNetworkReply* reply) {
if (timers_.contains(reply))
return;
connect(reply, SIGNAL(destroyed()), SLOT(ReplyFinished()));
connect(reply, SIGNAL(finished()), SLOT(ReplyFinished()));
timers_[reply] = startTimer(timeout_msec_);
}
void NetworkTimeouts::ReplyFinished() {
QNetworkReply* reply = reinterpret_cast<QNetworkReply*>(sender());
if (timers_.contains(reply)) {
killTimer(timers_.take(reply));
}
}
void NetworkTimeouts::timerEvent(QTimerEvent* e) {
QNetworkReply* reply = timers_.key(e->timerId());
if (reply) {
reply->abort();
}
}

View File

@ -54,4 +54,24 @@ protected:
QIODevice* outgoingData);
};
class NetworkTimeouts : public QObject {
Q_OBJECT
public:
NetworkTimeouts(int timeout_msec, QObject* parent = 0);
void AddReply(QNetworkReply* reply);
void SetTimeout(int msec) { timeout_msec_ = msec; }
protected:
void timerEvent(QTimerEvent* e);
private slots:
void ReplyFinished();
private:
int timeout_msec_;
QMap<QNetworkReply*, int> timers_;
};
#endif // NETWORK_H

View File

@ -24,10 +24,12 @@
#include <QtDebug>
const char* MusicBrainzClient::kUrl = "http://musicbrainz.org/ws/1/track/";
const int MusicBrainzClient::kDefaultTimeout = 5000; // msec
MusicBrainzClient::MusicBrainzClient(QObject* parent)
: QObject(parent),
network_(new NetworkAccessManager(this))
network_(new NetworkAccessManager(this)),
timeouts_(new NetworkTimeouts(kDefaultTimeout, this))
{
}
@ -45,6 +47,8 @@ void MusicBrainzClient::Start(int id, const QString& puid) {
QNetworkReply* reply = network_->get(req);
connect(reply, SIGNAL(finished()), SLOT(RequestFinished()));
requests_[reply] = id;
timeouts_->AddReply(reply);
}
void MusicBrainzClient::Cancel(int id) {

View File

@ -22,6 +22,8 @@
#include <QObject>
#include <QXmlStreamReader>
class NetworkTimeouts;
class QNetworkAccessManager;
class QNetworkReply;
@ -73,8 +75,10 @@ private:
private:
static const char* kUrl;
static const int kDefaultTimeout;
QNetworkAccessManager* network_;
NetworkTimeouts* timeouts_;
QMap<QNetworkReply*, int> requests_;
};

View File

@ -25,13 +25,19 @@
const char* MusicDnsClient::kClientId = "c44f70e49000dd7c0d1388bff2bf4152";
const char* MusicDnsClient::kUrl = "http://ofa.musicdns.org/ofa/1/track";
const int MusicDnsClient::kDefaultTimeout = 5000; // msec
MusicDnsClient::MusicDnsClient(QObject* parent)
: QObject(parent),
network_(new NetworkAccessManager(this))
network_(new NetworkAccessManager(this)),
timeouts_(new NetworkTimeouts(kDefaultTimeout, this))
{
}
void MusicDnsClient::SetTimeout(int msec) {
timeouts_->SetTimeout(msec);
}
void MusicDnsClient::Start(int id, const QString& fingerprint, int duration_msec) {
typedef QPair<QString, QString> Param;
@ -58,6 +64,8 @@ void MusicDnsClient::Start(int id, const QString& fingerprint, int duration_msec
QNetworkReply* reply = network_->get(req);
connect(reply, SIGNAL(finished()), SLOT(RequestFinished()));
requests_[reply] = id;
timeouts_->AddReply(reply);
}
void MusicDnsClient::Cancel(int id) {

View File

@ -21,6 +21,8 @@
#include <QMap>
#include <QObject>
class NetworkTimeouts;
class QNetworkAccessManager;
class QNetworkReply;
@ -38,6 +40,9 @@ class MusicDnsClient : public QObject {
public:
MusicDnsClient(QObject* parent = 0);
// Network requests will be aborted after this interval.
void SetTimeout(int msec);
// Starts a request and returns immediately. Finished() will be emitted
// later with the same ID.
void Start(int id, const QString& fingerprint, int duration_msec);
@ -59,8 +64,10 @@ private slots:
private:
static const char* kClientId;
static const char* kUrl;
static const int kDefaultTimeout;
QNetworkAccessManager* network_;
NetworkTimeouts* timeouts_;
QMap<QNetworkReply*, int> requests_;
};