diff options
author | Marc Mutz <marc.mutz@qt.io> | 2024-04-17 11:57:36 +0200 |
---|---|---|
committer | Marc Mutz <marc.mutz@qt.io> | 2024-04-26 02:24:53 +0200 |
commit | 98b034e53a7821018683c05d5dba776f0f2753f0 (patch) | |
tree | 95a638017b3c3ff3583609f7b2ce4404342c7d8c /tests | |
parent | a4c663507755ea645ac0acd7333d4750f01d28f7 (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.cpp | 13 |
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) |