9#include <QtNetwork/qsslconfiguration.h>
12#include <QtCore/qloggingcategory.h>
13#include <QtCore/qmap.h>
17QT_DEFINE_QESDP_SPECIALIZATION_DTOR(QNetworkRequestFactoryPrivate)
19using namespace Qt::StringLiterals;
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
51
52
53
54
55
57QNetworkRequestFactory::QNetworkRequestFactory()
58 : d(
new QNetworkRequestFactoryPrivate)
63
64
65
66
67
68
69
70
71
72
73
75 : d(
new QNetworkRequestFactoryPrivate(baseUrl))
80
81
86
87
92
93
98
99
100
101
102
103
104
105
108
109
110
111
112
113
114
115
118
119
120
123
124
125
126
127
128
129
130
137
138
139
140
143 if (d->baseUrl == url)
152
153
154
155
156
157QSslConfiguration QNetworkRequestFactory::sslConfiguration()
const
163
164
165
166
167void QNetworkRequestFactory::setSslConfiguration(
const QSslConfiguration &configuration)
169 if (d->sslConfig == configuration)
173 d->sslConfig = configuration;
178
179
180
181
182
183
184
188 return d->newRequest(d->requestUrl());
192
193
194
195
196
197
198
201 return d->newRequest(d->requestUrl(&path));
205
206
207
208
209
210
211
214 return d->newRequest(d->requestUrl(
nullptr, &query));
218
219
220
221
222
223
224
225
226
227
230 return d->newRequest(d->requestUrl(&path, &query));
234
235
236
237
238
239
240
241
245 d->headers = headers;
249
250
251
252
259
260
261
262
265 if (d->headers.isEmpty())
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
292 return d->bearerToken;
296
297
298
299
302 if (d->bearerToken == token)
306 d->bearerToken = token;
310
311
312
313
316 if (d->bearerToken.isEmpty())
320 d->bearerToken.clear();
324
325
326
327
334
335
336
337
338
339
340
341
342
345 if (d->userName == userName)
348 d->userName = userName;
352
353
356 if (d->userName.isEmpty())
363
364
365
366
373
374
375
376
377
378
379
380
381
384 if (d->password == password)
387 d->password = password;
391
392
393
394
397 if (d->password.isEmpty())
404
405
406
407
408
411 if (d->transferTimeout == timeout)
415 d->transferTimeout = timeout;
419
420
421
422
423
426 return d->transferTimeout;
430
431
432
433
434
435
436
437
438
439
440
443 return d->queryParameters;
447
448
449
450
451
454 if (d->queryParameters == query)
458 d->queryParameters = query;
462
463
464
465
468 if (d->queryParameters.isEmpty())
472 d->queryParameters.clear();
476
477
478
479
480
481
482
483
484
487 if (d->priority == priority)
490 d->priority = priority;
494
495
496
497
498
499
500
507
508
509
510
511
512
513
514
515
516
518 const QVariant &value)
520 if (attribute == QNetworkRequest::HttpStatusCodeAttribute
521 || attribute == QNetworkRequest::HttpReasonPhraseAttribute
522 || attribute == QNetworkRequest::RedirectionTargetAttribute
523 || attribute == QNetworkRequest::ConnectionEncryptedAttribute
524 || attribute == QNetworkRequest::SourceIsFromCacheAttribute
525 || attribute == QNetworkRequest::HttpPipeliningWasUsedAttribute
526 || attribute == QNetworkRequest::Http2WasUsedAttribute
527 || attribute == QNetworkRequest::OriginalContentLengthAttribute)
529 qCWarning(lcQrequestfactory,
"%i is a reply-only attribute, ignoring.", attribute);
533 d->attributes.insert(attribute, value);
537
538
539
540
541
542
543
544
545
548 return d->attributes.value(attribute);
552
553
554
555
556
557
558
559
561 const QVariant &defaultValue)
const
563 return d->attributes.value(attribute, defaultValue);
567
568
569
570
571
572
575 if (!d->attributes.contains(attribute))
578 d->attributes.remove(attribute);
582
583
584
585
586
587
590 if (d->attributes.isEmpty())
593 d->attributes.clear();
596QNetworkRequestFactoryPrivate::QNetworkRequestFactoryPrivate()
599QNetworkRequestFactoryPrivate::QNetworkRequestFactoryPrivate(
const QUrl &baseUrl)
604QNetworkRequest QNetworkRequestFactoryPrivate::newRequest(
const QUrl &url)
const
606 QNetworkRequest request;
609 if (!sslConfig.isNull())
610 request.setSslConfiguration(sslConfig);
613 constexpr char Bearer[] =
"Bearer ";
614 if (!bearerToken.isEmpty())
615 h.replaceOrAppend(QHttpHeaders::WellKnownHeader::Authorization, Bearer + bearerToken);
616 request.setHeaders(std::move(h));
618 request.setTransferTimeout(transferTimeout);
619 request.setPriority(priority);
621 for (
const auto &[attribute, value] : attributes.asKeyValueRange())
622 request.setAttribute(attribute, value);
627QUrl QNetworkRequestFactoryPrivate::requestUrl(
const QString *path,
628 const QUrlQuery *query)
const
630 const QUrl providedPath = path ? QUrl(*path) : QUrl{};
631 const QUrlQuery providedQuery = query ? *query : QUrlQuery();
633 if (!providedPath.scheme().isEmpty() || !providedPath.host().isEmpty()) {
634 qCWarning(lcQrequestfactory,
"The provided path %ls may only contain path and query item "
635 "components, and other parts will be ignored. Set the baseUrl instead",
636 qUtf16Printable(providedPath.toDisplayString()));
639 QUrl resultUrl = baseUrl;
640 QUrlQuery resultQuery(providedQuery);
641 QString basePath = baseUrl.path(QUrl::ComponentFormattingOption::FullyEncoded);
643 resultUrl.setUserName(userName);
644 resultUrl.setPassword(password);
647 const QString requestPath{providedPath.path(QUrl::ComponentFormattingOption::FullyEncoded)};
648 const QUrlQuery pathQueryItems{providedPath};
650 if (!pathQueryItems.isEmpty()) {
652 const auto items = pathQueryItems.queryItems(QUrl::ComponentFormattingOption::FullyEncoded);
653 for (
const auto &[key, value]: items)
654 resultQuery.addQueryItem(key, value);
657 if (!queryParameters.isEmpty()) {
659 const QList<std::pair<QString,QString>> items =
660 queryParameters.queryItems(QUrl::ComponentFormattingOption::FullyEncoded);
661 for (
const auto &item: items)
662 resultQuery.addQueryItem(item.first, item.second);
665 if (!resultQuery.isEmpty())
666 resultUrl.setQuery(resultQuery);
668 if (requestPath.isEmpty())
674 if (basePath.endsWith(u'/') && requestPath.startsWith(u'/'))
676 else if (!requestPath.startsWith(u'/') && !basePath.endsWith(u'/'))
677 basePath.append(u'/');
679 resultUrl.setPath(basePath.append(requestPath), QUrl::StrictMode);
684#ifndef QT_NO_DEBUG_STREAM
686
687
688
689
690
691
692
695 const QDebugStateSaver saver(debug);
696 debug.resetFormat().nospace();
698 debug <<
"QNetworkRequestFactory(baseUrl = " << factory.baseUrl()
699 <<
", headers = " << factory.commonHeaders()
700 <<
", queryParameters = " << factory.queryParameters().queryItems()
701 <<
", bearerToken = " << (factory.bearerToken().isEmpty() ?
"(empty)" :
"(is set)")
702 <<
", transferTimeout = " << factory.transferTimeout()
703 <<
", userName = " << (factory.userName().isEmpty() ?
"(empty)" :
"(is set)")
704 <<
", password = " << (factory.password().isEmpty() ?
"(empty)" :
"(is set)")
706 <<
", SSL configuration"
707 << (factory.sslConfiguration().isNull() ?
" is not set (default)" :
" is set")
709 <<
", 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.
Q_STATIC_LOGGING_CATEGORY(lcAccessibilityCore, "qt.accessibility.core")