summaryrefslogtreecommitdiffstats
path: root/src/network/access/qhttp2protocolhandler.cpp
diff options
context:
space:
mode:
authorAnton Kudryavtsev <anton.kudryavtsev@vk.team>2023-08-28 18:29:46 +0300
committerAnton Kudryavtsev <anton.kudryavtsev@vk.team>2023-09-25 20:06:39 +0300
commitbbace99e943aec8ddccf2b562da0e7ac72a9d9f6 (patch)
treee575bed64fb387344f5b6fc4ec88a2a7b6fe63a2 /src/network/access/qhttp2protocolhandler.cpp
parent58215288f40f08aa49cf9c157588498a39b5afdb (diff)
QHttp2ProtocolHandler: reduce allocations
Don't use QMap for parsing. Indroduce local enum and use it with std::array Change-Id: I60fed6991ac415e4ff3827ae621f2c9b5071dcbe Reviewed-by: MÃ¥rten Nordheim <marten.nordheim@qt.io> Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io>
Diffstat (limited to 'src/network/access/qhttp2protocolhandler.cpp')
-rw-r--r--src/network/access/qhttp2protocolhandler.cpp32
1 files changed, 21 insertions, 11 deletions
diff --git a/src/network/access/qhttp2protocolhandler.cpp b/src/network/access/qhttp2protocolhandler.cpp
index 3ce4f2229a..9ac3f8fd84 100644
--- a/src/network/access/qhttp2protocolhandler.cpp
+++ b/src/network/access/qhttp2protocolhandler.cpp
@@ -1475,30 +1475,40 @@ quint32 QHttp2ProtocolHandler::allocateStreamID()
static std::optional<QUrl> makeUrl(const HPack::HttpHeader &requestHeader)
{
- QMap<QByteArray, QByteArray> pseudoHeaders;
+ constexpr QByteArrayView names[] = { ":authority", ":method", ":path", ":scheme" };
+ enum PseudoHeaderEnum
+ {
+ Authority,
+ Method,
+ Path,
+ Scheme
+ };
+ std::array<std::optional<QByteArrayView>, std::size(names)> pseudoHeaders{};
for (const auto &field : requestHeader) {
- if (field.name == ":scheme" || field.name == ":path"
- || field.name == ":authority" || field.name == ":method") {
- if (field.value.isEmpty() || pseudoHeaders.contains(field.name))
+ const auto it = std::find(std::begin(names), std::end(names), QByteArrayView(field.name));
+ if (it != std::end(names)) {
+ const auto index = std::distance(std::begin(names), it);
+ if (field.value.isEmpty() || pseudoHeaders.at(index).has_value())
return {};
- pseudoHeaders[field.name] = field.value;
+ pseudoHeaders[index] = field.value;
}
}
- if (pseudoHeaders.size() != 4) {
+ if (!std::all_of(pseudoHeaders.begin(), pseudoHeaders.end(), [](const auto &x) { return x.has_value();})) {
// All four required, HTTP/2 8.1.2.3.
return {};
}
- const QByteArray method = pseudoHeaders[":method"];
+ const QByteArrayView method = pseudoHeaders[Method].value();
if (method.compare("get", Qt::CaseInsensitive) != 0 &&
- method.compare("head", Qt::CaseInsensitive) != 0)
+ method.compare("head", Qt::CaseInsensitive) != 0) {
return {};
+ }
QUrl url;
- url.setScheme(QLatin1StringView(pseudoHeaders[":scheme"]));
- url.setAuthority(QLatin1StringView(pseudoHeaders[":authority"]));
- url.setPath(QLatin1StringView(pseudoHeaders[":path"]));
+ url.setScheme(QLatin1StringView(pseudoHeaders[Scheme].value()));
+ url.setAuthority(QLatin1StringView(pseudoHeaders[Authority].value()));
+ url.setPath(QLatin1StringView(pseudoHeaders[Path].value()));
if (!url.isValid())
return {};