diff options
author | Juha Vuolle <juha.vuolle@qt.io> | 2024-02-26 11:59:37 +0200 |
---|---|---|
committer | Juha Vuolle <juha.vuolle@qt.io> | 2024-02-28 08:13:55 +0200 |
commit | 0119f0a43bf2356f9f1f7ed83ed7abe5777b2dcf (patch) | |
tree | 11a56458a0915e6a173881733f4f798fe9094a6f /src/network | |
parent | d83b5350689242e7815a2c2e6b6168fe1f67d943 (diff) |
Add QNetworkRequest attribute support to QNetworkRequestFactory
[ChangeLog][QtNetwork][QNetworkRequestFactory] Add QNetworkRequest
attribute support to QNetworkRequestFactory
Fixes: QTBUG-122397
Change-Id: Ie73f104cdad9f8f0721d8ee28f79095bfb04fb3c
Reviewed-by: MÃ¥rten Nordheim <marten.nordheim@qt.io>
Reviewed-by: Ivan Solovev <ivan.solovev@qt.io>
Diffstat (limited to 'src/network')
-rw-r--r-- | src/network/access/qnetworkrequestfactory.cpp | 94 | ||||
-rw-r--r-- | src/network/access/qnetworkrequestfactory.h | 8 | ||||
-rw-r--r-- | src/network/access/qnetworkrequestfactory_p.h | 3 |
3 files changed, 105 insertions, 0 deletions
diff --git a/src/network/access/qnetworkrequestfactory.cpp b/src/network/access/qnetworkrequestfactory.cpp index 081ff8ac8f..c9b94f7707 100644 --- a/src/network/access/qnetworkrequestfactory.cpp +++ b/src/network/access/qnetworkrequestfactory.cpp @@ -506,6 +506,96 @@ QNetworkRequest::Priority QNetworkRequestFactory::priority() const return d->priority; } +/*! + \since 6.8 + + Sets the value associated with \a attribute to \a value. + If the attribute is already set, the previous value is + replaced. The attributes are set to any future requests + created by this factory. + + \sa attribute(), clearAttribute(), clearAttributes(), + QNetworkRequest::Attribute +*/ +void QNetworkRequestFactory::setAttribute(QNetworkRequest::Attribute attribute, + const QVariant &value) +{ + if (attribute == QNetworkRequest::HttpStatusCodeAttribute + || attribute == QNetworkRequest::HttpReasonPhraseAttribute + || attribute == QNetworkRequest::RedirectionTargetAttribute + || attribute == QNetworkRequest::ConnectionEncryptedAttribute + || attribute == QNetworkRequest::SourceIsFromCacheAttribute + || attribute == QNetworkRequest::HttpPipeliningWasUsedAttribute + || attribute == QNetworkRequest::Http2WasUsedAttribute + || attribute == QNetworkRequest::OriginalContentLengthAttribute) + { + qCWarning(lcQrequestfactory, "%i is a reply-only attribute, ignoring.", attribute); + return; + } + d.detach(); + d->attributes.insert(attribute, value); +} + +/*! + \since 6.8 + + Returns the value associated with \a attribute. If the + attribute has not been set, returns a default-constructed \l QVariant. + + \sa attribute(QNetworkRequest::Attribute, const QVariant &), + setAttribute(), clearAttributes(), QNetworkRequest::Attribute + +*/ +QVariant QNetworkRequestFactory::attribute(QNetworkRequest::Attribute attribute) const +{ + return d->attributes.value(attribute); +} + +/*! + \since 6.8 + + Returns the value associated with \a attribute. If the + attribute has not been set, returns \a defaultValue. + + \sa attribute(), setAttribute(), clearAttributes(), + QNetworkRequest::Attribute +*/ +QVariant QNetworkRequestFactory::attribute(QNetworkRequest::Attribute attribute, + const QVariant &defaultValue) const +{ + return d->attributes.value(attribute, defaultValue); +} + +/*! + \since 6.8 + + Clears \a attribute set to this factory. + + \sa attribute(), setAttribute() +*/ +void QNetworkRequestFactory::clearAttribute(QNetworkRequest::Attribute attribute) +{ + if (!d->attributes.contains(attribute)) + return; + d.detach(); + d->attributes.remove(attribute); +} + +/*! + \since 6.8 + + Clears any attributes set to this factory. + + \sa attribute(), setAttribute() +*/ +void QNetworkRequestFactory::clearAttributes() +{ + if (d->attributes.isEmpty()) + return; + d.detach(); + d->attributes.clear(); +} + QNetworkRequestFactoryPrivate::QNetworkRequestFactoryPrivate() = default; @@ -539,6 +629,10 @@ QNetworkRequest QNetworkRequestFactoryPrivate::newRequest(const QUrl &url) const request.setTransferTimeout(transferTimeout); request.setPriority(priority); + + for (const auto &[attribute, value] : attributes.asKeyValueRange()) + request.setAttribute(attribute, value); + return request; } diff --git a/src/network/access/qnetworkrequestfactory.h b/src/network/access/qnetworkrequestfactory.h index ea887ea05b..c170b75c8e 100644 --- a/src/network/access/qnetworkrequestfactory.h +++ b/src/network/access/qnetworkrequestfactory.h @@ -11,6 +11,7 @@ #include <QtCore/qshareddata.h> #include <QtCore/qurlquery.h> #include <QtCore/qurl.h> +#include <QtCore/qvariant.h> #include <chrono> @@ -77,6 +78,13 @@ public: Q_NETWORK_EXPORT void setPriority(QNetworkRequest::Priority priority); Q_NETWORK_EXPORT QNetworkRequest::Priority priority() const; + Q_NETWORK_EXPORT QVariant attribute(QNetworkRequest::Attribute attribute) const; + Q_NETWORK_EXPORT QVariant attribute(QNetworkRequest::Attribute attribute, + const QVariant &defaultValue) const; + Q_NETWORK_EXPORT void setAttribute(QNetworkRequest::Attribute attribute, const QVariant &value); + Q_NETWORK_EXPORT void clearAttribute(QNetworkRequest::Attribute attribute); + Q_NETWORK_EXPORT void clearAttributes(); + private: #ifndef QT_NO_DEBUG_STREAM friend Q_NETWORK_EXPORT QDebug operator<<(QDebug debug, const QNetworkRequestFactory &reply); diff --git a/src/network/access/qnetworkrequestfactory_p.h b/src/network/access/qnetworkrequestfactory_p.h index e98a1f7bb9..4116669f21 100644 --- a/src/network/access/qnetworkrequestfactory_p.h +++ b/src/network/access/qnetworkrequestfactory_p.h @@ -20,9 +20,11 @@ #if QT_CONFIG(ssl) #include <QtNetwork/qsslconfiguration.h> #endif +#include <QtCore/qhash.h> #include <QtCore/qshareddata.h> #include <QtCore/qurl.h> #include <QtCore/qurlquery.h> +#include <QtCore/qvariant.h> QT_BEGIN_NAMESPACE @@ -46,6 +48,7 @@ public: QUrlQuery queryParameters; QNetworkRequest::Priority priority = QNetworkRequest::NormalPriority; std::chrono::milliseconds transferTimeout{0}; + QHash<QNetworkRequest::Attribute, QVariant> attributes; }; QT_END_NAMESPACE |