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>
This commit is contained in:
parent
789cbeacdf
commit
7897ec88f4
@ -974,6 +974,29 @@ void QHttpHeaders::removeAt(qsizetype i)
|
|||||||
d->headers.removeAt(i);
|
d->headers.removeAt(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
|
Returns the values of header \a name in a list. Returns an empty
|
||||||
list if header with \a name doesn't exist.
|
list if header with \a name doesn't exist.
|
||||||
|
@ -237,6 +237,9 @@ public:
|
|||||||
Q_NETWORK_EXPORT void removeAll(WellKnownHeader name);
|
Q_NETWORK_EXPORT void removeAll(WellKnownHeader name);
|
||||||
Q_NETWORK_EXPORT void removeAt(qsizetype i);
|
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(QAnyStringView name) const;
|
||||||
Q_NETWORK_EXPORT QList<QByteArray> values(WellKnownHeader name) const;
|
Q_NETWORK_EXPORT QList<QByteArray> values(WellKnownHeader name) const;
|
||||||
|
|
||||||
|
@ -168,9 +168,10 @@ void tst_QHttpHeaders::accessors()
|
|||||||
QVERIFY(h1.has(QHttpHeaders::WellKnownHeader::Accept));
|
QVERIFY(h1.has(QHttpHeaders::WellKnownHeader::Accept));
|
||||||
QVERIFY(h1.has("accept"));
|
QVERIFY(h1.has("accept"));
|
||||||
|
|
||||||
// values()
|
// values()/value()
|
||||||
#define EXISTS_NOT(H, N) do { \
|
#define EXISTS_NOT(H, N) do { \
|
||||||
QVERIFY(!H.has(N)); \
|
QVERIFY(!H.has(N)); \
|
||||||
|
QCOMPARE(H.value(N, "ENOENT"), "ENOENT"); \
|
||||||
const auto values = H.values(N); \
|
const auto values = H.values(N); \
|
||||||
QVERIFY(values.isEmpty()); \
|
QVERIFY(values.isEmpty()); \
|
||||||
QVERIFY(H.combinedValue(N).isNull()); \
|
QVERIFY(H.combinedValue(N).isNull()); \
|
||||||
@ -180,6 +181,7 @@ void tst_QHttpHeaders::accessors()
|
|||||||
const std::array expected = { __VA_ARGS__ }; \
|
const std::array expected = { __VA_ARGS__ }; \
|
||||||
static_assert(std::tuple_size_v<decltype(expected)> == X); \
|
static_assert(std::tuple_size_v<decltype(expected)> == X); \
|
||||||
QVERIFY(H.has(N)); \
|
QVERIFY(H.has(N)); \
|
||||||
|
QCOMPARE(H.value(N, "ENOENT"), expected.front()); \
|
||||||
const auto values = H.values(N); \
|
const auto values = H.values(N); \
|
||||||
QCOMPARE(values.size(), X); \
|
QCOMPARE(values.size(), X); \
|
||||||
QCOMPARE(values.front(), expected.front()); \
|
QCOMPARE(values.front(), expected.front()); \
|
||||||
|
Loading…
x
Reference in New Issue
Block a user