Ce projet est une implémentation complète d’un serveur HTTP/1.1 écrit en C++, réalisée dans le cadre du challenge Codecrafters – Build Your Own HTTP Server.
L’objectif est de comprendre en profondeur le fonctionnement de HTTP au-dessus de TCP, sans utiliser de framework ou bibliothèque HTTP existante.
- 🔌 Serveur TCP basé sur les sockets POSIX
- 🌐 Support de HTTP/1.1
- 🔁 Connexions persistantes (keep-alive)
- ❌ Gestion de
Connection: close - 🧵 Gestion de connexions concurrentes avec
std::thread - 📄 Endpoints implémentés :
/– réponse 200 OK/echo/{text}– renvoie le texte/user-agent– renvoie le User-Agent du client/files/{filename}:GET: lecture de fichierPOST: écriture de fichier
- 📦 Gestion correcte de
Content-Length - 🗜️ Support de la compression gzip
- 🧾 Construction manuelle des réponses HTTP
- 🔒 Fermeture propre des sockets
- C++17
- Sockets POSIX
std::threadzlib(gzip)- Linux / Ubuntu
g++ -std=c++17 main.cpp -o http_server -lz -pthread./http_serverLe serveur écoute par défaut sur le port 4221.
curl http://localhost:4221/echo/hellocurl http://localhost:4221/user-agentcurl http://localhost:4221/files/test.txtcurl --data "Hello" http://localhost:4221/files/test.txtcurl --http1.1 -v http://localhost:4221/echo/banana --next http://localhost:4221/user-agentcurl --http1.1 -v http://localhost:4221/echo/orange --next http://localhost:4221/ -H "Connection: close"- HTTP est un protocole texte
- TCP ne garantit pas la taille des lectures
read()travaille sur des octets- HTTP/1.1 garde les connexions ouvertes par défaut
Content-Lengthest critique- Un serveur peut être écrit sans framework
Projet à but pédagogique, non destiné à la production :
- Pas de
epoll/select - Sécurité fichiers minimale
- Parsing HTTP volontairement simple
✅ Challenge Codecrafters – HTTP Server terminé