summaryrefslogtreecommitdiffstats
path: root/tests/manual/qnetworkaccessmanager/qget/downloadmanager.cpp
diff options
context:
space:
mode:
authorShane Kearns <ext-shane.2.kearns@nokia.com>2012-03-22 16:24:17 +0000
committerQt by Nokia <qt-info@nokia.com>2012-04-02 16:56:48 +0200
commitb08f74f08939be310a79b5efcb5721e35c5deb21 (patch)
tree3e0458052b2c9c67c33627e86afd84eb89f14ab7 /tests/manual/qnetworkaccessmanager/qget/downloadmanager.cpp
parent565da6030fc2396d8d00baa65196cfc1f5d63f27 (diff)
Add support for PUT & POST to qget test
Due to some bugs that are not reproducable with a normal HTTP GET This patch also adds the option to process multiple URLs serially (using application level queuing) rather than the default parallel (using QNetworkAccessManager queuing on 6 TCP connections) & renames the authentication command line options to match wget. Change-Id: I10915feb3bba23abbd7a72f9844c03f347f9bff5 Reviewed-by: Richard J. Moore <rich@kde.org> Reviewed-by: Martin Petersson <Martin.Petersson@nokia.com>
Diffstat (limited to 'tests/manual/qnetworkaccessmanager/qget/downloadmanager.cpp')
-rw-r--r--tests/manual/qnetworkaccessmanager/qget/downloadmanager.cpp166
1 files changed, 166 insertions, 0 deletions
diff --git a/tests/manual/qnetworkaccessmanager/qget/downloadmanager.cpp b/tests/manual/qnetworkaccessmanager/qget/downloadmanager.cpp
new file mode 100644
index 0000000000..e3ba3ca88f
--- /dev/null
+++ b/tests/manual/qnetworkaccessmanager/qget/downloadmanager.cpp
@@ -0,0 +1,166 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qget.h"
+#include <QAuthenticator>
+#include <QCoreApplication>
+#include <QDebug>
+#include <QSslError>
+
+DownloadManager::DownloadManager()
+ : queueMode (Parallel)
+{
+ connect(&nam, SIGNAL(finished(QNetworkReply*)), this, SLOT(finished(QNetworkReply*)));
+ connect(&nam, SIGNAL(authenticationRequired(QNetworkReply*, QAuthenticator*)), this, SLOT(authenticationRequired(QNetworkReply*, QAuthenticator*)));
+ connect(&nam, SIGNAL(proxyAuthenticationRequired(const QNetworkProxy&, QAuthenticator*)), this, SLOT(proxyAuthenticationRequired(const QNetworkProxy&, QAuthenticator*)));
+#ifndef QT_NO_SSL
+ connect(&nam, SIGNAL(sslErrors(QNetworkReply*, const QList<QSslError>&)), this, SLOT(sslErrors(QNetworkReply*, const QList<QSslError>&)));
+#endif
+}
+
+DownloadManager::~DownloadManager()
+{
+
+}
+
+void DownloadManager::get(const QUrl &url, const QString &user, const QString &password)
+{
+ DownloadItem *dl = new DownloadItem(QNetworkRequest(url), user, password, nam);
+ transfers.append(dl);
+ connect(dl, SIGNAL(downloadFinished(TransferItem*)), SLOT(downloadFinished(TransferItem*)));
+}
+
+void DownloadManager::upload(const QUrl &url, const QString &user, const QString &password, const QString &filename, const QString &contentType, TransferItem::Method method)
+{
+ QScopedPointer<QFile> file(new QFile(filename));
+ if (!file->open(QFile::ReadOnly)) {
+ qDebug() << "Can't open input file" << file->fileName() << file->errorString();
+ return;
+ }
+ QNetworkRequest request(url);
+ if (!contentType.isEmpty())
+ request.setHeader(QNetworkRequest::ContentTypeHeader, contentType);
+ UploadItem *ul = new UploadItem(request, user, password, nam, file.take(), method);
+ transfers.append(ul);
+ connect(ul, SIGNAL(downloadFinished(TransferItem*)), SLOT(downloadFinished(TransferItem*)));
+}
+
+void DownloadManager::finished(QNetworkReply *reply)
+{
+}
+
+void DownloadManager::downloadFinished(TransferItem *item)
+{
+ qDebug() << "finished " << item->reply->url() << " with http status: " << item->reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
+ if (item->reply->error() != QNetworkReply::NoError)
+ qDebug() << "and error: " << item->reply->error() << item->reply->errorString();
+ transfers.removeOne(item);
+ item->deleteLater();
+ checkForAllDone();
+}
+
+void DownloadManager::checkForAllDone()
+{
+ if (transfers.isEmpty()) {
+ qDebug() << "All Done.";
+ QCoreApplication::quit();
+ }
+
+ foreach (TransferItem *item, transfers) {
+ if (!item->reply) {
+ item->start();
+ //by default multiple downloads are processed in parallel.
+ //but in serial mode, only start one transfer at a time.
+ if (queueMode == Serial)
+ break;
+ }
+ }
+
+}
+
+void DownloadManager::authenticationRequired(QNetworkReply *reply, QAuthenticator *auth)
+{
+ qDebug() << "authenticationRequired" << reply;
+ TransferItem *transfer = findTransfer(reply);
+ //provide the credentials exactly once, so that it fails if credentials are incorrect.
+ if (transfer && !transfer->user.isEmpty() || !transfer->password.isEmpty()) {
+ auth->setUser(transfer->user);
+ auth->setPassword(transfer->password);
+ transfer->user.clear();
+ transfer->password.clear();
+ }
+}
+
+void DownloadManager::proxyAuthenticationRequired(const QNetworkProxy &proxy, QAuthenticator *auth)
+{
+ //provide the credentials exactly once, so that it fails if credentials are incorrect.
+ if (!proxyUser.isEmpty() || !proxyPassword.isEmpty()) {
+ auth->setUser(proxyUser);
+ auth->setPassword(proxyPassword);
+ proxyUser.clear();
+ proxyPassword.clear();
+ }
+}
+
+#ifndef QT_NO_SSL
+void DownloadManager::sslErrors(QNetworkReply *reply, const QList<QSslError> &errors)
+{
+ qDebug() << "sslErrors";
+ foreach (const QSslError &error, errors) {
+ qDebug() << error.errorString();
+ qDebug() << error.certificate().toPem();
+ }
+}
+#endif
+
+TransferItem *DownloadManager::findTransfer(QNetworkReply *reply)
+{
+ foreach (TransferItem *item, transfers) {
+ if (item->reply == reply)
+ return item;
+ }
+ return 0;
+}
+
+void DownloadManager::setQueueMode(QueueMode mode)
+{
+ queueMode = mode;
+}