unkn0wn107 / webserv

Simple and fast c++ http/1.1 server === 42 Lyon
GNU General Public License v3.0
0 stars 0 forks source link

Architecture logicielle #4

Open unkn0wn107 opened 6 months ago

unkn0wn107 commented 6 months ago

Image

Classes Principales

1. Server

2. ConnectionHandler

3. HTTPProtocol (classe abstraite)

4. HTTP1_1

5. HTTP2

6. ConfigLoader

7. FileManager

8. Logger

Classes pour les Fonctionnalités Bonus

9. SessionManager

10. CookieManager

11. CGIHandler

Interactions et Relations

ZEDIUM-Off commented 6 months ago

petit aperçu d'une archi possible. Vous en pensez quoi ?

unkn0wn107 commented 6 months ago

Super premier jet !

Classe Config aussi, résultat du ConfigLoader.

Je mettrais aussi un Router et des Route, utilisées par ConnectionHandler, qui dispatche à FileManager (que je mettrais pas au serveur mais à ConnectionHandler) ou à CGIHandler selon la Route et la Config (ConnectionHandler l'utiliserait aussi).

Le logger serait utilisé par quasiment toutes les classes pour centraliser le logging, pas que server.

Pour encore plus découper les responsabilités de HTTPProtocol, je vois bien aussi ces classes dans le game : Request : méthodes pour la parser et accéder aux en-têtes, au corps, etc. Response : méthodes pour définir les en-têtes, le corps, etc.

Utilisations / Relations :

J'ajouterais aussi un CacheHandler (Cache tout simplement) pour gérer le cache des Response en fonction des Request. Ils parlent pas de Cache dans le sujet mais c'est ce qui fait qu'un serveur web peut rep à pleins de requêtes concurrentes. Ca me parait pas bien complexe : un map de key/value intérrogé à chaque Request qui retourne une Response si la requête exacte a déjà été faite. A voir si on veut implémenter ça ?

J'y mettrais aussi une classe abstraite Middleware pour pouvoir charger des middlewares et ajouter des traitements intermédiaires facilement. Question à se poser si on a des traitements à faire du genre en mandatory ou bonus ?

J'ajouterais bien un ThreadPool pour gérer le multi-threading aussi :

class ThreadPool {
public:
    ThreadPool(size_t poolSize);
    enqueue(Task &task);

private:
    void routine();
    Task[ ] tasks;
    pid_t[ ] workers;
    size_t poolSize;
};

L'intérêt est certains, à voir la complexité que ça amènerait et si on fait ce choix ou pas ?

unkn0wn107 commented 6 months ago

Je vous propose d'utiliser la notation Mermaid pour le diagramme de classe. Facile à apprendre et écrire, couramment utilisé et nativement intégré à Github.

Draft v2

Y'a un live editor ici