École 42 · 100/100
Webserv
Un serveur HTTP écrit intégralement en C++, dans l'esprit de nginx : analyse de configuration, boucle d'événements non bloquante et exécution CGI.
Le contexte
Webserv est l'un des projets les plus exigeants du cursus 42 : reconstruire, en C++98 et sans bibliothèque HTTP externe, un serveur capable de servir des fichiers statiques, d'exécuter du CGI et de gérer plusieurs clients simultanément, à partir des seuls appels système (socket, poll, fork, execve).
Architecture
Le serveur repose sur une boucle d'événements unique construite autour de poll(), qui multiplexe en même temps les sockets d'écoute, les connexions clientes et les pipes CGI. Chaque socket est passé en non bloquant, ce qui permet à un seul thread de traiter un grand nombre de connexions sans jamais rester bloqué sur l'une d'elles.
Les requêtes HTTP sont analysées de façon incrémentale : la ligne de requête, les en-têtes puis le corps (avec gestion du Content-Length) sont traités au fur et à mesure des données reçues, sans supposer qu'une requête arrive en une seule lecture.
L'exécution CGI
L'exécution de scripts CGI est entièrement non bloquante : pipe(), fork(), dup2() puis execve() lancent le script, dont l'avancement est suivi par une machine à états dédiée (écriture de l'entrée, lecture de la sortie, fin, dépassement de délai). Un script qui dépasse son délai est interrompu proprement, et les en-têtes qu'il renvoie sont réinjectés dans la réponse HTTP finale.
Configuration
Le format de configuration reprend la syntaxe de nginx (blocs server et location), analysé par un pipeline classique lexer puis parseur produisant un arbre syntaxique. Plusieurs blocs server, ports et noms d'hôtes peuvent cohabiter dans un seul fichier de configuration.