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).
- 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 enutils/). - Sistema de logs y utilidades de red (
utils/LogSystem.cpp,utils/NetUtils.cpp).
- GNU/Linux (probado en Ubuntu).
- Compiler C++ que soporte C++98 (g++).
- Make (se proporciona Makefile).
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 re—fclean+all.
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:portrepetidas server_name/ virtual hosts.rootyindexpara servir contenido estático.locationblocks 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.
Ejecuta el servidor indicando un archivo de configuración:
./webserv <ruta_a_config>
# ejemplo
./webserv config/good_configs/simple.confSi 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.
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.shPara probar los test unitarios compilar con make test:
make test MAIN=<ruta_test_unitario>
./<test_unitario>
# ejemplo
make test MAIN=tests/TokenizerTest.cpp
./TokenizerTest_testEste proyecto está bajo la licencia MIT.