QNetworkRequest: Make header parsing locale-independent
The existing header parsing used C's tolower() function for case-insensitive switching over the first character of the header. However, that function's result depends on the current locale. Since the parser is supposed to match the likes of "If-Match" and "If-None-Match", matching may fail in locales, such as Turkish, where tolower(I) is ı (LATIN SMALL LETTER DOTLESS I) (or I, if the former isn't representable in the current charset), causing a False Negative. To fix, use the US-ASCII-only QtMiscUtils::toAsciiLower() function, which has the added advantage that it's inline. Replace at(0) with front() as a drive-by. The WASM copy of the function is hopelessly outdated (recognizes less headers than the QNetworkRequest original). [ChangeLog][QtNetwork] Fixed a bug where certain QNetworkRequest::KnownHeaders wouldn't be recognized as such in certain locales. Task-number: QTBUG-109235 Change-Id: Ib147ab64803bb868647dd07ad657d785071242ea Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io> (cherry picked from commit 536e17372803e7c9557e4a59ae8dad0405f11cd2) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
parent
b0fa19a92e
commit
f11a9b203b
@ -9,6 +9,7 @@
|
||||
#include <QtCore/qcoreapplication.h>
|
||||
#include <QtCore/qfileinfo.h>
|
||||
#include <QtCore/qthread.h>
|
||||
#include <QtCore/private/qtools_p.h>
|
||||
|
||||
#include <private/qnetworkaccessmanager_p.h>
|
||||
#include <private/qnetworkfile_p.h>
|
||||
@ -300,7 +301,7 @@ static int parseHeaderName(const QByteArray &headerName)
|
||||
if (headerName.isEmpty())
|
||||
return -1;
|
||||
|
||||
switch (tolower(headerName.at(0))) {
|
||||
switch (QtMiscUtils::toAsciiLower(headerName.front())) {
|
||||
case 'c':
|
||||
if (qstricmp(headerName.constData(), "content-type") == 0)
|
||||
return QNetworkRequest::ContentTypeHeader;
|
||||
|
@ -13,6 +13,7 @@
|
||||
#include "QtCore/qshareddata.h"
|
||||
#include "QtCore/qlocale.h"
|
||||
#include "QtCore/qdatetime.h"
|
||||
#include "QtCore/private/qtools_p.h"
|
||||
|
||||
#include <ctype.h>
|
||||
#if QT_CONFIG(datestring)
|
||||
@ -1094,7 +1095,7 @@ static int parseHeaderName(const QByteArray &headerName)
|
||||
if (headerName.isEmpty())
|
||||
return -1;
|
||||
|
||||
switch (tolower(headerName.at(0))) {
|
||||
switch (QtMiscUtils::toAsciiLower(headerName.front())) {
|
||||
case 'c':
|
||||
if (headerName.compare("content-type", Qt::CaseInsensitive) == 0)
|
||||
return QNetworkRequest::ContentTypeHeader;
|
||||
|
Loading…
x
Reference in New Issue
Block a user