Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
73 changes: 73 additions & 0 deletions src/http/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
# 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()`.
> 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 = "<html><body><h1>Bad Request</h1></body></html>";
> 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);
> }
> ```

---

## 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) |
Loading