From 196594003742f0bf1c075ed5b2ec93e06f237206 Mon Sep 17 00:00:00 2001 From: Juha Vuolle Date: Fri, 19 Jan 2024 07:35:35 +0200 Subject: [PATCH] Add QHttpHeaders::nameAt() function MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 nameAt() and (in a previous commit) valueAt() functions to enable efficient indexed iteration without the need to expose a value_type. Return by QLatin1StringView, not QAnyStringView, because that statically encodes the actual encoding used (and required by HTTP specs and promised by the class documentation, so it won't need to change). For the setters, we want to be accomodating QString, QByteArray, etc, which is why those take QAnyStringView. Resulted from API-review. Pick-to: 6.7 Change-Id: I0153c5aad0f6260b5dbc963de0aaf4ef42fdd4f1 Reviewed-by: MÃ¥rten Nordheim Reviewed-by: Ivan Solovev Reviewed-by: Marc Mutz Reviewed-by: Juha Vuolle --- src/network/access/qhttpheaders.cpp | 16 +++++++++++++++- src/network/access/qhttpheaders.h | 1 + .../access/qhttpheaders/tst_qhttpheaders.cpp | 9 +++++++++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/network/access/qhttpheaders.cpp b/src/network/access/qhttpheaders.cpp index c6d76dee7e..1ea2890f21 100644 --- a/src/network/access/qhttpheaders.cpp +++ b/src/network/access/qhttpheaders.cpp @@ -991,7 +991,7 @@ QList QHttpHeaders::values(WellKnownHeader name) const Returns the header value at index \a i. The index \a i must be valid (see \l size()). - \sa size(), value(), values(), combinedValue() + \sa size(), value(), values(), combinedValue(), nameAt() */ QByteArrayView QHttpHeaders::valueAt(qsizetype i) const noexcept { @@ -999,6 +999,20 @@ QByteArrayView QHttpHeaders::valueAt(qsizetype i) const noexcept return d->headers.at(i).value; } +/*! + Returns the header name at index \a i. The index \a i must be valid + (see \l size()). + + Header names are case-insensitive, and the returned names are lower-cased. + + \sa size(), valueAt() +*/ +QLatin1StringView QHttpHeaders::nameAt(qsizetype i) const noexcept +{ + d->verify(i); + return QLatin1StringView{d->headers.at(i).name}; +} + /*! 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 diff --git a/src/network/access/qhttpheaders.h b/src/network/access/qhttpheaders.h index bb975b00dd..a153d7911e 100644 --- a/src/network/access/qhttpheaders.h +++ b/src/network/access/qhttpheaders.h @@ -236,6 +236,7 @@ public: Q_NETWORK_EXPORT QList values(WellKnownHeader name) const; Q_NETWORK_EXPORT QByteArrayView valueAt(qsizetype i) const noexcept; + Q_NETWORK_EXPORT QLatin1StringView nameAt(qsizetype i) const noexcept; Q_NETWORK_EXPORT QByteArray combinedValue(QAnyStringView name) const; Q_NETWORK_EXPORT QByteArray combinedValue(WellKnownHeader name) const; diff --git a/tests/auto/network/access/qhttpheaders/tst_qhttpheaders.cpp b/tests/auto/network/access/qhttpheaders/tst_qhttpheaders.cpp index 77f265c9e9..5f6f915420 100644 --- a/tests/auto/network/access/qhttpheaders/tst_qhttpheaders.cpp +++ b/tests/auto/network/access/qhttpheaders/tst_qhttpheaders.cpp @@ -195,6 +195,15 @@ void tst_QHttpHeaders::accessors() QCOMPARE(h1.valueAt(1), v2); QCOMPARE(h1.valueAt(2), v3); + // nameAt() + h1.clear(); + h1.append(n1, v1); + h1.append(n2, v2); + h1.append(n3, v3); + QCOMPARE(h1.nameAt(0), n1); + QCOMPARE(h1.nameAt(1), n2); + QCOMPARE(h1.nameAt(2), n3); + // removeAll() h1.clear(); QVERIFY(h1.append(n1, v1));