Add QHttpHeaders::valueAt() function

We need a way for users to consume the complete contents of
QHttpHeaders.

For now, the only way is

    for (const auto &name : h.names())
        use(h.value/combinedValue(name));

which is quadratic.

Adding the usual iterators and operator[] would require us to
expose the underlying value_type, which we're not ready to do, yet.

So add valueAt() and (in a follow-up) nameAt() functions to enable
efficient indexed iteration without the need to expose a value_type.

Resulted from API-review

Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
Reviewed-by: Marc Mutz <marc.mutz@qt.io>
Reviewed-by: Ivan Solovev <ivan.solovev@qt.io>
(cherry picked from commit 4bb12dab6a13c6deee713a77efa9ce996adc97a9)
Change-Id: I2ee509d89e6f9080c17a4cef947f80f312d75180
This commit is contained in:
Juha Vuolle 2024-01-19 07:25:51 +02:00
parent 9e8761e8e9
commit 6c0d08d16a
3 changed files with 23 additions and 0 deletions

View File

@ -987,6 +987,18 @@ QList<QByteArray> QHttpHeaders::values(WellKnownHeader name) const
return values(headerNames[qToUnderlying(name)]);
}
/*!
Returns the header value at index \a i. The index \a i must be valid
(see \l size()).
\sa size(), value(), values(), combinedValue()
*/
QByteArrayView QHttpHeaders::valueAt(qsizetype i) const noexcept
{
d->verify(i);
return d->headers.at(i).value;
}
/*!
Returns the values of header \a name in a comma-combined string.
Returns a \c null QByteArray if the header with \a name doesn't

View File

@ -235,6 +235,8 @@ public:
Q_NETWORK_EXPORT QList<QByteArray> values(QAnyStringView name) const;
Q_NETWORK_EXPORT QList<QByteArray> values(WellKnownHeader name) const;
Q_NETWORK_EXPORT QByteArrayView valueAt(qsizetype i) const noexcept;
Q_NETWORK_EXPORT QByteArray combinedValue(QAnyStringView name) const;
Q_NETWORK_EXPORT QByteArray combinedValue(WellKnownHeader name) const;

View File

@ -186,6 +186,15 @@ void tst_QHttpHeaders::accessors()
QCOMPARE(h1.size(), 5);
QCOMPARE(h1.names().size(), 2);
// valueAt()
h1.clear();
h1.append(n1, v1);
h1.append(n2, v2);
h1.append(n3, v3);
QCOMPARE(h1.valueAt(0), v1);
QCOMPARE(h1.valueAt(1), v2);
QCOMPARE(h1.valueAt(2), v3);
// removeAll()
h1.clear();
QVERIFY(h1.append(n1, v1));