File indexing completed on 2024-04-28 03:54:48

0001 /*
0002 
0003     SPDX-FileCopyrightText: 2023 Nicolas Fella <nicolas.fella@gmx.de>
0004 
0005     SPDX-License-Identifier: LGPL-2.0-or-later
0006 */
0007 
0008 #include <KIO/TransferJob>
0009 
0010 #include <QSignalSpy>
0011 #include <QTest>
0012 
0013 class PropagateHeadersTest : public QObject
0014 {
0015     Q_OBJECT
0016 private Q_SLOTS:
0017     void testGet();
0018     void testGet_data();
0019 };
0020 
0021 void PropagateHeadersTest::testGet_data()
0022 {
0023     QTest::addColumn<QString>("url");
0024     QTest::addColumn<QString>("expectedMimeType");
0025     QTest::addColumn<QByteArray>("expectedData");
0026     QTest::addColumn<QStringList>("expectedHeaders");
0027 
0028     QTest::addRow("html") << "http://localhost:5000/get/html"
0029                           << "text/html" << QByteArray("<p>Hello, World!</p>")
0030                           << QStringList{"server: Werkzeug/2.3.6 Python/3.11.4",
0031                                          "date: Wed, 09 Aug 2023 15:07:45 GMT",
0032                                          "content-type: text/html; charset=utf-8",
0033                                          "content-length: 20",
0034                                          "connection: close"};
0035     QTest::addRow("calendar") << "http://localhost:5000/get/calendar"
0036                               << "text/calendar" << QByteArray("Some data\nthat\nhas\nnew\nlines\n")
0037                               << QStringList{"server: Werkzeug/2.3.6 Python/3.11.4",
0038                                              "date: Wed, 09 Aug 2023 15:22:24 GMT",
0039                                              "content-type: text/calendar; charset=utf-8",
0040                                              "content-length: 29",
0041                                              "connection: close"};
0042 }
0043 
0044 void PropagateHeadersTest::testGet()
0045 {
0046     QFETCH(QString, url);
0047     QFETCH(QString, expectedMimeType);
0048     QFETCH(QByteArray, expectedData);
0049     QFETCH(QStringList, expectedHeaders);
0050 
0051     auto *job = KIO::get(QUrl(url));
0052     job->addMetaData(QStringLiteral("PropagateHttpHeader"), QStringLiteral("true"));
0053 
0054     QSignalSpy mimeTypeFoundSpy(job, &KIO::TransferJob::mimeTypeFound);
0055     mimeTypeFoundSpy.wait();
0056     QCOMPARE(mimeTypeFoundSpy.count(), 1);
0057 
0058     auto args = mimeTypeFoundSpy.first();
0059     QCOMPARE(args[1], expectedMimeType);
0060 
0061     QSignalSpy dataSpy(job, &KIO::TransferJob::data);
0062     QSignalSpy spy(job, &KJob::finished);
0063     spy.wait();
0064     QVERIFY(spy.size());
0065     QCOMPARE(job->mimetype(), expectedMimeType);
0066 
0067     QVERIFY(dataSpy.count());
0068     const QByteArray actualData = dataSpy.first().at(1).toByteArray();
0069     QCOMPARE(actualData, expectedData);
0070 
0071     QCOMPARE(job->error(), KJob::NoError);
0072     const QStringList headers = job->queryMetaData(QStringLiteral("HTTP-Headers")).split("\n");
0073 
0074     qWarning() << job->queryMetaData(QStringLiteral("HTTP-Headers"));
0075 
0076     for (int i = 0; i < headers.length(); ++i) {
0077         if (headers[i].startsWith("date:", Qt::CaseInsensitive)) {
0078             continue;
0079         }
0080 
0081         if (headers[i].startsWith("server:", Qt::CaseInsensitive)) {
0082             continue;
0083         }
0084 
0085         QCOMPARE(headers[i].toLower(), expectedHeaders[i].toLower());
0086     }
0087 }
0088 
0089 QTEST_GUILESS_MAIN(PropagateHeadersTest)
0090 
0091 #include "propagateheaderstest.moc"