Skip to content

Ferdinaelectro1/http-server-cpp

Repository files navigation

🧠 HTTP Server in C++ (Codecrafters Challenge)

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.


✨ Fonctionnalités

  • 🔌 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 fichier
      • POST : écriture de fichier
  • 📦 Gestion correcte de Content-Length
  • 🗜️ Support de la compression gzip
  • 🧾 Construction manuelle des réponses HTTP
  • 🔒 Fermeture propre des sockets

🛠️ Technologies utilisées

  • C++17
  • Sockets POSIX
  • std::thread
  • zlib (gzip)
  • Linux / Ubuntu

🚀 Compilation

g++ -std=c++17 main.cpp -o http_server -lz -pthread

▶️ Exécution

./http_server

Le serveur écoute par défaut sur le port 4221.


🧪 Exemples de tests

Echo

curl http://localhost:4221/echo/hello

User-Agent

curl http://localhost:4221/user-agent

Lecture de fichier

curl http://localhost:4221/files/test.txt

Écriture de fichier

curl --data "Hello" http://localhost:4221/files/test.txt

Connexion persistante

curl --http1.1 -v http://localhost:4221/echo/banana      --next http://localhost:4221/user-agent

Fermeture explicite

curl --http1.1 -v http://localhost:4221/echo/orange      --next http://localhost:4221/ -H "Connection: close"

📚 Ce que ce projet m’a appris

  • 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-Length est critique
  • Un serveur peut être écrit sans framework

⚠️ Remarques

Projet à but pédagogique, non destiné à la production :

  • Pas de epoll / select
  • Sécurité fichiers minimale
  • Parsing HTTP volontairement simple

🏁 Statut

Challenge Codecrafters – HTTP Server terminé

About

Ceci est un serveur http pedagogique implémenté en c++

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors