11#include "QtCore/qmutex.h"
12#include "QtCore/qstringlist.h"
18#include "private/qnoncontiguousbytedevice_p.h"
22class QNetworkAccessBackendFactoryData:
public QList<QNetworkAccessBackendFactory *>
25 QNetworkAccessBackendFactoryData()
29 ~QNetworkAccessBackendFactoryData()
31 QMutexLocker locker(&mutex);
35 QRecursiveMutex mutex;
37 static QBasicAtomicInt valid;
39Q_GLOBAL_STATIC(QNetworkAccessBackendFactoryData, factoryData)
40Q_CONSTINIT QBasicAtomicInt QNetworkAccessBackendFactoryData::valid = Q_BASIC_ATOMIC_INITIALIZER(0);
57QNetworkAccessBackend *
59 const QNetworkRequest &request)
61 if (QNetworkAccessBackendFactoryData::valid.loadRelaxed()) {
62 QMutexLocker locker(&factoryData()->mutex);
63 QNetworkAccessBackendFactoryData::ConstIterator it = factoryData()->constBegin(),
64 end = factoryData()->constEnd();
66 QNetworkAccessBackend *backend = (*it)->create(op, request);
68 backend->setManagerPrivate(
this);
79 if (QNetworkAccessBackendFactoryData::valid.loadRelaxed()) {
80 QMutexLocker locker(&factoryData()->mutex);
81 QNetworkAccessBackendFactoryData::ConstIterator it = factoryData()->constBegin();
82 QNetworkAccessBackendFactoryData::ConstIterator end = factoryData()->constEnd();
85 schemes += (*it)->supportedSchemes();
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
119
120
121
122
123
126
127
128
129
130
131
132
133
134
135
136
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
164
165
166
167
168
169
170
171
172
173
174
175
176
177
180
181
182
183
184
185
186
187
188
189
190
191
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
216
217
218
219
220
221
222
223QNetworkAccessBackend::QNetworkAccessBackend(TargetTypes targetTypes,
224 SecurityFeatures securityFeatures,
225 IOFeatures ioFeatures)
226 : QObject(*(
new QNetworkAccessBackendPrivate),
nullptr)
228 Q_D(QNetworkAccessBackend);
229 d->m_targetTypes = targetTypes;
230 d->m_securityFeatures = securityFeatures;
231 d->m_ioFeatures = ioFeatures;
235
236
237QNetworkAccessBackend::QNetworkAccessBackend(TargetTypes targetTypes)
238 : QNetworkAccessBackend(targetTypes, SecurityFeature::None, IOFeature::None)
243
244
245QNetworkAccessBackend::QNetworkAccessBackend(TargetTypes targetTypes,
246 SecurityFeatures securityFeatures)
247 : QNetworkAccessBackend(targetTypes, securityFeatures, IOFeature::None)
252
253
254QNetworkAccessBackend::QNetworkAccessBackend(TargetTypes targetTypes, IOFeatures ioFeatures)
255 : QNetworkAccessBackend(targetTypes, SecurityFeature::None, ioFeatures)
260
261
262QNetworkAccessBackend::~QNetworkAccessBackend()
264 delete d_func()->wrappedUploadByteDevice;
268
269
270
271
272
273QNetworkAccessBackend::SecurityFeatures QNetworkAccessBackend::securityFeatures()
const noexcept
275 return d_func()->m_securityFeatures;
279
280
281
282
283QNetworkAccessBackend::TargetTypes QNetworkAccessBackend::targetTypes()
const noexcept
285 return d_func()->m_targetTypes;
289
290
291
292
293QNetworkAccessBackend::IOFeatures QNetworkAccessBackend::ioFeatures()
const noexcept
295 return d_func()->m_ioFeatures;
299
300
301
302
303
304bool QNetworkAccessBackend::start()
306 Q_D(QNetworkAccessBackend);
307#ifndef QT_NO_NETWORKPROXY
308 if (targetTypes() & QNetworkAccessBackend::TargetType::Networked)
309 d->m_reply->proxyList = d->m_manager->queryProxy(QNetworkProxyQuery(url()));
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
335
336
337
338
339
340
341
342
343
346
347
348
349
350
351
352
353
354
355
356
360
361
362
363
364
365
366void QNetworkAccessBackend::setSslConfiguration(
const QSslConfiguration &configuration)
368 Q_UNUSED(configuration);
369 if (securityFeatures() & SecurityFeature::TLS) {
370 qWarning(
"Backend (%s) claiming to use TLS hasn't overridden setSslConfiguration.",
371 metaObject()->className());
376
377
378
379
380
381QSslConfiguration QNetworkAccessBackend::sslConfiguration()
const
383 if (securityFeatures() & SecurityFeature::TLS) {
384 qWarning(
"Backend (%s) claiming to use TLS hasn't overridden sslConfiguration.",
385 metaObject()->className());
392
393
394
395
396
397
398void QNetworkAccessBackend::ignoreSslErrors()
400 if (securityFeatures() & SecurityFeature::TLS) {
401 qWarning(
"Backend (%s) claiming to use TLS hasn't overridden ignoreSslErrors.",
402 metaObject()->className());
407
408
409
410
411
412void QNetworkAccessBackend::ignoreSslErrors(
const QList<QSslError> &errors)
415 if (securityFeatures() & SecurityFeature::TLS) {
416 qWarning(
"Backend (%s) claiming to use TLS hasn't overridden ignoreSslErrors.",
417 metaObject()->className());
422
423
424
425
426
427
428
429
430
431QByteArrayView QNetworkAccessBackend::readPointer()
433 if (ioFeatures() & IOFeature::ZeroCopy) {
434 qWarning(
"Backend (%s) claiming to support ZeroCopy hasn't overridden readPointer.",
435 metaObject()->className());
441
442
443
444
445
446
447
448
449
450void QNetworkAccessBackend::advanceReadPointer(qint64 distance)
453 if (ioFeatures() & IOFeature::ZeroCopy) {
454 qWarning(
"Backend (%s) claiming to support ZeroCopy hasn't overridden advanceReadPointer.",
455 metaObject()->className());
460
461
462
463
464
465
466
467qint64 QNetworkAccessBackend::read(
char *data, qint64 maxlen)
471 if ((ioFeatures() & IOFeature::ZeroCopy) == 0) {
472 qWarning(
"Backend (%s) is not ZeroCopy and has not implemented read(...)!",
473 metaObject()->className());
479
480
481
482
483
484
485bool QNetworkAccessBackend::wantToRead()
491#if QT_CONFIG(networkproxy)
493
494
495
496
497
498
499QList<QNetworkProxy> QNetworkAccessBackend::proxyList()
const
501 Q_ASSERT(targetTypes() & TargetType::Networked);
502 return d_func()->m_reply->proxyList;
507
508
509QUrl QNetworkAccessBackend::url()
const
511 return d_func()->m_reply->url;
515
516
517
518void QNetworkAccessBackend::setUrl(
const QUrl &url)
520 d_func()->m_reply->url = url;
524
525
526
527
528
529
530QVariant QNetworkAccessBackend::header(QNetworkRequest::KnownHeaders header)
const
532 return d_func()->m_reply->cookedHeaders.value(header);
536
537
538
539
540
541
542
543void QNetworkAccessBackend::setHeader(QNetworkRequest::KnownHeaders header,
const QVariant &value)
545 d_func()->m_reply->setCookedHeader(header, value);
549
550
551
552
553
554
555QByteArray QNetworkAccessBackend::rawHeader(
const QByteArray &header)
const
557 return d_func()->m_reply->q_func()->rawHeader(header);
561
562
563
564
565
566
567
568
569void QNetworkAccessBackend::setRawHeader(
const QByteArray &header,
const QByteArray &value)
571 d_func()->m_reply->setRawHeader(header, value);
575
576
577
578
579
580
581QHttpHeaders QNetworkAccessBackend::headers()
const
583 return d_func()->m_reply->headers();
587
588
589
590
591
592
593
594
595
596
597void QNetworkAccessBackend::setHeaders(QHttpHeaders &&newHeaders)
599 d_func()->m_reply->setHeaders(std::move(newHeaders));
603
604
605
606void QNetworkAccessBackend::setHeaders(
const QHttpHeaders &newHeaders)
608 d_func()->m_reply->setHeaders(newHeaders);
612
613
614
615QNetworkAccessManager::Operation QNetworkAccessBackend::operation()
const
617 return d_func()->m_reply->operation;
621
622
623
624
625
626bool QNetworkAccessBackend::isCachingEnabled()
const
628 return d_func()->m_canCache;
632
633
634
635
636
637void QNetworkAccessBackend::setCachingEnabled(
bool canCache)
639 d_func()->m_canCache = canCache;
643
644
645
646
647
648
649
650void QNetworkAccessBackend::setAttribute(QNetworkRequest::Attribute attribute,
651 const QVariant &value)
653 Q_D(QNetworkAccessBackend);
655 d->m_reply->attributes.insert(attribute, value);
657 d->m_reply->attributes.remove(attribute);
661
662
663
664
665
666
667
668
669QIODevice *QNetworkAccessBackend::createUploadByteDevice()
671 Q_D(QNetworkAccessBackend);
673 if (d->m_reply->outgoingDataBuffer)
674 d->uploadByteDevice =
675 QNonContiguousByteDeviceFactory::createShared(d->m_reply->outgoingDataBuffer);
676 else if (d->m_reply->outgoingData) {
677 d->uploadByteDevice =
678 QNonContiguousByteDeviceFactory::createShared(d->m_reply->outgoingData);
684 if (!isSynchronous()) {
685 connect(d->uploadByteDevice.get(), &QNonContiguousByteDevice::readProgress,
this,
686 [
this](qint64 a, qint64 b) {
687 Q_D(QNetworkAccessBackend);
688 if (!d->m_reply->isFinished)
689 d->m_reply->emitUploadProgress(a, b);
693 d->wrappedUploadByteDevice = QNonContiguousByteDeviceFactory::wrap(d->uploadByteDevice.get());
694 return d->wrappedUploadByteDevice;
698
699
700
701
702
703QIODevice *QNetworkAccessBackend::uploadByteDevice()
705 return d_func()->wrappedUploadByteDevice;
709
710
711
712
713bool QNetworkAccessBackend::isSynchronous()
const
715 return d_func()->m_isSynchronous;
719
720
721
722
723void QNetworkAccessBackend::setSynchronous(
bool synchronous)
725 if ((ioFeatures() & IOFeature::SupportsSynchronousMode) == 0)
727 d_func()->m_isSynchronous = synchronous;
731
732
733
734void QNetworkAccessBackend::readyRead()
736 d_func()->m_reply->backendNotify(QNetworkReplyImplPrivate::NotifyDownstreamReadyWrite);
740
741
742
743
744void QNetworkAccessBackend::finished()
746 d_func()->m_reply->finished();
750
751
752
753
754
755
756void QNetworkAccessBackend::error(QNetworkReply::NetworkError code,
const QString &errorString)
758 Q_ASSERT(!d_func()->m_reply->isFinished);
759 d_func()->m_reply->error(code, errorString);
762#ifndef QT_NO_NETWORKPROXY
764
765
766
767
768
769
770
771
772
773
774void QNetworkAccessBackend::proxyAuthenticationRequired(
const QNetworkProxy &proxy,
775 QAuthenticator *authenticator)
777 Q_D(QNetworkAccessBackend);
778 Q_ASSERT(authenticator);
779 d->m_manager->proxyAuthenticationRequired(QUrl(), proxy, isSynchronous(), authenticator,
780 &d->m_reply->lastProxyAuthentication);
785
786
787
788
789
790
791
792
793void QNetworkAccessBackend::authenticationRequired(QAuthenticator *authenticator)
795 Q_D(QNetworkAccessBackend);
796 Q_ASSERT(authenticator);
797 d->m_manager->authenticationRequired(authenticator, d->m_reply->q_func(), isSynchronous(),
798 d->m_reply->url, &d->m_reply->urlForLastAuthentication);
802
803
804
805void QNetworkAccessBackend::metaDataChanged()
807 d_func()->m_reply->metaDataChanged();
811
812
813
814void QNetworkAccessBackend::redirectionRequested(
const QUrl &destination)
816 d_func()->m_reply->redirectionRequested(destination);
820
821
822void QNetworkAccessBackend::setReplyPrivate(QNetworkReplyImplPrivate *reply)
824 d_func()->m_reply = reply;
828
829
830void QNetworkAccessBackend::setManagerPrivate(QNetworkAccessManagerPrivate *manager)
832 d_func()->m_manager = manager;
836
837
838
839QAbstractNetworkCache *QNetworkAccessBackend::networkCache()
const
841 return d_func()->m_manager->networkCache;
846
847
848QNetworkAccessBackendFactory::QNetworkAccessBackendFactory()
851 factoryData->append(
this);
855
856
857QNetworkAccessBackendFactory::~QNetworkAccessBackendFactory()
859 if (factoryData.exists())
860 factoryData->removeAll(
this);
865#include "moc_qnetworkaccessbackend_p.cpp"
QNetworkReplyImplPrivate * m_reply
QNetworkAccessBackend::SecurityFeatures m_securityFeatures
QNetworkAccessBackend::IOFeatures m_ioFeatures
QNetworkAccessManagerPrivate * m_manager
QIODevice * wrappedUploadByteDevice
std::shared_ptr< QNonContiguousByteDevice > uploadByteDevice
QNetworkAccessBackend::TargetTypes m_targetTypes
QStringList backendSupportedSchemes() const
QNetworkAccessBackend * findBackend(QNetworkAccessManager::Operation op, const QNetworkRequest &request)