From 930a8c300aaec688e14c55fd3bfa05bf96ea95de Mon Sep 17 00:00:00 2001 From: Pierre Date: Fri, 14 Aug 2026 08:09:29 +0200 Subject: [PATCH] Correctifs CORS : std::move + Cache-Control no-store --- main.cpp | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/main.cpp b/main.cpp index 2edbace..d7d4342 100644 --- a/main.cpp +++ b/main.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include #include @@ -34,6 +35,24 @@ static const int ETAT_CIRCUIT_ABSENCE_TERRE = 8; static const int ETAT_CIRCUIT_ABSENCE_MASSE = 9; static const int ETAT_COMMANDE_CARTE_OK = 0; +// ---------------------------------------------------------------------------- +// Ajoute l'en-tête CORS à une réponse - indispensable puisque le client WASM +// (servi par nginx sur un port distinct) et cette API (port 8080) constituent +// deux origines différentes du point de vue du navigateur. Sans cet en-tête, +// les requêtes aboutissent bien côté serveur (visibles dans les logs) mais +// leur réponse est bloquée silencieusement côté client. +// TODO : restreindre à l'origine réelle du client en production plutôt que +// '*', une fois l'authentification (cf "Architecture cible") en place. +// ---------------------------------------------------------------------------- +static QHttpServerResponse withCors(QHttpServerResponse &&resp) +{ + QHttpHeaders headers = resp.headers(); + headers.append(QHttpHeaders::WellKnownHeader::AccessControlAllowOrigin, "*"); + headers.append(QHttpHeaders::WellKnownHeader::CacheControl, "no-store"); + resp.setHeaders(std::move(headers)); + return std::move(resp); +} + int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); @@ -57,7 +76,7 @@ int main(int argc, char *argv[]) server.route("/ping", []() { QJsonObject obj; obj["status"] = "ok"; - return QHttpServerResponse(QJsonDocument(obj).toJson()); + return withCors(QHttpServerResponse(QJsonDocument(obj).toJson())); }); // ------------------------------------------------------------------ @@ -73,7 +92,7 @@ int main(int argc, char *argv[]) QJsonObject err; err["status"] = "erreur"; err["message"] = "type non supporté (seul 'circuit' est implémenté à ce stade)"; - return QHttpServerResponse(QJsonDocument(err).toJson(), QHttpServerResponder::StatusCode::NotImplemented); + return withCors(QHttpServerResponse(QJsonDocument(err).toJson(), QHttpServerResponder::StatusCode::NotImplemented)); } QJsonArray familles; @@ -126,7 +145,7 @@ int main(int argc, char *argv[]) QJsonObject reponse; reponse["status"] = "ok"; reponse["familles"] = familles; - return QHttpServerResponse(QJsonDocument(reponse).toJson()); + return withCors(QHttpServerResponse(QJsonDocument(reponse).toJson())); }); // ------------------------------------------------------------------ @@ -145,7 +164,7 @@ int main(int argc, char *argv[]) QJsonObject err; err["status"] = "erreur"; err["message"] = "type non supporté (seul 'circuit' est implémenté à ce stade)"; - return QHttpServerResponse(QJsonDocument(err).toJson(), QHttpServerResponder::StatusCode::NotImplemented); + return withCors(QHttpServerResponse(QJsonDocument(err).toJson(), QHttpServerResponder::StatusCode::NotImplemented)); } bool ok = false; @@ -154,7 +173,7 @@ int main(int argc, char *argv[]) QJsonObject err; err["status"] = "erreur"; err["message"] = "paramètre 'famille' manquant ou invalide"; - return QHttpServerResponse(QJsonDocument(err).toJson(), QHttpServerResponder::StatusCode::BadRequest); + return withCors(QHttpServerResponse(QJsonDocument(err).toJson(), QHttpServerResponder::StatusCode::BadRequest)); } QJsonArray elements; @@ -200,7 +219,7 @@ int main(int argc, char *argv[]) QJsonObject reponse; reponse["status"] = "ok"; reponse["elements"] = elements; - return QHttpServerResponse(QJsonDocument(reponse).toJson()); + return withCors(QHttpServerResponse(QJsonDocument(reponse).toJson())); }); auto tcpServer = new QTcpServer();