9#include <QtNetwork/qhttpmultipart.h>
10#include <QtNetwork/qnetworkaccessmanager.h>
11#include <QtNetwork/qnetworkreply.h>
13#include <QtCore/qjsondocument.h>
14#include <QtCore/qjsonobject.h>
15#include <QtCore/qloggingcategory.h>
16#include <QtCore/qthread.h>
20using namespace Qt::StringLiterals;
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
218
219
220
221
222
223
224
227
228
229
230
231
232
233
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
271
272
273
274
275
276
277
278
281
282
283
284
285
286
287
290
291
292
293
294
295
296
299
300
301
302
303
304
305
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
343
344
345
346
347
348
349
352
353
354
355
356
357
358
361
362
363
364
365
366
367
370
371
372
373
374
375
376
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
413
414
415
416
417
418
419
422
423
424
425
426
427
428
431
432
433
434
435
436
437
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
504
505
506
507
508
509
510
513
514
515
516
517
518
519
522
523
524
525
526
527
529QRestAccessManager::QRestAccessManager(QNetworkAccessManager *manager, QObject *parent)
530 : QObject(*
new QRestAccessManagerPrivate, parent)
532 Q_D(QRestAccessManager);
535 qCWarning(lcQrest,
"QRestAccessManager: QNetworkAccesManager is nullptr");
539
540
541QRestAccessManager::~QRestAccessManager()
545
546
547
548
549QNetworkAccessManager *QRestAccessManager::networkAccessManager()
const
551 Q_D(
const QRestAccessManager);
560 if (!activeRequests.isEmpty()) {
561 qCWarning(lcQrest,
"Access manager destroyed while %lld requests were still in progress",
562 qlonglong(activeRequests.size()));
566QNetworkReply *QRestAccessManager::postWithDataImpl(
const QNetworkRequest &request,
567 const QJsonDocument &data,
const QObject *context,
568 QtPrivate::QSlotObjectBase *slot)
570 Q_D(QRestAccessManager);
571 return d->executeRequest([](
auto qnam,
auto req,
auto data) {
return qnam->post(req, data); },
572 data, request, context, slot);
575QNetworkReply *QRestAccessManager::postWithDataImpl(
const QNetworkRequest &request,
576 const QVariantMap &data,
const QObject *context,
577 QtPrivate::QSlotObjectBase *slot)
579 return postWithDataImpl(request, QJsonDocument::fromVariant(data), context, slot);
582QNetworkReply *QRestAccessManager::postWithDataImpl(
const QNetworkRequest &request,
583 const QByteArray &data,
const QObject *context,
584 QtPrivate::QSlotObjectBase *slot)
586 Q_D(QRestAccessManager);
587 return d->executeRequest([&](
auto qnam) {
return qnam->post(request, data); }, context, slot);
590QNetworkReply *QRestAccessManager::postWithDataImpl(
const QNetworkRequest &request,
591 QHttpMultiPart *data,
const QObject *context,
592 QtPrivate::QSlotObjectBase *slot)
594 Q_D(QRestAccessManager);
595 return d->executeRequest([&](
auto qnam) {
return qnam->post(request, data); }, context, slot);
598QNetworkReply *QRestAccessManager::postWithDataImpl(
const QNetworkRequest &request,
599 QIODevice *data,
const QObject *context,
600 QtPrivate::QSlotObjectBase *slot)
602 Q_D(QRestAccessManager);
603 return d->executeRequest([&](
auto qnam) {
return qnam->post(request, data); }, context, slot);
606QNetworkReply *QRestAccessManager::getNoDataImpl(
const QNetworkRequest &request,
607 const QObject *context, QtPrivate::QSlotObjectBase *slot)
609 Q_D(QRestAccessManager);
610 return d->executeRequest([&](
auto qnam) {
return qnam->get(request); }, context, slot);
613QNetworkReply *QRestAccessManager::getWithDataImpl(
const QNetworkRequest &request,
614 const QByteArray &data,
const QObject *context,
615 QtPrivate::QSlotObjectBase *slot)
617 Q_D(QRestAccessManager);
618 return d->executeRequest([&](
auto qnam) {
return qnam->get(request, data); }, context, slot);
621QNetworkReply *QRestAccessManager::getWithDataImpl(
const QNetworkRequest &request,
622 const QJsonDocument &data,
const QObject *context,
623 QtPrivate::QSlotObjectBase *slot)
625 Q_D(QRestAccessManager);
626 return d->executeRequest([](
auto qnam,
auto req,
auto data) {
return qnam->get(req, data); },
627 data, request, context, slot);
630QNetworkReply *QRestAccessManager::getWithDataImpl(
const QNetworkRequest &request,
631 QIODevice *data,
const QObject *context,
632 QtPrivate::QSlotObjectBase *slot)
634 Q_D(QRestAccessManager);
635 return d->executeRequest([&](
auto qnam) {
return qnam->get(request, data); }, context, slot);
638QNetworkReply *QRestAccessManager::deleteResourceNoDataImpl(
const QNetworkRequest &request,
639 const QObject *context, QtPrivate::QSlotObjectBase *slot)
641 Q_D(QRestAccessManager);
642 return d->executeRequest([&](
auto qnam) {
return qnam->deleteResource(request); }, context, slot);
645QNetworkReply *QRestAccessManager::headNoDataImpl(
const QNetworkRequest &request,
646 const QObject *context, QtPrivate::QSlotObjectBase *slot)
648 Q_D(QRestAccessManager);
649 return d->executeRequest([&](
auto qnam) {
return qnam->head(request); }, context, slot);
652QNetworkReply *QRestAccessManager::putWithDataImpl(
const QNetworkRequest &request,
653 const QJsonDocument &data,
const QObject *context,
654 QtPrivate::QSlotObjectBase *slot)
656 Q_D(QRestAccessManager);
657 return d->executeRequest([](
auto qnam,
auto req,
auto data) {
return qnam->put(req, data); },
658 data, request, context, slot);
661QNetworkReply *QRestAccessManager::putWithDataImpl(
const QNetworkRequest &request,
662 const QVariantMap &data,
const QObject *context,
663 QtPrivate::QSlotObjectBase *slot)
665 return putWithDataImpl(request, QJsonDocument::fromVariant(data), context, slot);
668QNetworkReply *QRestAccessManager::putWithDataImpl(
const QNetworkRequest &request,
669 const QByteArray &data,
const QObject *context,
670 QtPrivate::QSlotObjectBase *slot)
672 Q_D(QRestAccessManager);
673 return d->executeRequest([&](
auto qnam) {
return qnam->put(request, data); }, context, slot);
676QNetworkReply *QRestAccessManager::putWithDataImpl(
const QNetworkRequest &request,
677 QHttpMultiPart *data,
const QObject *context,
678 QtPrivate::QSlotObjectBase *slot)
680 Q_D(QRestAccessManager);
681 return d->executeRequest([&](
auto qnam) {
return qnam->put(request, data); }, context, slot);
684QNetworkReply *QRestAccessManager::putWithDataImpl(
const QNetworkRequest &request, QIODevice *data,
685 const QObject *context, QtPrivate::QSlotObjectBase *slot)
687 Q_D(QRestAccessManager);
688 return d->executeRequest([&](
auto qnam) {
return qnam->put(request, data); }, context, slot);
693 static auto patch =
"PATCH"_ba;
697QNetworkReply *QRestAccessManager::patchWithDataImpl(
const QNetworkRequest &request,
698 const QJsonDocument &data,
const QObject *context,
699 QtPrivate::QSlotObjectBase *slot)
701 Q_D(QRestAccessManager);
702 return d->executeRequest(
703 [](
auto qnam,
auto req,
auto data) {
return qnam->sendCustomRequest(req, PATCH(), data); },
704 data, request, context, slot);
707QNetworkReply *QRestAccessManager::patchWithDataImpl(
const QNetworkRequest &request,
708 const QVariantMap &data,
const QObject *context,
709 QtPrivate::QSlotObjectBase *slot)
711 return patchWithDataImpl(request, QJsonDocument::fromVariant(data), context, slot);
714QNetworkReply *QRestAccessManager::patchWithDataImpl(
const QNetworkRequest &request,
715 const QByteArray &data,
const QObject *context,
716 QtPrivate::QSlotObjectBase *slot)
718 Q_D(QRestAccessManager);
719 return d->executeRequest([&](
auto qnam) {
return qnam->sendCustomRequest(request, PATCH(), data); },
723QNetworkReply *QRestAccessManager::patchWithDataImpl(
const QNetworkRequest &request, QIODevice *data,
724 const QObject *context, QtPrivate::QSlotObjectBase *slot)
726 Q_D(QRestAccessManager);
727 return d->executeRequest([&](
auto qnam) {
return qnam->sendCustomRequest(request, PATCH(), data); },
731QNetworkReply *QRestAccessManager::customWithDataImpl(
const QNetworkRequest &request,
732 const QByteArray& method,
const QByteArray &data,
733 const QObject *context,
734 QtPrivate::QSlotObjectBase *slot)
736 Q_D(QRestAccessManager);
737 return d->executeRequest([&](
auto qnam) {
return qnam->sendCustomRequest(request, method, data); },
741QNetworkReply *QRestAccessManager::customWithDataImpl(
const QNetworkRequest &request,
742 const QByteArray& method, QIODevice *data,
743 const QObject *context,
744 QtPrivate::QSlotObjectBase *slot)
746 Q_D(QRestAccessManager);
747 return d->executeRequest([&](
auto qnam) {
return qnam->sendCustomRequest(request, method, data); },
751QNetworkReply *QRestAccessManager::customWithDataImpl(
const QNetworkRequest &request,
752 const QByteArray& method, QHttpMultiPart *data,
753 const QObject *context,
754 QtPrivate::QSlotObjectBase *slot)
756 Q_D(QRestAccessManager);
757 return d->executeRequest([&](
auto qnam) {
return qnam->sendCustomRequest(request, method, data); },
762 const QObject *contextObject,
763 QtPrivate::SlotObjUniquePtr slot)
765 Q_Q(QRestAccessManager);
767 QtPrivate::SlotObjSharedPtr slotPtr(std::move(slot));
768 activeRequests.insert(reply, CallerInfo{contextObject, slotPtr});
772 QObject::connect(reply, &QNetworkReply::finished, q, [reply,
this]() {
773 handleReplyFinished(reply);
776 QObject::connect(reply, &QObject::destroyed, q, [reply,
this]() {
777 activeRequests.remove(reply);
781 QObject::connect(contextObject, &QObject::destroyed, q, [reply,
this]() {
782 activeRequests.remove(reply);
790 Q_Q(QRestAccessManager);
791 if (QThread::currentThread() != q->thread()) {
792 qCWarning(lcQrest,
"QRestAccessManager can only be called in the thread it belongs to");
795 if (contextObject && (contextObject->thread() != q->thread())) {
796 qCWarning(lcQrest,
"QRestAccessManager: the context object must reside in the same thread");
803 qCWarning(lcQrest,
"QRestAccessManager: QNetworkAccessManager not set");
809 auto request = activeRequests.find(reply);
810 if (request == activeRequests.end()) {
811 qCDebug(lcQrest,
"QRestAccessManager: Unexpected reply received, ignoring");
815 CallerInfo caller = request.value();
816 activeRequests.erase(request);
820 QRestReply restReply(reply);
821 void *argv[] = {
nullptr, &restReply };
823 QObject *context = caller.contextObject
824 ?
const_cast<QObject*>(caller.contextObject.get()) :
nullptr;
825 caller.slot->call(context, argv);
831#include "moc_qrestaccessmanager.cpp"
~QRestAccessManagerPrivate() override
QRestAccessManagerPrivate()
void verifyThreadAffinity(const QObject *contextObject)
Q_LOGGING_CATEGORY(lcEventDispatcher, "qt.eventdispatcher")
static const QByteArray & PATCH()