8#include <QtNetwork/qsslconfiguration.h>
11#include <QtCore/qloggingcategory.h>
12#include <QtCore/qmap.h>
16QT_DEFINE_QESDP_SPECIALIZATION_DTOR(QNetworkRequestFactoryPrivate)
18using namespace Qt::StringLiterals;
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
50
51
52
53
54
56QNetworkRequestFactory::QNetworkRequestFactory()
57 : d(
new QNetworkRequestFactoryPrivate)
62
63
64
65
66
67
68
69
70
71
72
74 : d(
new QNetworkRequestFactoryPrivate(baseUrl))
79
80
85
86
91
92
97
98
99
100
101
102
103
104
107
108
109
110
111
112
113
114
117
118
119
122
123
124
125
126
127
128
129
136
137
138
139
142 if (d->baseUrl == url)
151
152
153
154
155
156QSslConfiguration QNetworkRequestFactory::sslConfiguration()
const
162
163
164
165
166void QNetworkRequestFactory::setSslConfiguration(
const QSslConfiguration &configuration)
168 if (d->sslConfig == configuration)
172 d->sslConfig = configuration;
177
178
179
180
181
182
183
187 return d->newRequest(d->requestUrl());
191
192
193
194
195
196
197
200 return d->newRequest(d->requestUrl(&path));
204
205
206
207
208
209
210
213 return d->newRequest(d->requestUrl(
nullptr, &query));
217
218
219
220
221
222
223
224
225
226
229 return d->newRequest(d->requestUrl(&path, &query));
233
234
235
236
237
238
239
240
244 d->headers = headers;
248
249
250
251
258
259
260
261
264 if (d->headers.isEmpty())
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
291 return d->bearerToken;
295
296
297
298
301 if (d->bearerToken == token)
305 d->bearerToken = token;
309
310
311
312
315 if (d->bearerToken.isEmpty())
319 d->bearerToken.clear();
323
324
325
326
333
334
335
336
337
338
339
340
341
344 if (d->userName == userName)
347 d->userName = userName;
351
352
355 if (d->userName.isEmpty())
362
363
364
365
372
373
374
375
376
377
378
379
380
383 if (d->password == password)
386 d->password = password;
390
391
392
393
396 if (d->password.isEmpty())
403
404
405
406
407
410 if (d->transferTimeout == timeout)
414 d->transferTimeout = timeout;
418
419
420
421
422
425 return d->transferTimeout;
429
430
431
432
433
434
435
436
437
438
439
442 return d->queryParameters;
446
447
448
449
450
453 if (d->queryParameters == query)
457 d->queryParameters = query;
461
462
463
464
467 if (d->queryParameters.isEmpty())
471 d->queryParameters.clear();
475
476
477
478
479
480
481
482
483
486 if (d->priority == priority)
489 d->priority = priority;
493
494
495
496
497
498
499
506
507
508
509
510
511
512
513
514
515
517 const QVariant &value)
519 if (attribute == QNetworkRequest::HttpStatusCodeAttribute
520 || attribute == QNetworkRequest::HttpReasonPhraseAttribute
521 || attribute == QNetworkRequest::RedirectionTargetAttribute
522 || attribute == QNetworkRequest::ConnectionEncryptedAttribute
523 || attribute == QNetworkRequest::SourceIsFromCacheAttribute
524 || attribute == QNetworkRequest::HttpPipeliningWasUsedAttribute
525 || attribute == QNetworkRequest::Http2WasUsedAttribute
526 || attribute == QNetworkRequest::OriginalContentLengthAttribute)
528 qCWarning(lcQrequestfactory,
"%i is a reply-only attribute, ignoring.", attribute);
532 d->attributes.insert(attribute, value);
536
537
538
539
540
541
542
543
544
547 return d->attributes.value(attribute);
551
552
553
554
555
556
557
558
560 const QVariant &defaultValue)
const
562 return d->attributes.value(attribute, defaultValue);
566
567
568
569
570
571
574 if (!d->attributes.contains(attribute))
577 d->attributes.remove(attribute);
581
582
583
584
585
586
589 if (d->attributes.isEmpty())
592 d->attributes.clear();
595QNetworkRequestFactoryPrivate::QNetworkRequestFactoryPrivate()
598QNetworkRequestFactoryPrivate::QNetworkRequestFactoryPrivate(
const QUrl &baseUrl)
603QNetworkRequest QNetworkRequestFactoryPrivate::newRequest(
const QUrl &url)
const
605 QNetworkRequest request;
608 if (!sslConfig.isNull())
609 request.setSslConfiguration(sslConfig);
612 constexpr char Bearer[] =
"Bearer ";
613 if (!bearerToken.isEmpty())
614 h.replaceOrAppend(QHttpHeaders::WellKnownHeader::Authorization, Bearer + bearerToken);
615 request.setHeaders(std::move(h));
617 request.setTransferTimeout(transferTimeout);
618 request.setPriority(priority);
620 for (
const auto &[attribute, value] : attributes.asKeyValueRange())
621 request.setAttribute(attribute, value);
626QUrl QNetworkRequestFactoryPrivate::requestUrl(
const QString *path,
627 const QUrlQuery *query)
const
629 const QUrl providedPath = path ? QUrl(*path) : QUrl{};
630 const QUrlQuery providedQuery = query ? *query : QUrlQuery();
632 if (!providedPath.scheme().isEmpty() || !providedPath.host().isEmpty()) {
633 qCWarning(lcQrequestfactory,
"The provided path %ls may only contain path and query item "
634 "components, and other parts will be ignored. Set the baseUrl instead",
635 qUtf16Printable(providedPath.toDisplayString()));
638 QUrl resultUrl = baseUrl;
639 QUrlQuery resultQuery(providedQuery);
640 QString basePath = baseUrl.path();
642 resultUrl.setUserName(userName);
643 resultUrl.setPassword(password);
646 const QString requestPath{providedPath.path()};
647 const QUrlQuery pathQueryItems{providedPath};
649 if (!pathQueryItems.isEmpty()) {
651 const auto items = pathQueryItems.queryItems(QUrl::ComponentFormattingOption::FullyEncoded);
652 for (
const auto &[key, value]: items)
653 resultQuery.addQueryItem(key, value);
656 if (!queryParameters.isEmpty()) {
658 const QList<std::pair<QString,QString>> items =
659 queryParameters.queryItems(QUrl::ComponentFormattingOption::FullyEncoded);
660 for (
const auto &item: items)
661 resultQuery.addQueryItem(item.first, item.second);
664 if (!resultQuery.isEmpty())
665 resultUrl.setQuery(resultQuery);
667 if (requestPath.isEmpty())
673 if (basePath.endsWith(u'/') && requestPath.startsWith(u'/'))
675 else if (!requestPath.startsWith(u'/') && !basePath.endsWith(u'/'))
676 basePath.append(u'/');
678 resultUrl.setPath(basePath.append(requestPath));
682#ifndef QT_NO_DEBUG_STREAM
684
685
686
687
688
689
690
693 const QDebugStateSaver saver(debug);
694 debug.resetFormat().nospace();
696 debug <<
"QNetworkRequestFactory(baseUrl = " << factory.baseUrl()
697 <<
", headers = " << factory.commonHeaders()
698 <<
", queryParameters = " << factory.queryParameters().queryItems()
699 <<
", bearerToken = " << (factory.bearerToken().isEmpty() ?
"(empty)" :
"(is set)")
700 <<
", transferTimeout = " << factory.transferTimeout()
701 <<
", userName = " << (factory.userName().isEmpty() ?
"(empty)" :
"(is set)")
702 <<
", password = " << (factory.password().isEmpty() ?
"(empty)" :
"(is set)")
704 <<
", SSL configuration"
705 << (factory.sslConfiguration().isNull() ?
" is not set (default)" :
" is set")
707 <<
", no SSL support"
Convenience class for grouping remote server endpoints that share common network request properties.
Q_NETWORK_EXPORT void setQueryParameters(const QUrlQuery &query)
Sets query parameters that are added to individual requests' query parameters.
Q_NETWORK_EXPORT void clearUserName()
Clears the username set to this factory.
Q_NETWORK_EXPORT void setBaseUrl(const QUrl &url)
Sets the base URL used in individual requests to url.
Q_NETWORK_EXPORT ~QNetworkRequestFactory()
Destroys this QNetworkRequestFactory object.
Q_NETWORK_EXPORT void clearBearerToken()
Clears the bearer token.
Q_NETWORK_EXPORT void setBearerToken(const QByteArray &token)
Sets the bearer token to token.
Q_NETWORK_EXPORT void setAttribute(QNetworkRequest::Attribute attribute, const QVariant &value)
Q_NETWORK_EXPORT void clearQueryParameters()
Clears the query parameters.
Q_NETWORK_EXPORT void clearPassword()
Clears the password set to this factory.
Q_NETWORK_EXPORT void clearCommonHeaders()
Clears current headers.
Q_NETWORK_EXPORT void clearAttributes()
Q_NETWORK_EXPORT void setUserName(const QString &userName)
Sets the username of this factory to userName.
Q_NETWORK_EXPORT void setTransferTimeout(std::chrono::milliseconds timeout)
Sets timeout used for transfers.
Q_NETWORK_EXPORT void setPassword(const QString &password)
Sets the password of this factory to password.
Q_NETWORK_EXPORT void setPriority(QNetworkRequest::Priority priority)
Q_NETWORK_EXPORT void setCommonHeaders(const QHttpHeaders &headers)
Sets headers that are common to all requests.
Combined button and popup list for selecting options.
Q_STATIC_LOGGING_CATEGORY(lcAccessibilityCore, "qt.accessibility.core")