Skip to content

Repository files navigation

42-Webserv 🌐🔥📄

42-Webserv es un servidor HTTP desarrollado como ejercicio avanzado de redes y sistemas en C++98.

El objetivo principal es implementar un servidor web robusto y sencillo que maneje conexiones simultáneas, parseo de configuraciones, respuestas estáticas y ejecución de scripts CGI, además de, como bonus, proporcionar mecanismos de logging, gestión de sesiones y soportar distintos tipos de CGI.

Está pensado como una implementación educativa que reproduce comportamientos típicos de servidores reales (balance de funcionalidades vs simplicidad).

Características principales ✨

  • Soporte de múltiples servidores virtuales a través de archivos de configuración.
  • Parsing de archivos de configuración personalizables (config/), con ejemplos de configs válidas y roturas para pruebas.
  • Manejo de sockets y múltiples clientes usando un PollManager (múltiples conexiones simultáneas).
  • Manejo de métodos HTTP básicos: GET, POST, DELETE (con control de estados y códigos HTTP).
  • Respuestas estáticas (servir ficheros desde www/).
  • Soporte básico de CGI (ejecución de programas externos para generar respuestas dinámicas).
  • Redirecciones y manejo de errores con páginas personalizables.
  • Sistema de sesiones y cookies (clases bajo session/ y utilidades en utils/).
  • Sistema de logs y utilidades de red (utils/LogSystem.cpp, utils/NetUtils.cpp).

Requisitos 📋

  • GNU/Linux (probado en Ubuntu).
  • Compiler C++ que soporte C++98 (g++).
  • Make (se proporciona Makefile).

Compilar 🛠️

Comandos útiles del Makefile:

  • make all — compila el proyecto y genera el ejecutable (webserv).
  • make clean — elimina objetos intermedios.
  • make fclean — limpia objetos y binarios.
  • make refclean + all.

Configuración ⚙️

Los archivos de configuración están en config/ y hay ejemplos de configuraciones válidas (good_configs/) y malformadas (wrong_configs/) para pruebas.

Principales opciones soportadas (resumen):

  • Puertos y IP por servidor. No se admiten combinaciones host:port repetidas
  • server_name / virtual hosts.
  • root y index para servir contenido estático.
  • location blocks con directivas (métodos permitidos, autoindex, redirecciones, cgi, client_max_body_size, etc.).

Revisa config/default.conf y config/good_configs/full.conf para ver ejemplos detallados.

Uso ▶️

Ejecuta el servidor indicando un archivo de configuración:

./webserv <ruta_a_config>

# ejemplo
./webserv config/good_configs/simple.conf

Si no mandamos al programa como argumento un archivo de configuración este no se ejecutará y mostrará un mensaje de error detallado.

Una vez iniciado, el servidor atenderá las peticiones definidas en los server blocks del fichero de configuración.

Tests y validación 🧪

Se incluyen algunos scripts y tests en el directorio tests/:

  • HTTP_test.sh — script con pruebas básicas de peticiones HTTP.
  • stress_test.sh — script para pruebas de carga.
  • Tests unitarios (CookiesTest.cpp, SessionTest.cpp o SocketTest.cpp) que requieren compilación previa.

Para ejecutar los scripts de test (tras compilar):

./tests/HTTP_test.sh

./tests/stress_test.sh

Para probar los test unitarios compilar con make test:

make test MAIN=<ruta_test_unitario>
./<test_unitario>

# ejemplo
make test MAIN=tests/TokenizerTest.cpp
./TokenizerTest_test

⚠️ Atención estos tests están creados con el proposito de comprobar las características de este proyecto, si lo ejecutas en uno propio puede que fallen.

Autores 🤝💡📬

Licencia 📜✅🗝️

Este proyecto está bajo la licencia MIT.

About

An HTTP server in C++ 98

Resources

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages