summaryrefslogtreecommitdiffstats
path: root/tests/auto/network/access/qnetworkreply
diff options
context:
space:
mode:
authorMarkus Goetz <markus@woboq.com>2021-06-14 17:40:06 +0200
committerMarkus Goetz <markus@woboq.com>2021-07-27 17:16:58 +0200
commit85cfbae1d62617fdc452680813f993e812bb55dd (patch)
tree647525ccc36d6b3ff707f206869f882ff104a4c3 /tests/auto/network/access/qnetworkreply
parent5597e26256f37168b1da2bf8b6c1a9ab7ab2618c (diff)
QNAM: Allow to configure when connections to a host are torn down
This introduces a new attribute that allows behavior to keep the TCP connection(s) to a HTTP1/HTTP2 host longer or shorter than the default of 120 seconds. Note that the server might still close the connection earlier. Fixes: QTBUG-20726 Fixes: QTBUG-91440 Change-Id: I7da64230a78c642c12c0ddbe6b678cf17c3aafde Reviewed-by: MÃ¥rten Nordheim <marten.nordheim@qt.io>
Diffstat (limited to 'tests/auto/network/access/qnetworkreply')
-rw-r--r--tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp52
1 files changed, 52 insertions, 0 deletions
diff --git a/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp b/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp
index 261e738955..a824a15b49 100644
--- a/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp
+++ b/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp
@@ -452,6 +452,8 @@ private Q_SLOTS:
void httpAbort();
+ void closeClientSideConnectionEagerlyQtbug20726();
+
void dontInsertPartialContentIntoTheCache();
void httpUserAgent();
@@ -7936,6 +7938,56 @@ void tst_QNetworkReply::httpAbort()
QCOMPARE(reply3->error(), QNetworkReply::NoError);
}
+void tst_QNetworkReply::closeClientSideConnectionEagerlyQtbug20726()
+{
+ QNetworkAccessManager manager; // function local instance
+ // Setup HTTP servers
+ MiniHttpServer server("HTTP/1.1 200 OK\r\nContent-Length: 0\r\nConnection: Keep-Alive\r\n\r\n", false);
+ server.doClose = false; // server should not disconnect.
+
+ MiniHttpServer serverNotEagerClientClose("HTTP/1.1 200 OK\r\nContent-Length: 0\r\nConnection: Keep-Alive\r\n\r\n", false);
+ serverNotEagerClientClose.doClose = false; // server should not disconnect.
+ QUrl urlNotEager(QLatin1String("http://localhost"));
+ urlNotEager.setPort(serverNotEagerClientClose.serverPort());
+ QNetworkRequest requestNotEager(urlNotEager);
+ QNetworkReplyPtr replyNotEager(manager.get(requestNotEager));
+ QCOMPARE(waitForFinish(replyNotEager), Success);
+ // The reply was finished, the connection should be hanging and waiting to be expired
+
+ // Another server not eager to close, the connection should be hanging and waiting to be expired
+ MiniHttpServer serverNotEagerClientClose2("HTTP/1.1 200 OK\r\nContent-Length: 0\r\nConnection: Keep-Alive\r\n\r\n", false);
+ serverNotEagerClientClose2.doClose = false; // server should not disconnect.
+ QUrl urlNotEager2(QLatin1String("http://localhost"));
+ urlNotEager2.setPort(serverNotEagerClientClose2.serverPort());
+ QNetworkRequest requestNotEager2(urlNotEager2);
+ QNetworkReplyPtr replyNotEager2(manager.get(requestNotEager2));
+ QCOMPARE(waitForFinish(replyNotEager2), Success);
+
+ // However for this one we want to eagerly close.
+ QUrl url(QLatin1String("http://localhost"));
+ url.setPort(server.serverPort());
+ QNetworkRequest request(url);
+ request.setAttribute(QNetworkRequest::ConnectionCacheExpiryTimeoutSecondsAttribute, 0);
+ QNetworkReplyPtr reply(manager.get(request));
+ qDebug() << reply->request().url() << replyNotEager->request().url();
+ QCOMPARE(waitForFinish(reply), Success);
+ QCOMPARE(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), 200);
+ // Socket from server to QNAM still connected?
+ QVERIFY (!server.client.isNull());
+ QVERIFY (server.client->state() == QTcpSocket::ConnectedState);
+ // Wait a bit
+ QTest::qWait(1*1000);
+ // The QNAM should have disconnected the socket, so on our server it's disconnected now.
+ QVERIFY (!server.client.isNull());
+ QVERIFY (server.client->state() != QTcpSocket::ConnectedState);
+
+ // Now we check the not eager reply, it should still be connected.
+ QCOMPARE(replyNotEager->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), 200);
+ QCOMPARE(serverNotEagerClientClose.client->state(), QTcpSocket::ConnectedState);
+ QCOMPARE(replyNotEager2->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), 200);
+ QCOMPARE(serverNotEagerClientClose2.client->state(), QTcpSocket::ConnectedState);
+}
+
void tst_QNetworkReply::dontInsertPartialContentIntoTheCache()
{
QByteArray reply206 =