NetworkAccess* http();
}
+/*
const QString USER_AGENT = QString(Constants::APP_NAME)
+ " " + Constants::VERSION
+ " (" + Constants::WEBSITE + ")";
+*/
+
+const QString USER_AGENT = "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.237 Safari/534.10";
NetworkReply::NetworkReply(QNetworkReply *networkReply) : QObject(networkReply) {
this->networkReply = networkReply;
+
+ // monitor downloadProgress to impl timeout
+ connect(networkReply, SIGNAL(downloadProgress(qint64,qint64)),
+ SLOT(downloadProgress(qint64,qint64)), Qt::AutoConnection);
+
+ readTimeoutTimer = new QTimer(this);
+ readTimeoutTimer->setInterval(5000);
+ readTimeoutTimer->setSingleShot(true);
+ connect(readTimeoutTimer, SIGNAL(timeout()), SLOT(readTimeout()));
+ readTimeoutTimer->start();
}
void NetworkReply::finished() {
// when the request is finished we'll invoke the target method
connect(networkReply, SIGNAL(finished()), this, SLOT(finished()), Qt::AutoConnection);
+ // monitor downloadProgress to impl timeout
+ connect(networkReply, SIGNAL(downloadProgress(qint64,qint64)),
+ SLOT(downloadProgress(qint64,qint64)), Qt::AutoConnection);
+ readTimeoutTimer->start();
+
+ // error signal
+ connect(networkReply, SIGNAL(error(QNetworkReply::NetworkError)),
+ SLOT(requestError(QNetworkReply::NetworkError)));
+
return;
}
networkReply->deleteLater();
}
-void NetworkReply::requestError(QNetworkReply::NetworkError code) {
+void NetworkReply::requestError(QNetworkReply::NetworkError /* code */) {
emit error(networkReply);
}
+void NetworkReply::downloadProgress(qint64 bytesReceived, qint64 /* bytesTotal */) {
+ // qDebug() << "Downloading" << bytesReceived << bytesTotal;
+ if (bytesReceived > 0) {
+ readTimeoutTimer->stop();
+ disconnect(networkReply, SIGNAL(downloadProgress(qint64,qint64)),
+ this, SLOT(downloadProgress(qint64,qint64)));
+ }
+}
+
+void NetworkReply::readTimeout() {
+ // qDebug() << "HTTP read timeout" << networkReply->url();
+ networkReply->disconnect();
+ networkReply->abort();
+
+ QNetworkReply *retryReply = The::http()->simpleGet(networkReply->url(), networkReply->operation());
+
+ setParent(retryReply);
+ networkReply->deleteLater();
+ networkReply = retryReply;
+
+ // when the request is finished we'll invoke the target method
+ connect(networkReply, SIGNAL(finished()), this, SLOT(finished()), Qt::AutoConnection);
+
+ // monitor downloadProgress to impl timeout
+ connect(networkReply, SIGNAL(downloadProgress(qint64,qint64)),
+ SLOT(downloadProgress(qint64,qint64)), Qt::AutoConnection);
+ readTimeoutTimer->start();
+
+ // error signal
+ connect(networkReply, SIGNAL(error(QNetworkReply::NetworkError)),
+ SLOT(requestError(QNetworkReply::NetworkError)));
+
+ // emit error(networkReply);
+}
+
/* --- NetworkAccess --- */
NetworkAccess::NetworkAccess( QObject* parent) : QObject( parent ) {}
-QNetworkReply* NetworkAccess::simpleGet(QUrl url, int operation) {
+QNetworkReply* NetworkAccess::manualGet(QNetworkRequest request, int operation) {
QNetworkAccessManager *manager = The::networkAccessManager();
-
- QNetworkRequest request(url);
- request.setRawHeader("User-Agent", USER_AGENT.toUtf8());
- request.setRawHeader("Connection", "Keep-Alive");
+ // manager->setCookieJar(new QNetworkCookieJar());
QNetworkReply *networkReply;
switch (operation) {
case QNetworkAccessManager::GetOperation:
- qDebug() << "GET" << url.toString();
+ qDebug() << "GET" << request.url().toEncoded();
networkReply = manager->get(request);
break;
case QNetworkAccessManager::HeadOperation:
- qDebug() << "HEAD" << url.toString();
+ qDebug() << "HEAD" << request.url().toEncoded();
networkReply = manager->head(request);
break;
this, SLOT(error(QNetworkReply::NetworkError)));
return networkReply;
+}
+
+QNetworkReply* NetworkAccess::simpleGet(QUrl url, int operation) {
+
+ QNetworkRequest request(url);
+ request.setRawHeader("User-Agent", USER_AGENT.toUtf8());
+ request.setRawHeader("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7");
+ request.setRawHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
+ request.setRawHeader("Accept-Language", "en-us,en;q=0.5");
+ request.setRawHeader("Connection", "Keep-Alive");
+ return manualGet(request, operation);
}
NetworkReply* NetworkAccess::get(const QUrl url) {