summaryrefslogtreecommitdiffstats
path: root/examples/demos/colorpaletteclient/restaccessmanager.cpp
blob: 39418f7a19919eb19f8246d6477f410b798fd6e0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
// Copyright (C) 2023 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause

#include "restaccessmanager.h"

using namespace Qt::StringLiterals;

static constexpr auto contentTypeJson = "application/json"_L1;
// A custom authorization scheme implemented by the Qt example server
static const auto authorizationToken = "TOKEN"_ba;

static bool httpResponseSuccess(QNetworkReply* reply)
{
    const int httpStatusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
    const bool isReplyError = (reply->error() != QNetworkReply::NoError);

    qDebug() << "Request to path" << reply->request().url().path() << "finished";
    if (isReplyError)
        qDebug() << "Error" << reply->error();
    else
        qDebug() << "HTTP:" <<  httpStatusCode;

    return (!isReplyError && (httpStatusCode >= 200 && httpStatusCode < 300));
}

RestAccessManager::RestAccessManager(QObject *parent)
    : QNetworkAccessManager{parent}
{
}

void RestAccessManager::setUrl(const QUrl& url)
{
    m_url = url;
}

bool RestAccessManager::sslSupported() const
{
#if QT_CONFIG(ssl)
    return QSslSocket::supportsSsl();
#else
    return false;
#endif
}

void RestAccessManager::setAuthorizationToken(const QByteArray& token)
{
    m_authorizationToken = token;
}

void RestAccessManager::post(const QString& api, const QVariantMap& value,
                             ResponseCallback callback)
{
    m_url.setPath(api);
    auto request = QNetworkRequest(m_url);
    request.setHeader(QNetworkRequest::KnownHeaders::ContentTypeHeader, contentTypeJson);
    request.setRawHeader(authorizationToken, m_authorizationToken);
    QNetworkReply* reply = QNetworkAccessManager::post(request,
                               QJsonDocument::fromVariant(value).toJson(QJsonDocument::Compact));
    QObject::connect(reply, &QNetworkReply::finished, reply, [reply, callback](){
        callback(reply, httpResponseSuccess(reply));
    });
}

void RestAccessManager::get(const QString& api, const QUrlQuery& parameters,
                            ResponseCallback callback)
{
    m_url.setPath(api);
    m_url.setQuery(parameters);
    auto request = QNetworkRequest(m_url);
    QNetworkReply* reply = QNetworkAccessManager::get(request);
    QObject::connect(reply, &QNetworkReply::finished, reply, [reply, callback](){
        callback(reply, httpResponseSuccess(reply));
    });
}

void RestAccessManager::put(const QString& api, const QVariantMap& value,
                            ResponseCallback callback)
{
    m_url.setPath(api);
    auto request = QNetworkRequest(m_url);
    request.setHeader(QNetworkRequest::KnownHeaders::ContentTypeHeader, contentTypeJson);
    request.setRawHeader(authorizationToken, m_authorizationToken);
    QNetworkReply* reply = QNetworkAccessManager::put(request,
                             QJsonDocument::fromVariant(value).toJson(QJsonDocument::Compact));
    QObject::connect(reply, &QNetworkReply::finished, reply, [reply, callback](){
        callback(reply, httpResponseSuccess(reply));
    });
}

void RestAccessManager::deleteResource(const QString& api, ResponseCallback callback)
{
    m_url.setPath(api);
    auto request = QNetworkRequest(m_url);
    request.setRawHeader(authorizationToken, m_authorizationToken);
    QNetworkReply* reply = QNetworkAccessManager::deleteResource(request);
    QObject::connect(reply, &QNetworkReply::finished, reply, [reply, callback](){
       callback(reply, httpResponseSuccess(reply));
    });
}