1 #include "networkaccess.h"
9 const QString USER_AGENT = QString(Constants::APP_NAME)
10 + " " + Constants::VERSION
11 + " (" + Constants::WEBSITE + ")";
13 NetworkReply::NetworkReply(QNetworkReply *networkReply) : QObject(networkReply) {
14 this->networkReply = networkReply;
17 void NetworkReply::finished() {
19 QUrl redirection = networkReply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl();
20 if (redirection.isValid()) {
22 // qDebug() << "Redirect!"; // << redirection;
24 QNetworkReply *redirectReply = The::http()->simpleGet(redirection, networkReply->operation());
26 setParent(redirectReply);
27 networkReply->deleteLater();
28 networkReply = redirectReply;
30 // when the request is finished we'll invoke the target method
31 connect(networkReply, SIGNAL(finished()), this, SLOT(finished()), Qt::AutoConnection);
37 emit finished(networkReply);
39 // get the HTTP response body
40 QByteArray bytes = networkReply->readAll();
45 // this will also delete this NetworkReply as the QNetworkReply is its parent
46 networkReply->deleteLater();
49 void NetworkReply::requestError(QNetworkReply::NetworkError code) {
50 emit error(networkReply);
53 /* --- NetworkAccess --- */
55 NetworkAccess::NetworkAccess( QObject* parent) : QObject( parent ) {}
57 QNetworkReply* NetworkAccess::simpleGet(QUrl url, int operation) {
59 QNetworkAccessManager *manager = The::networkAccessManager();
61 QNetworkRequest request(url);
62 request.setRawHeader("User-Agent", USER_AGENT.toUtf8());
63 request.setRawHeader("Connection", "Keep-Alive");
65 QNetworkReply *networkReply;
68 case QNetworkAccessManager::GetOperation:
69 qDebug() << "GET" << url.toString();
70 networkReply = manager->get(request);
73 case QNetworkAccessManager::HeadOperation:
74 qDebug() << "HEAD" << url.toString();
75 networkReply = manager->head(request);
79 qDebug() << "Unknown operation:" << operation;
85 connect(networkReply, SIGNAL(error(QNetworkReply::NetworkError)),
86 this, SLOT(error(QNetworkReply::NetworkError)));
92 NetworkReply* NetworkAccess::get(const QUrl url) {
94 QNetworkReply *networkReply = simpleGet(url);
95 NetworkReply *reply = new NetworkReply(networkReply);
98 connect(networkReply, SIGNAL(error(QNetworkReply::NetworkError)),
99 reply, SLOT(requestError(QNetworkReply::NetworkError)));
101 // when the request is finished we'll invoke the target method
102 connect(networkReply, SIGNAL(finished()), reply, SLOT(finished()), Qt::AutoConnection);
108 NetworkReply* NetworkAccess::head(const QUrl url) {
110 QNetworkReply *networkReply = simpleGet(url, QNetworkAccessManager::HeadOperation);
111 NetworkReply *reply = new NetworkReply(networkReply);
114 connect(networkReply, SIGNAL(error(QNetworkReply::NetworkError)),
115 reply, SLOT(requestError(QNetworkReply::NetworkError)));
117 // when the request is finished we'll invoke the target method
118 connect(networkReply, SIGNAL(finished()), reply, SLOT(finished()), Qt::AutoConnection);
127 QNetworkReply* NetworkAccess::syncGet(QUrl url) {
131 networkReply = simpleGet(url);
132 connect(networkReply, SIGNAL(metaDataChanged()),
133 this, SLOT(syncMetaDataChanged()), Qt::AutoConnection);
134 connect(networkReply, SIGNAL(finished()),
135 this, SLOT(syncFinished()), Qt::AutoConnection);
136 connect(networkReply, SIGNAL(error(QNetworkReply::NetworkError)),
137 this, SLOT(error(QNetworkReply::NetworkError)));
139 // A little trick to make this function blocking
141 // Do something else, maybe even network processing events
142 qApp->processEvents();
145 networkReply->deleteLater();
150 void NetworkAccess::syncMetaDataChanged() {
152 QUrl redirection = networkReply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl();
153 if (redirection.isValid()) {
155 qDebug() << "Redirect" << redirection;
156 networkReply->deleteLater();
157 syncGet(redirection);
160 QNetworkAccessManager *manager = The::networkAccessManager();
161 networkReply->deleteLater();
162 networkReply = manager->get(QNetworkRequest(redirection));
163 connect(networkReply, SIGNAL(metaDataChanged()),
164 this, SLOT(metaDataChanged()), Qt::AutoConnection);
165 connect(networkReply, SIGNAL(finished()),
166 this, SLOT(finished()), Qt::AutoConnection);
172 void NetworkAccess::syncFinished() {
177 void NetworkAccess::error(QNetworkReply::NetworkError code) {
178 // get the QNetworkReply that sent the signal
179 QNetworkReply *networkReply = static_cast<QNetworkReply *>(sender());
181 qDebug() << "Cannot get sender";
186 if (networkReply->operation() == QNetworkAccessManager::HeadOperation)
189 // report the error in the status bar
190 QMainWindow* mainWindow = dynamic_cast<QMainWindow*>(qApp->topLevelWidgets().first());
191 if (mainWindow) mainWindow->statusBar()->showMessage(
192 tr("Network error: %1").arg(networkReply->errorString()));
194 qDebug() << "Network error:" << networkReply->errorString() << code;
196 networkReply->deleteLater();
199 QByteArray NetworkAccess::syncGetBytes(QUrl url) {
200 return syncGet(url)->readAll();
203 QString NetworkAccess::syncGetString(QUrl url) {
204 return QString::fromUtf8(syncGetBytes(url));