- Qt 6.7
- Qt HTTP Server
- Qt HTTP Server Examples
- RESTful Color Palette Server
- Qt 6.7.0 Reference Documentation

# RESTful Color Palette 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,
                                          const QString &keyToFind)
     {
         for (const auto &[key, value] : headers) {
             if (key == keyToFind) {
                 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