1 #include "networkaccess.h"
10 const QString USER_AGENT = QString(Constants::NAME)
11 + " " + Constants::VERSION
12 + " (" + Constants::WEBSITE + ")";
15 const QString USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11";
17 NetworkReply::NetworkReply(QNetworkReply *networkReply) :
18 QObject(networkReply),
19 networkReply(networkReply),
24 readTimeoutTimer = new QTimer(this);
25 readTimeoutTimer->setInterval(10000);
26 readTimeoutTimer->setSingleShot(true);
27 connect(readTimeoutTimer, SIGNAL(timeout()), SLOT(readTimeout()), Qt::UniqueConnection);
28 readTimeoutTimer->start();
31 void NetworkReply::setupReply() {
32 connect(networkReply, SIGNAL(error(QNetworkReply::NetworkError)),
33 SLOT(requestError(QNetworkReply::NetworkError)), Qt::UniqueConnection);
34 connect(networkReply, SIGNAL(finished()),
35 SLOT(finished()), Qt::UniqueConnection);
36 connect(networkReply, SIGNAL(downloadProgress(qint64,qint64)),
37 SLOT(downloadProgress(qint64,qint64)), Qt::UniqueConnection);
40 void NetworkReply::finished() {
41 QUrl redirection = networkReply->attribute(
42 QNetworkRequest::RedirectionTargetAttribute).toUrl();
43 if (redirection.isValid()) {
44 if (networkReply->operation() == QNetworkAccessManager::GetOperation
45 || networkReply->operation() == QNetworkAccessManager::HeadOperation) {
46 QNetworkReply *redirectReply =
47 The::http()->request(redirection, networkReply->operation());
48 setParent(redirectReply);
49 networkReply->deleteLater();
50 networkReply = redirectReply;
52 readTimeoutTimer->start();
54 } else qWarning() << "Redirection not supported" << networkReply->url().toEncoded();
57 if (receivers(SIGNAL(data(QByteArray))) > 0)
58 emit data(networkReply->readAll());
59 else if (receivers(SIGNAL(finished(QNetworkReply*))) > 0)
60 emit finished(networkReply);
62 #ifndef QT_NO_DEBUG_OUTPUT
63 if (!networkReply->attribute(QNetworkRequest::SourceIsFromCacheAttribute).toBool())
64 qDebug() << networkReply->url().toEncoded();
68 // this will also delete this NetworkReply as the QNetworkReply is its parent
69 networkReply->deleteLater();
72 void NetworkReply::requestError(QNetworkReply::NetworkError code) {
73 qDebug() << networkReply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt()
74 << networkReply->errorString() << code;
75 emit error(networkReply);
78 void NetworkReply::downloadProgress(qint64 bytesReceived, qint64 /* bytesTotal */) {
79 // qDebug() << "Downloading" << bytesReceived << bytesTotal << networkReply->url();
80 if (bytesReceived > 0 && readTimeoutTimer->isActive()) {
81 readTimeoutTimer->stop();
82 disconnect(networkReply, SIGNAL(downloadProgress(qint64,qint64)),
83 this, SLOT(downloadProgress(qint64,qint64)));
87 void NetworkReply::readTimeout() {
88 networkReply->disconnect();
89 networkReply->abort();
90 networkReply->deleteLater();
92 if (networkReply->operation() != QNetworkAccessManager::GetOperation
93 || networkReply->operation() != QNetworkAccessManager::HeadOperation) {
94 emit error(networkReply);
99 emit error(networkReply);
102 QNetworkReply *retryReply = The::http()->request(networkReply->url(), networkReply->operation());
103 setParent(retryReply);
104 networkReply = retryReply;
107 readTimeoutTimer->start();
110 /* --- NetworkAccess --- */
112 NetworkAccess::NetworkAccess( QObject* parent) : QObject( parent ) {}
114 QNetworkRequest NetworkAccess::buildRequest(QUrl url) {
115 QNetworkRequest request(url);
116 request.setRawHeader("User-Agent", USER_AGENT.toUtf8());
117 request.setRawHeader("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7");
118 request.setRawHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
119 request.setRawHeader("Accept-Language", "en-us,en;q=0.5");
120 request.setRawHeader("Connection", "Keep-Alive");
124 QNetworkReply* NetworkAccess::request(QUrl url, int operation, const QByteArray& body) {
125 QNetworkAccessManager *manager = The::networkAccessManager();
127 QNetworkRequest request = buildRequest(url);
129 QNetworkReply *networkReply;
132 case QNetworkAccessManager::GetOperation:
133 networkReply = manager->get(request);
136 case QNetworkAccessManager::HeadOperation:
137 networkReply = manager->head(request);
140 case QNetworkAccessManager::PostOperation:
142 request.setRawHeader("Content-Type", "application/x-www-form-urlencoded");
143 networkReply = manager->post(request, body);
147 qWarning() << "Unknown operation:" << operation;
154 NetworkReply* NetworkAccess::get(const QUrl url) {
155 QNetworkReply *networkReply = request(url);
156 return new NetworkReply(networkReply);
159 NetworkReply* NetworkAccess::head(const QUrl url) {
160 QNetworkReply *networkReply = request(url, QNetworkAccessManager::HeadOperation);
161 return new NetworkReply(networkReply);
164 NetworkReply* NetworkAccess::post(const QUrl url, const QMap<QString, QString>& params) {
166 QMapIterator<QString, QString> i(params);
167 while (i.hasNext()) {
169 body += QUrl::toPercentEncoding(i.key())
171 + QUrl::toPercentEncoding(i.value())
174 QNetworkReply *networkReply = request(url, QNetworkAccessManager::PostOperation, body);
175 return new NetworkReply(networkReply);