RESTful API Server

 // 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