1 #include "throttledhttp.h"
5 QElapsedTimer initElapsedTimer() {
12 ThrottledHttp::ThrottledHttp(Http &http) : http(http), elapsedTimer(initElapsedTimer()) {}
14 QObject *ThrottledHttp::request(const HttpRequest &req) {
15 return new ThrottledHttpReply(http, req, milliseconds, elapsedTimer);
18 ThrottledHttpReply::ThrottledHttpReply(Http &http,
19 const HttpRequest &req,
21 QElapsedTimer &elapsedTimer)
22 : http(http), req(req), milliseconds(milliseconds), elapsedTimer(elapsedTimer), timer(0) {
26 void ThrottledHttpReply::checkElapsed() {
29 QMutexLocker locker(&mutex);
32 const qint64 elapsedSinceLastRequest = elapsedTimer.elapsed();
33 if (elapsedSinceLastRequest < milliseconds) {
35 timer = new QTimer(this);
36 timer->setSingleShot(true);
37 timer->setTimerType(Qt::PreciseTimer);
38 connect(timer, SIGNAL(timeout()), SLOT(checkElapsed()));
40 qDebug() << "Throttling" << req.url
41 << QString("%1ms").arg(milliseconds - elapsedSinceLastRequest);
42 timer->setInterval(milliseconds - elapsedSinceLastRequest);
50 void ThrottledHttpReply::doRequest() {
51 QObject *reply = http.request(req);
52 connect(reply, SIGNAL(data(QByteArray)), SIGNAL(data(QByteArray)));
53 connect(reply, SIGNAL(error(QString)), SIGNAL(error(QString)));
54 connect(reply, SIGNAL(finished(HttpReply)), SIGNAL(finished(HttpReply)));
56 // this will cause the deletion of this object once the request is finished