Permalink
Browse files

Заработало скачивание файлов при редиректе на сайте

  • Loading branch information...
1 parent 5ca550e commit 71e6d9da994b8cbca29c642f81d91b6a514fe353 @xintrea committed Jan 20, 2016
Showing with 82 additions and 19 deletions.
  1. +76 −16 src/libraries/Downloader.cpp
  2. +4 −1 src/libraries/Downloader.h
  3. +1 −1 src/libraries/wyedit/Editor.h
  4. +1 −1 src/main.h
@@ -11,6 +11,7 @@
#include <QNetworkRequest>
#include <QHeaderView>
#include <QLabel>
+#include <QUrl>
#include "Downloader.h"
#include "main.h"
@@ -70,6 +71,9 @@ void Downloader::setupSignals()
connect(&webManager, SIGNAL (finished(QNetworkReply*)),
this, SLOT (onFileDownloadFinished(QNetworkReply*)) );
+ connect(&webManager, SIGNAL (sslErrors(QNetworkReply *, const QList<QSslError> &)),
+ this, SLOT (onSslErrors(QNetworkReply *, const QList<QSslError> &)) );
+
connect(cancelButton, SIGNAL (clicked()),
this, SLOT (reject()));
}
@@ -209,33 +213,89 @@ void Downloader::startNextDownload()
void Downloader::onFileDownloadFinished(QNetworkReply *reply)
{
- qDebug() << "File download result: " << reply->error();
+ bool enableNextDownload=true;
- if(saveMode==memory)
+ // Если при получении ответа небыло ошибок сети
+ if(reply->error() == QNetworkReply::NoError)
+ {
+ // Определение, есть ли перенаправление (редирект) в ответе сервера
+ QVariant possibleRedirectUrl=reply->attribute(QNetworkRequest::RedirectionTargetAttribute);
+ QUrl urlRedirectedTo=checkedRedirectUrl( possibleRedirectUrl.toUrl() );
+
+ // Если есть перенаправление
+ if(!urlRedirectedTo.isEmpty())
+ {
+ qDebug() << "Redirected to " << urlRedirectedTo.toString();
+
+ QNetworkRequest request(urlRedirectedTo);
+ webManager.get(request); // В конце загрузки будет вызван слот onFileDownloadFinished()
+
+ enableNextDownload=false;
+ }
+ else
+ {
+ // Иначе перенаправления нет, и значит в ответе содержится принятый файл
+
+ if(saveMode==memory)
+ memoryFiles[currentReferenceNum]=reply->readAll(); // Загруженные данные сохраняются
+
+ if(saveMode==disk)
+ qDebug() << "Development in process...";
+ }
+ }
+ else
{
- memoryFiles[currentReferenceNum]=reply->readAll(); // Загруженные данные сохраняются
+ qDebug() << reply->errorString();
+ errorLog=errorLog+"\n"+reply->errorString();
+ isSuccessFlag=false; // Если с одним файлом была проблема, флаг успешной загрузки снимается для всех
}
- if(saveMode==disk)
+
+ // Если разрешена загрузка следующей ссылки
+ if(enableNextDownload)
{
- qDebug() << "Development in process...";
+ // На экране отмечается, что данная ссылка загружена полностью
+ qobject_cast<QProgressBar *>(table->cellWidget(currentReferenceNum, downloadPercentCol))->setValue(100);
+
+ // Если еще не все ссылки загружены
+ if(currentReferenceNum<(referencesList.count()-1))
+ startNextDownload();
+ else
+ {
+ // Иначе все загрузки завершены
+
+ qDebug() << "All download successfull";
+
+ isSuccessFlag=true;
+
+ emit accept(); // Программно закрывается окно диалога, как будто нажали Ok
+ }
}
reply->deleteLater();
+}
- qobject_cast<QProgressBar *>(table->cellWidget(currentReferenceNum, downloadPercentCol))->setValue(100);
- // Если еще не все ссылки загружены
- if(currentReferenceNum<(referencesList.count()-1))
- startNextDownload();
- else
- {
- // Иначе все загрузки завершены
+// Метод, отбрасывающий повторяющиеся ссылки при редиректе
+QUrl Downloader::checkedRedirectUrl(const QUrl& possibleRedirectUrl) const
+{
+ static QUrl oldRedirectUrl;
+ QUrl redirectUrl;
- qDebug() << "All download successfull";
+ if(!possibleRedirectUrl.isEmpty() &&
+ possibleRedirectUrl != oldRedirectUrl) {
+ redirectUrl = possibleRedirectUrl;
+ }
- isSuccessFlag=true;
+ oldRedirectUrl=redirectUrl;
- emit accept(); // Программно закрывается окно диалога, как будто нажали Ok
- }
+ return redirectUrl;
+}
+
+
+void Downloader::onSslErrors(QNetworkReply *reply, const QList<QSslError> &errors)
+{
+ Q_UNUSED( errors );
+
+ reply->ignoreSslErrors();
}
@@ -12,7 +12,7 @@ class QPushButton;
class QLabel;
class QTableWidget;
class QNetworkReply;
-
+class QUrl;
class Downloader : public QDialog
{
@@ -45,7 +45,9 @@ class Downloader : public QDialog
private slots:
+
void onFileDownloadFinished(QNetworkReply* pReply); // Слот, вызываемый при завершении загрузки очередного файла
+ void onSslErrors(QNetworkReply *reply, const QList<QSslError> &errors);
protected:
@@ -78,6 +80,7 @@ private slots:
void assembly();
void startNextDownload();
+ QUrl checkedRedirectUrl(const QUrl& possibleRedirectUrl) const;
};
@@ -37,7 +37,7 @@
// ----------------------------------------------------------
-#define WYEDIT_VERSION "WyEdit v.1.9 / 09.01.2016"
+#define WYEDIT_VERSION "WyEdit v.1.10 / 20.01.2016"
class EditorConfig;
class EditorTextEdit;
View
@@ -34,7 +34,7 @@ using namespace std;
// Версия программы
#define APPLICATION_RELEASE_VERSION 1
#define APPLICATION_RELEASE_SUBVERSION 32
-#define APPLICATION_RELEASE_MICROVERSION 198
+#define APPLICATION_RELEASE_MICROVERSION 199
// Поддерживаемая версия формата базы (хранилища)
#define CURRENT_FORMAT_VERSION 1

0 comments on commit 71e6d9d

Please sign in to comment.