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>
This commit is contained in:
parent
d83b535068
commit
0119f0a43b
@ -506,6 +506,96 @@ QNetworkRequest::Priority QNetworkRequestFactory::priority() const
|
|||||||
return d->priority;
|
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()
|
QNetworkRequestFactoryPrivate::QNetworkRequestFactoryPrivate()
|
||||||
= default;
|
= default;
|
||||||
|
|
||||||
@ -539,6 +629,10 @@ QNetworkRequest QNetworkRequestFactoryPrivate::newRequest(const QUrl &url) const
|
|||||||
|
|
||||||
request.setTransferTimeout(transferTimeout);
|
request.setTransferTimeout(transferTimeout);
|
||||||
request.setPriority(priority);
|
request.setPriority(priority);
|
||||||
|
|
||||||
|
for (const auto &[attribute, value] : attributes.asKeyValueRange())
|
||||||
|
request.setAttribute(attribute, value);
|
||||||
|
|
||||||
return request;
|
return request;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
#include <QtCore/qshareddata.h>
|
#include <QtCore/qshareddata.h>
|
||||||
#include <QtCore/qurlquery.h>
|
#include <QtCore/qurlquery.h>
|
||||||
#include <QtCore/qurl.h>
|
#include <QtCore/qurl.h>
|
||||||
|
#include <QtCore/qvariant.h>
|
||||||
|
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
|
|
||||||
@ -77,6 +78,13 @@ public:
|
|||||||
Q_NETWORK_EXPORT void setPriority(QNetworkRequest::Priority priority);
|
Q_NETWORK_EXPORT void setPriority(QNetworkRequest::Priority priority);
|
||||||
Q_NETWORK_EXPORT QNetworkRequest::Priority priority() const;
|
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:
|
private:
|
||||||
#ifndef QT_NO_DEBUG_STREAM
|
#ifndef QT_NO_DEBUG_STREAM
|
||||||
friend Q_NETWORK_EXPORT QDebug operator<<(QDebug debug, const QNetworkRequestFactory &reply);
|
friend Q_NETWORK_EXPORT QDebug operator<<(QDebug debug, const QNetworkRequestFactory &reply);
|
||||||
|
@ -20,9 +20,11 @@
|
|||||||
#if QT_CONFIG(ssl)
|
#if QT_CONFIG(ssl)
|
||||||
#include <QtNetwork/qsslconfiguration.h>
|
#include <QtNetwork/qsslconfiguration.h>
|
||||||
#endif
|
#endif
|
||||||
|
#include <QtCore/qhash.h>
|
||||||
#include <QtCore/qshareddata.h>
|
#include <QtCore/qshareddata.h>
|
||||||
#include <QtCore/qurl.h>
|
#include <QtCore/qurl.h>
|
||||||
#include <QtCore/qurlquery.h>
|
#include <QtCore/qurlquery.h>
|
||||||
|
#include <QtCore/qvariant.h>
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
|
|
||||||
@ -46,6 +48,7 @@ public:
|
|||||||
QUrlQuery queryParameters;
|
QUrlQuery queryParameters;
|
||||||
QNetworkRequest::Priority priority = QNetworkRequest::NormalPriority;
|
QNetworkRequest::Priority priority = QNetworkRequest::NormalPriority;
|
||||||
std::chrono::milliseconds transferTimeout{0};
|
std::chrono::milliseconds transferTimeout{0};
|
||||||
|
QHash<QNetworkRequest::Attribute, QVariant> attributes;
|
||||||
};
|
};
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
@ -27,6 +27,7 @@ private Q_SLOTS:
|
|||||||
void timeout();
|
void timeout();
|
||||||
void userInfo();
|
void userInfo();
|
||||||
void priority();
|
void priority();
|
||||||
|
void attributes();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const QUrl url1{u"http://foo.io"_s};
|
const QUrl url1{u"http://foo.io"_s};
|
||||||
@ -368,5 +369,55 @@ void tst_QNetworkRequestFactory::priority()
|
|||||||
QCOMPARE(request.priority(), QNetworkRequest::HighPriority);
|
QCOMPARE(request.priority(), QNetworkRequest::HighPriority);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void tst_QNetworkRequestFactory::attributes()
|
||||||
|
{
|
||||||
|
const auto attribute1 = QNetworkRequest::Attribute::BackgroundRequestAttribute;
|
||||||
|
const auto attribute2 = QNetworkRequest::User;
|
||||||
|
QNetworkRequestFactory factory;
|
||||||
|
QNetworkRequest request;
|
||||||
|
|
||||||
|
// Empty factory
|
||||||
|
QVERIFY(!factory.attribute(attribute1).isValid());
|
||||||
|
request = factory.createRequest();
|
||||||
|
QVERIFY(!request.attribute(attribute1).isValid());
|
||||||
|
|
||||||
|
// (Re-)set and clear individual attribute
|
||||||
|
factory.setAttribute(attribute1, true);
|
||||||
|
QVERIFY(factory.attribute(attribute1).isValid());
|
||||||
|
QCOMPARE(factory.attribute(attribute1).toBool(), true);
|
||||||
|
request = factory.createRequest();
|
||||||
|
QVERIFY(request.attribute(attribute1).isValid());
|
||||||
|
QCOMPARE(request.attribute(attribute1).toBool(), true);
|
||||||
|
// Replace previous value
|
||||||
|
factory.setAttribute(attribute1, false);
|
||||||
|
QVERIFY(factory.attribute(attribute1).isValid());
|
||||||
|
QCOMPARE(factory.attribute(attribute1).toBool(), false);
|
||||||
|
request = factory.createRequest();
|
||||||
|
QVERIFY(request.attribute(attribute1).isValid());
|
||||||
|
QCOMPARE(request.attribute(attribute1).toBool(), false);
|
||||||
|
// Clear individual attribute
|
||||||
|
factory.clearAttribute(attribute1);
|
||||||
|
QVERIFY(!factory.attribute(attribute1).isValid());
|
||||||
|
|
||||||
|
// Getter default value
|
||||||
|
QCOMPARE(factory.attribute(attribute2, 111).toInt(), 111); // default value returned
|
||||||
|
factory.setAttribute(attribute2, 222);
|
||||||
|
QCOMPARE(factory.attribute(attribute2, 111).toInt(), 222); // actual value returned
|
||||||
|
factory.clearAttribute(attribute2);
|
||||||
|
QCOMPARE(factory.attribute(attribute2, 111).toInt(), 111); // default value returned
|
||||||
|
|
||||||
|
// Clear attributes
|
||||||
|
factory.setAttribute(attribute1, true);
|
||||||
|
factory.setAttribute(attribute2, 333);
|
||||||
|
QVERIFY(factory.attribute(attribute1).isValid());
|
||||||
|
QVERIFY(factory.attribute(attribute2).isValid());
|
||||||
|
factory.clearAttributes();
|
||||||
|
QVERIFY(!factory.attribute(attribute1).isValid());
|
||||||
|
QVERIFY(!factory.attribute(attribute2).isValid());
|
||||||
|
request = factory.createRequest();
|
||||||
|
QVERIFY(!request.attribute(attribute1).isValid());
|
||||||
|
QVERIFY(!request.attribute(attribute2).isValid());
|
||||||
|
}
|
||||||
|
|
||||||
QTEST_MAIN(tst_QNetworkRequestFactory)
|
QTEST_MAIN(tst_QNetworkRequestFactory)
|
||||||
#include "tst_qnetworkrequestfactory.moc"
|
#include "tst_qnetworkrequestfactory.moc"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user