summaryrefslogtreecommitdiffstats
path: root/tests/auto/network
diff options
context:
space:
mode:
authorTimur Pocheptsov <timur.pocheptsov@qt.io>2017-01-02 15:47:15 +0100
committerTimur Pocheptsov <timur.pocheptsov@qt.io>2017-01-19 04:34:03 +0000
commit231259c3d519a55880563b12f5796723fa99e522 (patch)
treeaea3205f73e08803a7d52cb2581cf67c4266f7bf /tests/auto/network
parent45f80a52c2d01ba14f550e48e32d95748a3ff444 (diff)
Add a user-controlled auto-redirect policy
With this new policy, after emitting 'redirected', QNetworkReplyHttpImpl waits for client code to decide if QNAM should follow this redirect or not. The client can either allow this redirect by emitting 'redirectAllowed' or abort the reply. Task-number: QTPM-236 Change-Id: Ia04619f6bd1f0caa477833ae859b24033027b2e1 Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io> Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
Diffstat (limited to 'tests/auto/network')
-rw-r--r--tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp65
1 files changed, 59 insertions, 6 deletions
diff --git a/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp b/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp
index 7d07ae888c..f19ce4ac75 100644
--- a/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp
+++ b/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp
@@ -134,6 +134,8 @@ class tst_QNetworkReply: public QObject
return s;
}
+ static const QByteArray httpEmpty200Response;
+
QEventLoop *loop;
enum RunSimpleRequestReturn { Timeout = 0, Success, Failure };
int returnCode;
@@ -480,6 +482,8 @@ private Q_SLOTS:
void ioHttpRedirectPolicy();
void ioHttpRedirectPolicyErrors_data();
void ioHttpRedirectPolicyErrors();
+ void ioHttpUserVerifiedRedirect_data();
+ void ioHttpUserVerifiedRedirect();
#ifndef QT_NO_SSL
void putWithServerClosingConnectionImmediately();
#endif
@@ -493,6 +497,8 @@ private:
bool notEnoughDataForFastSender;
};
+const QByteArray tst_QNetworkReply::httpEmpty200Response =
+ "HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n";
bool tst_QNetworkReply::seedCreated = false;
#define RUN_REQUEST(call) \
@@ -8034,10 +8040,9 @@ void tst_QNetworkReply::putWithRateLimiting()
void tst_QNetworkReply::ioHttpSingleRedirect()
{
QUrl localhost = QUrl("http://localhost");
- QByteArray http200Reply = "HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n";
// Setup server to which the second server will redirect to
- MiniHttpServer server2(http200Reply);
+ MiniHttpServer server2(httpEmpty200Response);
QUrl redirectUrl = QUrl(localhost);
redirectUrl.setPort(server2.serverPort());
@@ -8079,11 +8084,9 @@ void tst_QNetworkReply::ioHttpChangeMaxRedirects()
{
QUrl localhost = QUrl("http://localhost");
- QByteArray http200Reply = "HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n";
-
MiniHttpServer server1("");
MiniHttpServer server2("");
- MiniHttpServer server3(http200Reply);
+ MiniHttpServer server3(httpEmpty200Response);
QUrl server2Url(localhost);
server2Url.setPort(server2.serverPort());
@@ -8227,7 +8230,7 @@ void tst_QNetworkReply::ioHttpRedirectPolicy()
"http://localhost"));
url.setPort(redirectServer.serverPort());
- redirectServer.responses.push_back("HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n");
+ redirectServer.responses.push_back(httpEmpty200Response);
redirectServer.responses.push_back(tempRedirectReplyStr().arg(QString(url.toEncoded())).toLatin1());
// This is the default one we preserve between tests.
@@ -8332,6 +8335,56 @@ void tst_QNetworkReply::ioHttpRedirectPolicyErrors()
QCOMPARE(reply->error(), expectedError);
}
+void tst_QNetworkReply::ioHttpUserVerifiedRedirect_data()
+{
+ QTest::addColumn<bool>("followRedirect");
+ QTest::addColumn<int>("statusCode");
+
+ QTest::newRow("allow-redirect") << true << 200;
+ QTest::newRow("reject-redirect") << false << 307;
+}
+
+void tst_QNetworkReply::ioHttpUserVerifiedRedirect()
+{
+ QFETCH(const bool, followRedirect);
+ QFETCH(const int, statusCode);
+
+ // Setup HTTP server.
+ MiniHttpServer target(httpEmpty200Response, false);
+ QUrl url("http://localhost");
+ url.setPort(target.serverPort());
+
+ MiniHttpServer redirectServer("", false);
+ redirectServer.setDataToTransmit(tempRedirectReplyStr().arg(QString(url.toEncoded())).toLatin1());
+ url.setPort(redirectServer.serverPort());
+
+ QCOMPARE(manager.redirectsPolicy(), QNetworkRequest::ManualRedirectsPolicy);
+ manager.setRedirectsPolicy(QNetworkRequest::UserVerifiedRedirectsPolicy);
+ QCOMPARE(manager.redirectsPolicy(), QNetworkRequest::UserVerifiedRedirectsPolicy);
+
+ QNetworkReplyPtr reply(manager.get(QNetworkRequest(url)));
+ reply->connect(reply.data(), &QNetworkReply::redirected,
+ [&](const QUrl &redirectUrl) {
+ qDebug() << "redirect to:" << redirectUrl;
+ if (followRedirect) {
+ qDebug() << "confirmed.";
+ emit reply->redirectAllowed();
+ } else{
+ qDebug() << "rejected.";
+ emit reply->abort();
+ }
+ });
+
+ // Before any test failed, reset the policy to default:
+ manager.setRedirectsPolicy(QNetworkRequest::ManualRedirectsPolicy);
+ QCOMPARE(manager.redirectsPolicy(), QNetworkRequest::ManualRedirectsPolicy);
+
+ QSignalSpy finishedSpy(reply.data(), SIGNAL(finished()));
+ waitForFinish(reply);
+ QCOMPARE(finishedSpy.count(), 1);
+ QCOMPARE(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), statusCode);
+}
+
#ifndef QT_NO_SSL
class PutWithServerClosingConnectionImmediatelyHandler: public QObject