mirror of https://github.com/qt/qthttpserver.git
79 lines
2.2 KiB
C++
79 lines
2.2 KiB
C++
// Copyright (C) 2022 The Qt Company Ltd.
|
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
|
|
#ifndef UTILS_H
|
|
#define UTILS_H
|
|
|
|
#include <QtCore/QFile>
|
|
#include <QtCore/QJsonArray>
|
|
#include <QtCore/QJsonObject>
|
|
#include <QtCore/QList>
|
|
#include <QtCore/QPair>
|
|
#include <QtHttpServer/QtHttpServer>
|
|
|
|
#include <optional>
|
|
|
|
static std::optional<QByteArray> readFileToByteArray(const QString &path)
|
|
{
|
|
QFile file(path);
|
|
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
|
|
return std::nullopt;
|
|
|
|
return file.readAll();
|
|
}
|
|
|
|
static std::optional<QJsonArray> byteArrayToJsonArray(const QByteArray &arr)
|
|
{
|
|
QJsonParseError err;
|
|
const auto json = QJsonDocument::fromJson(arr, &err);
|
|
if (err.error || !json.isArray())
|
|
return std::nullopt;
|
|
return json.array();
|
|
}
|
|
|
|
static std::optional<QJsonObject> byteArrayToJsonObject(const QByteArray &arr)
|
|
{
|
|
QJsonParseError err;
|
|
const auto json = QJsonDocument::fromJson(arr, &err);
|
|
if (err.error || !json.isObject())
|
|
return std::nullopt;
|
|
return json.object();
|
|
}
|
|
|
|
template<typename T>
|
|
static IdMap<T> tryLoadFromFile(const FromJsonFactory<T> &itemFactory, const QString &path)
|
|
{
|
|
const auto maybeBytes = readFileToByteArray(path);
|
|
if (maybeBytes) {
|
|
const auto maybeArray = byteArrayToJsonArray(*maybeBytes);
|
|
if (maybeArray) {
|
|
return IdMap<T>(itemFactory, *maybeArray);
|
|
} else {
|
|
qDebug() << "Content of " << path << " is not json array.";
|
|
}
|
|
} else {
|
|
qDebug() << "Reading file " << path << " failed.";
|
|
}
|
|
return IdMap<T>();
|
|
}
|
|
|
|
static QByteArray getValueFromHeader(const QList<QPair<QByteArray, QByteArray>> &headers,
|
|
QByteArrayView headerName)
|
|
{
|
|
for (const auto &[key, value] : headers) {
|
|
if (key.compare(headerName, Qt::CaseInsensitive) == 0)
|
|
return value;
|
|
}
|
|
return QByteArray();
|
|
}
|
|
|
|
static std::optional<QString> getTokenFromRequest(const QHttpServerRequest &request)
|
|
{
|
|
std::optional<QString> token;
|
|
if (auto bytes = getValueFromHeader(request.headers(), "token"); !bytes.isEmpty()) {
|
|
token = bytes;
|
|
}
|
|
return token;
|
|
}
|
|
|
|
#endif // UTILS_H
|