diff --git a/src/base/http/requestparser.cpp b/src/base/http/requestparser.cpp index 8ee551931f42..349d79e24a04 100644 --- a/src/base/http/requestparser.cpp +++ b/src/base/http/requestparser.cpp @@ -208,7 +208,7 @@ bool RequestParser::parseRequestLine(const QString &line) const int sepPos = url.indexOf('?'); const QByteArrayView pathComponent = ((sepPos == -1) ? url : QByteArrayView(url).mid(0, sepPos)); - m_request.path = QString::fromUtf8(QByteArray::fromPercentEncoding(pathComponent.toByteArray())); + m_request.path = QString::fromUtf8(QByteArray::fromPercentEncoding(asQByteArray(pathComponent))); if (sepPos >= 0) { @@ -223,10 +223,11 @@ bool RequestParser::parseRequestLine(const QString &line) const QByteArrayView nameComponent = param.mid(0, eqCharPos); const QByteArrayView valueComponent = param.mid(eqCharPos + 1); - const QString paramName = QString::fromUtf8(QByteArray::fromPercentEncoding(nameComponent.toByteArray()).replace('+', ' ')); + const QString paramName = QString::fromUtf8( + QByteArray::fromPercentEncoding(asQByteArray(nameComponent)).replace('+', ' ')); const QByteArray paramValue = valueComponent.isNull() ? QByteArray("") - : QByteArray::fromPercentEncoding(valueComponent.toByteArray()).replace('+', ' '); + : QByteArray::fromPercentEncoding(asQByteArray(valueComponent)).replace('+', ' '); m_request.query[paramName] = paramValue; } diff --git a/src/base/utils/bytearray.cpp b/src/base/utils/bytearray.cpp index fce938885cb8..cae871f38c05 100644 --- a/src/base/utils/bytearray.cpp +++ b/src/base/utils/bytearray.cpp @@ -60,6 +60,13 @@ QList Utils::ByteArray::splitToViews(const QByteArrayView in, co return ret; } +QByteArray Utils::ByteArray::asQByteArray(const QByteArrayView view) +{ + // `QByteArrayView::toByteArray()` will deep copy the data + // So we provide our own fast path for appropriate situations/code + return QByteArray::fromRawData(view.constData(), view.size()); +} + QByteArray Utils::ByteArray::toBase32(const QByteArray &in) { const char alphabet[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"; diff --git a/src/base/utils/bytearray.h b/src/base/utils/bytearray.h index c054256de797..d0930dedef61 100644 --- a/src/base/utils/bytearray.h +++ b/src/base/utils/bytearray.h @@ -39,6 +39,7 @@ namespace Utils::ByteArray { // Mimic QStringView(in).split(sep, behavior) QList splitToViews(QByteArrayView in, QByteArrayView sep, Qt::SplitBehavior behavior = Qt::KeepEmptyParts); + QByteArray asQByteArray(QByteArrayView view); QByteArray toBase32(const QByteArray &in); } diff --git a/src/base/utils/password.cpp b/src/base/utils/password.cpp index 97abdad70399..ce136efe5c19 100644 --- a/src/base/utils/password.cpp +++ b/src/base/utils/password.cpp @@ -103,8 +103,8 @@ bool Utils::Password::PBKDF2::verify(const QByteArray &secret, const QByteArray if (list.size() != 2) return false; - const QByteArray salt = QByteArray::fromBase64(list[0].toByteArray()); - const QByteArray key = QByteArray::fromBase64(list[1].toByteArray()); + const QByteArray salt = QByteArray::fromBase64(Utils::ByteArray::asQByteArray(list[0])); + const QByteArray key = QByteArray::fromBase64(Utils::ByteArray::asQByteArray(list[1])); std::array outBuf {}; const int hmacResult = PKCS5_PBKDF2_HMAC(password.constData(), password.size()