From 0456355c8acea2c72da1e671cfc60c5c8711782a Mon Sep 17 00:00:00 2001 From: byronlove111 Date: Tue, 16 Jun 2026 17:18:58 +0200 Subject: [PATCH 1/4] docs(http): add integration guide for core server Co-authored-by: Cursor --- src/http/README.md | 56 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 src/http/README.md diff --git a/src/http/README.md b/src/http/README.md new file mode 100644 index 0000000..fa21f8a --- /dev/null +++ b/src/http/README.md @@ -0,0 +1,56 @@ +# HTTP Layer — Guide d'intégration + +## Utilisation (4 lignes) + +```cpp +#include "http/RequestParser.hpp" +#include "http/Router.hpp" +#include "http/MethodHandler.hpp" +#include "http/ResponseBuilder.hpp" + +RequestParser parser; +HttpRequest req = parser.parse(rawString); // rawString = bytes du socket + +if (req.method.empty()) + // requête invalide → envoyer 400 + +Router router; +LocationConfig loc = router.route(req, serverConfig); + +MethodHandler handler; +HttpResponse res = handler.handle(req, loc, serverConfig); + +ResponseBuilder builder; +std::string raw = builder.build(res); + +send(fd, raw.c_str(), raw.size(), 0); +``` + +> **Important** : accumuler les données du socket jusqu'à trouver `\r\n\r\n` avant d'appeler `parse()`. + +--- + +## Ce que chaque classe fait + +| Classe | Input | Output | +|---|---|---| +| `RequestParser` | string brute du socket | `HttpRequest` (vide si invalide) | +| `Router` | `HttpRequest` + `ServerConfig` | `LocationConfig` qui matche | +| `MethodHandler` | `HttpRequest` + `LocationConfig` + `ServerConfig` | `HttpResponse` | +| `ResponseBuilder` | `HttpResponse` | string HTTP prête pour `send()` | + +--- + +## Codes retournés par MethodHandler + +| Code | Cas | +|---|---| +| 200 | Fichier servi | +| 201 | Upload POST réussi | +| 204 | DELETE réussi | +| 301 | Redirection | +| 400 | Requête invalide (path traversal, body vide...) | +| 403 | Accès interdit | +| 404 | Fichier introuvable | +| 405 | Méthode non autorisée sur cette route | +| 500 | Erreur serveur (ex: upload_store manquant) | From b8fea9c828f8ee51b6bc5f37cec00dcd8850f482 Mon Sep 17 00:00:00 2001 From: byronlove111 Date: Tue, 16 Jun 2026 17:20:24 +0200 Subject: [PATCH 2/4] docs(http): clarify buffer accumulation responsibility for core server Co-authored-by: Cursor --- src/http/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/src/http/README.md b/src/http/README.md index fa21f8a..fea1b35 100644 --- a/src/http/README.md +++ b/src/http/README.md @@ -27,6 +27,7 @@ send(fd, raw.c_str(), raw.size(), 0); ``` > **Important** : accumuler les données du socket jusqu'à trouver `\r\n\r\n` avant d'appeler `parse()`. +> Le calcul de la taille du body (`Content-Length`) et la gestion des bytes incomplets sont à gérer côté core server — le parser suppose que la requête complète est déjà dans le buffer. --- From ef2dfa1f1d176621bd99f00056a69ceb25dc3050 Mon Sep 17 00:00:00 2001 From: byronlove111 Date: Tue, 16 Jun 2026 17:21:18 +0200 Subject: [PATCH 3/4] =?UTF-8?q?docs(http):=20clarify=20error=20handling=20?= =?UTF-8?q?responsibility=20=E2=80=94=20core=20server=20sends=20400=20on?= =?UTF-8?q?=20empty=20parse=20result?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Cursor --- src/http/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/src/http/README.md b/src/http/README.md index fea1b35..aa216cd 100644 --- a/src/http/README.md +++ b/src/http/README.md @@ -28,6 +28,7 @@ send(fd, raw.c_str(), raw.size(), 0); > **Important** : accumuler les données du socket jusqu'à trouver `\r\n\r\n` avant d'appeler `parse()`. > Le calcul de la taille du body (`Content-Length`) et la gestion des bytes incomplets sont à gérer côté core server — le parser suppose que la requête complète est déjà dans le buffer. +> Si `req.method` est vide après `parse()`, c'est au core server de retourner 400 au client — le HTTP layer ne throw pas d'exception. --- From ee57696cfa2d80e0ffe93cf27194012be5e8c23b Mon Sep 17 00:00:00 2001 From: byronlove111 Date: Tue, 16 Jun 2026 17:22:16 +0200 Subject: [PATCH 4/4] docs(http): add 400 error example for core server Co-authored-by: Cursor --- src/http/README.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/http/README.md b/src/http/README.md index aa216cd..08fd270 100644 --- a/src/http/README.md +++ b/src/http/README.md @@ -29,6 +29,21 @@ send(fd, raw.c_str(), raw.size(), 0); > **Important** : accumuler les données du socket jusqu'à trouver `\r\n\r\n` avant d'appeler `parse()`. > Le calcul de la taille du body (`Content-Length`) et la gestion des bytes incomplets sont à gérer côté core server — le parser suppose que la requête complète est déjà dans le buffer. > Si `req.method` est vide après `parse()`, c'est au core server de retourner 400 au client — le HTTP layer ne throw pas d'exception. +> +> ```cpp +> if (req.method.empty()) +> { +> HttpResponse err; +> err.status_code = 400; +> err.status_msg = "Bad Request"; +> err.body = "

Bad Request

"; +> err.headers["Content-Type"] = "text/html"; +> err.headers["Content-Length"] = "46"; +> ResponseBuilder builder; +> std::string raw = builder.build(err); +> send(fd, raw.c_str(), raw.size(), 0); +> } +> ``` ---