1 #include "networkaccess.h"
10 const QString USER_AGENT = QString(Constants::APP_NAME)
11 + " " + Constants::VERSION
12 + " (" + Constants::WEBSITE + ")";
15 const QString USER_AGENT = "Mozilla/5.0 (X11; U; Linux x86; en-US; rv:1.9.2.12) Gecko/20101028 Firefox/3.6.12";
17 NetworkReply::NetworkReply(QNetworkReply *networkReply) : QObject(networkReply) {
18 this->networkReply = networkReply;
21 void NetworkReply::finished() {
23 QUrl redirection = networkReply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl();
24 if (redirection.isValid()) {
26 // qDebug() << "Redirect!"; // << redirection;
28 QNetworkReply *redirectReply = The::http()->simpleGet(redirection, networkReply->operation());
30 setParent(redirectReply);
31 networkReply->deleteLater();
32 networkReply = redirectReply;
34 // when the request is finished we'll invoke the target method
35 connect(networkReply, SIGNAL(finished()), this, SLOT(finished()), Qt::AutoConnection);
41 emit finished(networkReply);
43 // get the HTTP response body
44 QByteArray bytes = networkReply->readAll();
49 // this will also delete this NetworkReply as the QNetworkReply is its parent
50 networkReply->deleteLater();
53 void NetworkReply::requestError(QNetworkReply::NetworkError code) {
54 emit error(networkReply);
57 /* --- NetworkAccess --- */
59 NetworkAccess::NetworkAccess( QObject* parent) : QObject( parent ) {}
61 QNetworkReply* NetworkAccess::manualGet(QNetworkRequest request, int operation) {
63 QNetworkAccessManager *manager = The::networkAccessManager();
65 QNetworkReply *networkReply;
68 case QNetworkAccessManager::GetOperation:
69 qDebug() << "GET" << request.url().toEncoded();
70 networkReply = manager->get(request);
73 case QNetworkAccessManager::HeadOperation:
74 qDebug() << "HEAD" << request.url().toEncoded();
75 networkReply = manager->head(request);
79 qDebug() << "Unknown operation:" << operation;
85 connect(networkReply, SIGNAL(error(QNetworkReply::NetworkError)),
86 this, SLOT(error(QNetworkReply::NetworkError)));
91 QNetworkReply* NetworkAccess::simpleGet(QUrl url, int operation) {
93 QNetworkRequest request(url);
94 request.setRawHeader("User-Agent", USER_AGENT.toUtf8());
95 request.setRawHeader("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7");
96 request.setRawHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
97 request.setRawHeader("Accept-Language", "en-us,en;q=0.5");
98 // request.setRawHeader("Connection", "Keep-Alive");
100 return manualGet(request, operation);
103 NetworkReply* NetworkAccess::get(const QUrl url) {
105 QNetworkReply *networkReply = simpleGet(url);
106 NetworkReply *reply = new NetworkReply(networkReply);
109 connect(networkReply, SIGNAL(error(QNetworkReply::NetworkError)),
110 reply, SLOT(requestError(QNetworkReply::NetworkError)));
112 // when the request is finished we'll invoke the target method
113 connect(networkReply, SIGNAL(finished()), reply, SLOT(finished()), Qt::AutoConnection);
119 NetworkReply* NetworkAccess::head(const QUrl url) {
121 QNetworkReply *networkReply = simpleGet(url, QNetworkAccessManager::HeadOperation);
122 NetworkReply *reply = new NetworkReply(networkReply);
125 connect(networkReply, SIGNAL(error(QNetworkReply::NetworkError)),
126 reply, SLOT(requestError(QNetworkReply::NetworkError)));
128 // when the request is finished we'll invoke the target method
129 connect(networkReply, SIGNAL(finished()), reply, SLOT(finished()), Qt::AutoConnection);
138 QNetworkReply* NetworkAccess::syncGet(QUrl url) {
142 networkReply = simpleGet(url);
143 connect(networkReply, SIGNAL(metaDataChanged()),
144 this, SLOT(syncMetaDataChanged()), Qt::AutoConnection);
145 connect(networkReply, SIGNAL(finished()),
146 this, SLOT(syncFinished()), Qt::AutoConnection);
147 connect(networkReply, SIGNAL(error(QNetworkReply::NetworkError)),
148 this, SLOT(error(QNetworkReply::NetworkError)));
150 // A little trick to make this function blocking
152 // Do something else, maybe even network processing events
153 qApp->processEvents();
156 networkReply->deleteLater();
161 void NetworkAccess::syncMetaDataChanged() {
163 QUrl redirection = networkReply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl();
164 if (redirection.isValid()) {
166 qDebug() << "Redirect" << redirection;
167 networkReply->deleteLater();
168 syncGet(redirection);
171 QNetworkAccessManager *manager = The::networkAccessManager();
172 networkReply->deleteLater();
173 networkReply = manager->get(QNetworkRequest(redirection));
174 connect(networkReply, SIGNAL(metaDataChanged()),
175 this, SLOT(metaDataChanged()), Qt::AutoConnection);
176 connect(networkReply, SIGNAL(finished()),
177 this, SLOT(finished()), Qt::AutoConnection);
183 void NetworkAccess::syncFinished() {
188 void NetworkAccess::error(QNetworkReply::NetworkError code) {
189 // get the QNetworkReply that sent the signal
190 QNetworkReply *networkReply = static_cast<QNetworkReply *>(sender());
192 qDebug() << "Cannot get sender";
197 if (networkReply->operation() == QNetworkAccessManager::HeadOperation)
200 // report the error in the status bar
201 QMainWindow* mainWindow = dynamic_cast<QMainWindow*>(qApp->topLevelWidgets().first());
202 if (mainWindow) mainWindow->statusBar()->showMessage(
203 tr("Network error: %1").arg(networkReply->errorString()));
205 qDebug() << "Network error:" << networkReply->errorString() << code;
207 networkReply->deleteLater();
210 QByteArray NetworkAccess::syncGetBytes(QUrl url) {
211 return syncGet(url)->readAll();
214 QString NetworkAccess::syncGetString(QUrl url) {
215 return QString::fromUtf8(syncGetBytes(url));