summaryrefslogtreecommitdiffstats
path: root/src/network/access/qhttp2protocolhandler.cpp
diff options
context:
space:
mode:
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 {};