diff options
author | Marc Mutz <marc.mutz@qt.io> | 2023-12-14 15:31:38 +0100 |
---|---|---|
committer | Marc Mutz <marc.mutz@qt.io> | 2024-01-09 18:54:46 +0100 |
commit | 7897ec88f426773cea38ce8c21091a05718a09e7 (patch) | |
tree | fd27302bed07663423e5a5f53fa17faab77fc98f /src/network/access | |
parent | 789cbeacdf1b894cde5e6cd6affc41d154716435 (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.cpp | 23 | ||||
-rw-r--r-- | src/network/access/qhttpheaders.h | 3 |
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; |