1 /*
2     SPDX-License-Identifier: BSD-2-Clause
3 */
4 
5 #pragma once
6 
7 #include <QByteArray>
8 #include <QNetworkRequest>
9 #include <QObject>
10 
11 #include "o2/o1.h"
12 
13 class QNetworkAccessManager;
14 class QNetworkReply;
15 class O1;
16 
17 /// Makes authenticated requests using OAuth 1.0.
18 class O1Requestor : public QObject
19 {
20     Q_OBJECT
21 
22 public:
23     explicit O1Requestor(QNetworkAccessManager *manager, O1 *authenticator, QObject *parent = nullptr);
24 
25 public Q_SLOTS:
26     /// Make a GET request.
27     /// @param  req                 Network request.
28     /// @param  signingParameters   Extra (non-OAuth) parameters participating in signing.
29     /// @return Reply.
30     QNetworkReply *get(const QNetworkRequest &req, const QList<O0RequestParameter> &signingParameters);
31 
32     /// Make a POST request.
33     /// @param  req                 Network request.
34     /// @param  signingParameters   Extra (non-OAuth) parameters participating in signing.
35     /// @param  data                Request payload.
36     /// @return Reply.
37     QNetworkReply *post(const QNetworkRequest &req, const QList<O0RequestParameter> &signingParameters, const QByteArray &data);
38 
39     /// Make a POST request.
40     /// @param  req                 Network request.
41     /// @param  signingParameters   Extra (non-OAuth) parameters participating in signing.
42     /// @param  multiPart           HTTPMultiPart.
43     /// @return Reply.
44     QNetworkReply *post(const QNetworkRequest &req, const QList<O0RequestParameter> &signingParameters, QHttpMultiPart *multiPart);
45 
46     /// Make a PUT request.
47     /// @param  req                 Network request.
48     /// @param  signingParameters   Extra (non-OAuth) parameters participating in signing.
49     /// @param  data                Request payload.
50     /// @return Reply.
51     QNetworkReply *put(const QNetworkRequest &req, const QList<O0RequestParameter> &signingParameters, const QByteArray &data);
52 
53 protected:
54     /// Return new request based on the original, with the "Authentication:" header added.
55     QNetworkRequest setup(const QNetworkRequest &request, const QList<O0RequestParameter> &signingParameters, QNetworkAccessManager::Operation operation);
56 
57     /// Augment reply with a timer.
58     QNetworkReply *addTimer(QNetworkReply *reply);
59 
60     QNetworkAccessManager *manager_ = nullptr;
61     O1 *authenticator_ = nullptr;
62 };
63 
64