summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorMarc Mutz <marc.mutz@qt.io>2024-04-17 11:57:36 +0200
committerMarc Mutz <marc.mutz@qt.io>2024-04-26 02:24:53 +0200
commit98b034e53a7821018683c05d5dba776f0f2753f0 (patch)
tree95a638017b3c3ff3583609f7b2ce4404342c7d8c /tests
parenta4c663507755ea645ac0acd7333d4750f01d28f7 (diff)
QRestReply: make charset parsing more robust
The old code was based on QString::split and e.g. didn't handle escapes in quoted-strings. Write a modern recursive-descent parser to parse out type/subtype and charset parameter. Since we don't, yet, support CFWS (see below), recursion depth is strictly limited, so we're not susceptible to recursion bombs here. It currently handles only RFC9110-style grammar, but can be easily extended to support CFWS (RFC2822-style comments and folding white-space) or RFC2231-style continuuations, if needed. It's a bit more general than strictly required, because I expect this to be reused elsewhere ere long. Pick-to: 6.7 Fixes: QTBUG-120307 Change-Id: I309928dc350a043672dffb4a259b457764c031be Reviewed-by: Juha Vuolle <juha.vuolle@qt.io>
Diffstat (limited to 'tests')
-rw-r--r--tests/auto/network/access/qrestaccessmanager/tst_qrestaccessmanager.cpp13
1 files changed, 3 insertions, 10 deletions
diff --git a/tests/auto/network/access/qrestaccessmanager/tst_qrestaccessmanager.cpp b/tests/auto/network/access/qrestaccessmanager/tst_qrestaccessmanager.cpp
index d1b8e3bdd7..814a9b27f4 100644
--- a/tests/auto/network/access/qrestaccessmanager/tst_qrestaccessmanager.cpp
+++ b/tests/auto/network/access/qrestaccessmanager/tst_qrestaccessmanager.cpp
@@ -668,7 +668,7 @@ void tst_QRestAccessManager::json()
}
}
-#define VERIFY_TEXT_REPLY_OK_IMPL(...) \
+#define VERIFY_TEXT_REPLY_OK \
{ \
manager.get(request, this, [&](QRestReply &reply) { networkReply = reply.networkReply(); }); \
QTRY_VERIFY(networkReply); \
@@ -676,11 +676,8 @@ void tst_QRestAccessManager::json()
responseString = restReply.readText(); \
networkReply->deleteLater(); \
networkReply = nullptr; \
- __VA_ARGS__ ; \
QCOMPARE(responseString, sourceString); \
}
-#define VERIFY_TEXT_REPLY_OK VERIFY_TEXT_REPLY_OK_IMPL(do {} while (false))
-#define VERIFY_TEXT_REPLY_XFAIL(JIRA) VERIFY_TEXT_REPLY_OK_IMPL(QEXPECT_FAIL("", #JIRA, Continue))
#define VERIFY_TEXT_REPLY_ERROR(WARNING_MESSAGE) \
{ \
@@ -736,17 +733,13 @@ void tst_QRestAccessManager::text()
serverSideResponse.headers.removeAll(Header::ContentType);
serverSideResponse.headers.append(Header::ContentType, "text/plain; charset=\"UT\\F-8\""_ba);
serverSideResponse.body = encUTF8(sourceString);
-#if QT_CONFIG(icu) // ICU ignores `\` during name lookup, making this test succeed when it shouldn't
VERIFY_TEXT_REPLY_OK;
-#else
- VERIFY_TEXT_REPLY_XFAIL(QTBUG-120307);
-#endif
// Successful UTF-8 (empty charset)
serverSideResponse.headers.removeAll(Header::ContentType);
serverSideResponse.headers.append(Header::ContentType, "text/plain; charset=\"\""_ba);
serverSideResponse.body = encUTF8(sourceString);
- VERIFY_TEXT_REPLY_XFAIL(QTBUG-120307);
+ VERIFY_TEXT_REPLY_OK;
// Successful UTF-8 (implicit)
serverSideResponse.headers.removeAll(Header::ContentType);
@@ -784,7 +777,7 @@ void tst_QRestAccessManager::text()
serverSideResponse.headers.append(Header::ContentType,
"text/plain; extraparameter=bar;charset = \"UT\\F-32\""_ba);
serverSideResponse.body = encUTF32(sourceString);
- VERIFY_TEXT_REPLY_XFAIL(QTBUG-120307);
+ VERIFY_TEXT_REPLY_OK;
{
// Unsuccessful UTF-32, wrong encoding indicated (indicated UTF-32 but data is UTF-8)