Skip to content

Commit 389f365

Browse files
committed
BaseJob: Enable client-side QNetworkRequest adjustments
This may be useful for things like matrix-org/matrix-spec-proposals#3860.
1 parent c016b17 commit 389f365

File tree

2 files changed

+27
-8
lines changed

2 files changed

+27
-8
lines changed

Quotient/jobs/basejob.cpp

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,9 @@ class Q_DECL_HIDDEN BaseJob::Private {
9191
}
9292
}
9393

94-
void sendRequest();
94+
QNetworkRequest prepareRequest();
95+
void sendRequest(const QNetworkRequest& req);
96+
9597
/*! \brief Parse the response byte array into JSON
9698
*
9799
* This calls QJsonDocument::fromJson() on rawResponse, converts
@@ -284,10 +286,10 @@ QUrl BaseJob::makeRequestUrl(QUrl baseUrl, const QByteArray& encodedPath,
284286
return baseUrl;
285287
}
286288

287-
void BaseJob::Private::sendRequest()
289+
QNetworkRequest BaseJob::Private::prepareRequest()
288290
{
289-
QNetworkRequest req { makeRequestUrl(connection->baseUrl(), apiEndpoint,
290-
requestQuery) };
291+
QNetworkRequest req{ makeRequestUrl(connection->baseUrl(), apiEndpoint,
292+
requestQuery) };
291293
if (!requestHeaders.contains("Content-Type"))
292294
req.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"_ls);
293295
if (needsToken)
@@ -305,7 +307,11 @@ void BaseJob::Private::sendRequest()
305307
Q_ASSERT(req.url().isValid());
306308
for (auto it = requestHeaders.cbegin(); it != requestHeaders.cend(); ++it)
307309
req.setRawHeader(it.key(), it.value());
310+
return req;
311+
}
308312

313+
void BaseJob::Private::sendRequest(const QNetworkRequest& req)
314+
{
309315
switch (verb) {
310316
case HttpVerb::Get:
311317
reply = connection->nam()->get(req);
@@ -369,8 +375,9 @@ void BaseJob::sendRequest()
369375
}
370376
Q_ASSERT(d->connection && status().code == Pending);
371377
d->needsToken |= d->connection->needsToken(objectName());
372-
emit aboutToSendRequest();
373-
d->sendRequest();
378+
auto req = d->prepareRequest();
379+
emit aboutToSendRequest(&req);
380+
d->sendRequest(req);
374381
Q_ASSERT(d->reply);
375382
connect(reply(), &QNetworkReply::finished, this, [this] {
376383
gotReply();

Quotient/jobs/basejob.h

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include <QtCore/QObject>
1313
#include <QtCore/QStringBuilder>
1414

15+
class QNetworkRequest;
1516
class QNetworkReply;
1617
class QSslError;
1718

@@ -260,8 +261,19 @@ public Q_SLOTS:
260261
void abandon();
261262

262263
Q_SIGNALS:
263-
/** The job is about to send a network request */
264-
void aboutToSendRequest();
264+
//! \brief The job is about to send a network request
265+
//!
266+
//! This signal is emitted every time a network request is made (which can
267+
//! occur several times due to job retries). You can use it to change
268+
//! the request parameters (such as redirect policy) if necessary. If you
269+
//! need to set additional request headers or query items, do that using
270+
//! setRequestHeaders() and setRequestQuery() instead.
271+
//! \note \p req is not guaranteed to exist (i.e. it may point to garbage)
272+
//! unless this signal is handled via a DirectConnection (or
273+
//! BlockingQueuedConnection if in another thread), i.e.,
274+
//! synchronously.
275+
//! \sa setRequestHeaders, setRequestQuery
276+
void aboutToSendRequest(QNetworkRequest* req);
265277

266278
/** The job has sent a network request */
267279
void sentRequest();

0 commit comments

Comments
 (0)