1#include "IFetcher.h"
2
3#include <QNetworkAccessManager>
4#include <QNetworkReply>
5#include <QNetworkRequest>
6#include <QJsonDocument>
7
8#include <QLogger.h>
9
10#include <QUrlQuery>
11
12using namespace QLogger;
13
14namespace Jenkins
15{
16IFetcher::IFetcher(const Config &config, QObject *parent)
17 : QObject(parent)
18 , mConfig(config)
19{
20}
21
22IFetcher::~IFetcher()
23{
24 QLog_Debug("Jenkins", "Destroying repo fetcher object.");
25}
26
27void IFetcher::get(const QString &urlStr, bool customUrl)
28{
29 const auto apiUrl = urlStr.endsWith("api/json") || customUrl ? urlStr : urlStr + "api/json";
30
31 QUrl url(apiUrl);
32
33 if (!customUrl)
34 {
35 QUrlQuery query;
36 query.addQueryItem("tree", "views[*[*]]");
37 url.setQuery(query);
38 }
39
40 QNetworkRequest request(url);
41
42 if (!mConfig.user.isEmpty() && !mConfig.token.isEmpty())
43 {
44 const auto data = QString("%1:%2").arg(mConfig.user, mConfig.token).toLocal8Bit().toBase64();
45 request.setRawHeader("Authorization", QString(QString::fromUtf8("Basic ") + data).toLocal8Bit());
46 }
47
48 const auto reply = mConfig.accessManager->get(request);
49 connect(reply, &QNetworkReply::finished, this, &IFetcher::processReply);
50}
51
52void IFetcher::processReply()
53{
54 const auto reply = qobject_cast<QNetworkReply *>(sender());
55 const auto data = reply->readAll();
56
57 if (data.isEmpty())
58 QLog_Warning("Jenkins", QString("Reply from {%1} is empty.").arg(reply->url().toString()));
59
60 const auto json = QJsonDocument::fromJson(data);
61
62 if (json.isNull())
63 {
64 QLog_Error("Jenkins", QString("Data from {%1} is not a valid JSON").arg(reply->url().toString()));
65 QLog_Trace("Jenkins", QString("Data received:\n%1").arg(QString::fromUtf8(data)));
66 return;
67 }
68
69 processData(json);
70}
71}
72