QOffsetStringArray: add contains() method

... use it in QNetworkReplyWasmImpl.

Change-Id: I648f02fcafda43af7ed9771cc1c7e2e2a6d38504
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
Marc Mutz 2022-12-08 11:57:41 +01:00
parent 4d43b995bf
commit 1ecbab76b6
3 changed files with 32 additions and 12 deletions

View File

@ -63,6 +63,15 @@ public:
constexpr int count() const { return int(m_offsets.size()) - 1; }
bool contains(QByteArrayView needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept
{
for (qsizetype i = 0; i < count(); ++i) {
if (viewAt(i).compare(needle, cs) == 0)
return true;
}
return false;
}
private:
StaticString m_string;
OffsetList m_offsets;

View File

@ -9,6 +9,7 @@
#include <QtCore/qcoreapplication.h>
#include <QtCore/qfileinfo.h>
#include <QtCore/qthread.h>
#include <QtCore/private/qoffsetstringarray_p.h>
#include <QtCore/private/qtools_p.h>
#include <private/qnetworkaccessmanager_p.h>
@ -18,8 +19,12 @@
#include <emscripten/fetch.h>
QT_BEGIN_NAMESPACE
using namespace Qt::StringLiterals;
namespace {
constexpr const char *BannedHeaders[] = {
static constexpr auto BannedHeaders = qOffsetStringArray(
"accept-charset",
"accept-encoding",
"access-control-request-headers",
@ -39,19 +44,14 @@ constexpr const char *BannedHeaders[] = {
"trailer",
"transfer-encoding",
"upgrade",
"via",
};
"via"
);
bool isUnsafeHeader(QLatin1StringView header)
bool isUnsafeHeader(QLatin1StringView header) noexcept
{
return header.startsWith(QStringLiteral("proxy-"), Qt::CaseInsensitive)
|| header.startsWith(QStringLiteral("sec-"), Qt::CaseInsensitive)
|| std::any_of(std::begin(BannedHeaders), std::end(BannedHeaders),
[&header](const char *bannedHeader) {
return 0
== header.compare(QLatin1StringView(bannedHeader),
Qt::CaseInsensitive);
});
return header.startsWith("proxy-"_L1, Qt::CaseInsensitive)
|| header.startsWith("sec-"_L1, Qt::CaseInsensitive)
|| BannedHeaders.contains(header, Qt::CaseInsensitive);
}
} // namespace

View File

@ -13,6 +13,7 @@ class tst_QOffsetStringArray : public QObject
private slots:
void init();
void access();
void contains();
};
@ -89,6 +90,16 @@ void tst_QOffsetStringArray::access()
QCOMPARE(messages[6], "");
}
void tst_QOffsetStringArray::contains()
{
QVERIFY(!messages.contains(""));
QVERIFY( messages.contains("level - 0"));
std::string l2 = "level - 2"; // make sure we don't compare pointer values
QVERIFY( messages.contains(l2));
QByteArray L4 = "Level - 4";
QVERIFY( messages.contains(L4, Qt::CaseInsensitive));
QVERIFY(!messages.contains(L4, Qt::CaseSensitive));
}
QTEST_APPLESS_MAIN(tst_QOffsetStringArray)
#include "tst_qoffsetstringarray.moc"