summaryrefslogtreecommitdiffstats
path: root/src/network/access
diff options
context:
space:
mode:
authorMarc Mutz <marc.mutz@qt.io>2023-12-14 15:31:38 +0100
committerMarc Mutz <marc.mutz@qt.io>2024-01-09 18:54:46 +0100
commit7897ec88f426773cea38ce8c21091a05718a09e7 (patch)
treefd27302bed07663423e5a5f53fa17faab77fc98f /src/network/access
parent789cbeacdf1b894cde5e6cd6affc41d154716435 (diff)
QHttpHeaders: add value(name, fall-back)
The vast majority of header fields appear only once, but there was no efficient way to get that value: values() returns as a QList<QByteArray> (allocating) while combinedValue() returns a QByteArray constructed from values().join() (also allocating). It follows that the QHttpHeaders API is incomplete (lacks an efficient basis of operations in EoP terms). Add a value() function that returns either the value or a user-provided fall-back as a QByteArrayView. Unlike values() and combinedValue(), this function can be noexcept, greatly improving codegen for callers. Found in API review. Pick-to: 6.7 Task-number: QTBUG-107042 Change-Id: I2da20815fd46fdd7f150c224f41eee53abed313e Reviewed-by: Juha Vuolle <juha.vuolle@qt.io> Reviewed-by: MÃ¥rten Nordheim <marten.nordheim@qt.io>
Diffstat (limited to 'src/network/access')
-rw-r--r--src/network/access/qhttpheaders.cpp23
-rw-r--r--src/network/access/qhttpheaders.h3
2 files changed, 26 insertions, 0 deletions
diff --git a/src/network/access/qhttpheaders.cpp b/src/network/access/qhttpheaders.cpp
index de2f7e148a..683eab21d4 100644
--- a/src/network/access/qhttpheaders.cpp
+++ b/src/network/access/qhttpheaders.cpp
@@ -975,6 +975,29 @@ void QHttpHeaders::removeAt(qsizetype i)
}
/*!
+ Returns the value of the (first) header \a name, or \a defaultValue if it
+ doesn't exist.
+
+ \sa value(QHttpHeaders::WellKnownHeader, QByteArrayView)
+*/
+QByteArrayView QHttpHeaders::value(QAnyStringView name, QByteArrayView defaultValue) const noexcept
+{
+ for (const auto &h : std::as_const(d->headers)) {
+ if (headerNameIs(h, name))
+ return h.value;
+ }
+ return defaultValue;
+}
+
+/*!
+ \overload value(QAnyStringView, QByteArrayView)
+*/
+QByteArrayView QHttpHeaders::value(WellKnownHeader name, QByteArrayView defaultValue) const noexcept
+{
+ return value(headerNames[qToUnderlying(name)], defaultValue);
+}
+
+/*!
Returns the values of header \a name in a list. Returns an empty
list if header with \a name doesn't exist.
diff --git a/src/network/access/qhttpheaders.h b/src/network/access/qhttpheaders.h
index 636f535c88..98b4ad62d1 100644
--- a/src/network/access/qhttpheaders.h
+++ b/src/network/access/qhttpheaders.h
@@ -237,6 +237,9 @@ public:
Q_NETWORK_EXPORT void removeAll(WellKnownHeader name);
Q_NETWORK_EXPORT void removeAt(qsizetype i);
+ Q_NETWORK_EXPORT QByteArrayView value(QAnyStringView name, QByteArrayView defaultValue = {}) const noexcept;
+ Q_NETWORK_EXPORT QByteArrayView value(WellKnownHeader name, QByteArrayView defaultValue = {}) const noexcept;
+
Q_NETWORK_EXPORT QList<QByteArray> values(QAnyStringView name) const;
Q_NETWORK_EXPORT QList<QByteArray> values(WellKnownHeader name) const;