summaryrefslogtreecommitdiffstats
path: root/tests/auto
diff options
context:
space:
mode:
authorOlivier Goffart <ogoffart@woboq.com>2011-11-08 15:37:42 +0100
committerQt by Nokia <qt-info@nokia.com>2011-11-08 17:20:39 +0100
commita4f446704e7e02e25c02edb9d316513a482bae9a (patch)
treee31af511bf68c5f0951ea7579da0c98420af1df2 /tests/auto
parent1c70cd998093aa1ba79af0fa1eed5f30da47354d (diff)
QNAM: Fix authentication cache when the password is in the URL
Two problems: - The signal cacheCredidentials was not connected in the synchronous case while it must be connected. (Regression when the threaded http was merged) - We cannot cache the credidentials when we proceed the url because at that point, we do not know the realm (this basically reverts 9bc5a32b875b812c3a706034c8c27614f86bd138) Task-number: QTBUG-18411 Change-Id: I8ea11fa23db4314c3f17ed06d2d7f9ee934ccdba Reviewed-by: Peter Hartmann <peter.hartmann@nokia.com>
Diffstat (limited to 'tests/auto')
-rw-r--r--tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp88
1 files changed, 83 insertions, 5 deletions
diff --git a/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp b/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp
index e7a9f7d0d3..7f00ba90ca 100644
--- a/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp
+++ b/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp
@@ -378,6 +378,7 @@ private Q_SLOTS:
void dontInsertPartialContentIntoTheCache();
void httpUserAgent();
+ void synchronousAuthenticationCache();
// NOTE: This test must be last!
void parentingRepliesToTheApp();
@@ -499,6 +500,14 @@ protected:
client->setParent(this);
++totalConnections;
}
+
+ virtual void reply() {
+ // we need to emulate the bytesWrittenSlot call if the data is empty.
+ if (dataToTransmit.size() == 0)
+ QMetaObject::invokeMethod(this, "bytesWrittenSlot", Qt::QueuedConnection);
+ else
+ client->write(dataToTransmit);
+ }
private:
void connectSocketSignals()
{
@@ -532,11 +541,7 @@ public slots:
if (multiple)
receivedData.remove(0, doubleEndlPos+4);
- // we need to emulate the bytesWrittenSlot call if the data is empty.
- if (dataToTransmit.size() == 0)
- QMetaObject::invokeMethod(this, "bytesWrittenSlot", Qt::QueuedConnection);
- else
- client->write(dataToTransmit);
+ reply();
}
}
@@ -6359,6 +6364,79 @@ void tst_QNetworkReply::httpUserAgent()
QVERIFY(server.receivedData.contains("\r\nUser-Agent: abcDEFghi\r\n"));
}
+void tst_QNetworkReply::synchronousAuthenticationCache()
+{
+ class MiniAuthServer : public MiniHttpServer {
+ public:
+ MiniAuthServer(QThread *thread) : MiniHttpServer(QByteArray(), false, thread) {};
+ virtual void reply() {
+
+ dataToTransmit =
+ "HTTP/1.0 401 Unauthorized\r\n"
+ "WWW-Authenticate: Basic realm=\"QNetworkAccessManager Test Realm\"\r\n"
+ "Content-Length: 4\r\n"
+ "Connection: close\r\n"
+ "Content-Type: text/plain\r\n"
+ "\r\n"
+ "auth";
+ QRegExp rx("Authorization: Basic ([^\r\n]*)\r\n");
+ if (rx.indexIn(receivedData) > 0) {
+ if (QByteArray::fromBase64(rx.cap(1).toLatin1()) == "login:password") {
+ dataToTransmit =
+ "HTTP/1.0 200 OK\r\n"
+ "Content-Type: text/plain\r\n"
+ "Content-Length: 2\r\n"
+ "\r\n"
+ "OK";
+ }
+ }
+ receivedData.clear();
+ MiniHttpServer::reply();
+ }
+ };
+
+ // when using synchronous commands, we need a different event loop for
+ // the server thread, because the client is never returning to the
+ // event loop
+ QScopedPointer<QThread, QThreadCleanup> serverThread(new QThread);
+ QScopedPointer<MiniHttpServer, QDeleteLaterCleanup> server(new MiniAuthServer(serverThread.data()));
+ server->doClose = true;
+
+ //1) URL without credentials, we are not authenticated
+ {
+ QUrl url = "http://localhost:" + QString::number(server->serverPort()) + "/path";
+ QNetworkRequest request(url);
+ request.setAttribute(QNetworkRequest::SynchronousRequestAttribute, true);
+
+ QNetworkReplyPtr reply = manager.get(request);
+ QVERIFY(reply->isFinished());
+ QCOMPARE(reply->error(), QNetworkReply::AuthenticationRequiredError);
+ }
+
+ //2) URL with credentials, we are authenticated
+ {
+ QUrl url = "http://login:password@localhost:" + QString::number(server->serverPort()) + "/path2";
+ QNetworkRequest request(url);
+ request.setAttribute(QNetworkRequest::SynchronousRequestAttribute, true);
+
+ QNetworkReplyPtr reply = manager.get(request);
+ QVERIFY(reply->isFinished());
+ QCOMPARE(reply->error(), QNetworkReply::NoError);
+ QCOMPARE(reply->readAll().constData(), "OK");
+ }
+
+ //3) URL without credentials, we are authenticated because they are cached
+ {
+ QUrl url = "http://localhost:" + QString::number(server->serverPort()) + "/path3";
+ QNetworkRequest request(url);
+ request.setAttribute(QNetworkRequest::SynchronousRequestAttribute, true);
+
+ QNetworkReplyPtr reply = manager.get(request);
+ QVERIFY(reply->isFinished());
+ QCOMPARE(reply->error(), QNetworkReply::NoError);
+ QCOMPARE(reply->readAll().constData(), "OK");
+ }
+}
// NOTE: This test must be last testcase in tst_qnetworkreply!
void tst_QNetworkReply::parentingRepliesToTheApp()