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) : QObject(networkReply) {
18 this->networkReply = networkReply;
21 readTimeoutTimer = new QTimer(this);
22 readTimeoutTimer->setInterval(10000);
23 readTimeoutTimer->setSingleShot(true);
24 connect(readTimeoutTimer, SIGNAL(timeout()), SLOT(readTimeout()), Qt::UniqueConnection);
25 readTimeoutTimer->start();
28 void NetworkReply::setupReply() {
29 connect(networkReply, SIGNAL(error(QNetworkReply::NetworkError)),
30 SLOT(requestError(QNetworkReply::NetworkError)), Qt::UniqueConnection);
31 connect(networkReply, SIGNAL(finished()),
32 SLOT(finished()), Qt::UniqueConnection);
33 connect(networkReply, SIGNAL(downloadProgress(qint64,qint64)),
34 SLOT(downloadProgress(qint64,qint64)), Qt::UniqueConnection);
37 void NetworkReply::finished() {
38 QUrl redirection = networkReply->attribute(
39 QNetworkRequest::RedirectionTargetAttribute).toUrl();
40 if (redirection.isValid()) {
41 if (networkReply->operation() == QNetworkAccessManager::GetOperation
42 || networkReply->operation() == QNetworkAccessManager::HeadOperation) {
43 QNetworkReply *redirectReply =
44 The::http()->request(redirection, networkReply->operation());
45 setParent(redirectReply);
46 networkReply->deleteLater();
47 networkReply = redirectReply;
49 readTimeoutTimer->start();
51 } else qWarning("Redirection not supported");
54 if (receivers(SIGNAL(data(QByteArray))) > 0)
55 emit data(networkReply->readAll());
56 else if (receivers(SIGNAL(finished(QNetworkReply*))) > 0)
57 emit finished(networkReply);
59 #ifndef QT_NO_DEBUG_OUTPUT
60 if (!networkReply->attribute(QNetworkRequest::SourceIsFromCacheAttribute).toBool())
61 qDebug() << networkReply->url().toEncoded();
65 // this will also delete this NetworkReply as the QNetworkReply is its parent
66 networkReply->deleteLater();
69 void NetworkReply::requestError(QNetworkReply::NetworkError code) {
70 qDebug() << networkReply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt()
71 << networkReply->errorString() << code;
72 emit error(networkReply);
75 void NetworkReply::downloadProgress(qint64 bytesReceived, qint64 /* bytesTotal */) {
76 // qDebug() << "Downloading" << bytesReceived << bytesTotal << networkReply->url();
77 if (bytesReceived > 0 && readTimeoutTimer->isActive()) {
78 readTimeoutTimer->stop();
79 disconnect(networkReply, SIGNAL(downloadProgress(qint64,qint64)),
80 this, SLOT(downloadProgress(qint64,qint64)));
84 void NetworkReply::readTimeout() {
85 networkReply->disconnect();
86 networkReply->abort();
87 networkReply->deleteLater();
89 if (networkReply->operation() != QNetworkAccessManager::GetOperation
90 || networkReply->operation() != QNetworkAccessManager::HeadOperation) {
91 emit error(networkReply);
95 QNetworkReply *retryReply = The::http()->request(networkReply->url(), networkReply->operation());
96 setParent(retryReply);
97 networkReply = retryReply;
101 /* --- NetworkAccess --- */
103 NetworkAccess::NetworkAccess( QObject* parent) : QObject( parent ) {}
105 QNetworkRequest NetworkAccess::buildRequest(QUrl url) {
106 QNetworkRequest request(url);
107 request.setRawHeader("User-Agent", USER_AGENT.toUtf8());
108 request.setRawHeader("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7");
109 request.setRawHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
110 request.setRawHeader("Accept-Language", "en-us,en;q=0.5");
111 request.setRawHeader("Connection", "Keep-Alive");
115 QNetworkReply* NetworkAccess::request(QUrl url, int operation, const QByteArray& body) {
116 QNetworkAccessManager *manager = The::networkAccessManager();
118 QNetworkRequest request = buildRequest(url);
120 QNetworkReply *networkReply;
123 case QNetworkAccessManager::GetOperation:
124 networkReply = manager->get(request);
127 case QNetworkAccessManager::HeadOperation:
128 networkReply = manager->head(request);
131 case QNetworkAccessManager::PostOperation:
133 request.setRawHeader("Content-Type", "application/x-www-form-urlencoded");
134 networkReply = manager->post(request, body);
138 qWarning() << "Unknown operation:" << operation;
145 NetworkReply* NetworkAccess::get(const QUrl url) {
146 QNetworkReply *networkReply = request(url);
147 return new NetworkReply(networkReply);
150 NetworkReply* NetworkAccess::head(const QUrl url) {
151 QNetworkReply *networkReply = request(url, QNetworkAccessManager::HeadOperation);
152 return new NetworkReply(networkReply);
155 NetworkReply* NetworkAccess::post(const QUrl url, const QMap<QString, QString>& params) {
157 QMapIterator<QString, QString> i(params);
158 while (i.hasNext()) {
160 body += QUrl::toPercentEncoding(i.key())
162 + QUrl::toPercentEncoding(i.value())
165 QNetworkReply *networkReply = request(url, QNetworkAccessManager::PostOperation, body);
166 return new NetworkReply(networkReply);