Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

History

246 Commits

Repository files navigation

<<<<<<<<< Temporary merge branch 1

WEBSERV

SERVER

  • Para usar el servidor usa make y ejecuta ./webserv. Por defecto usara el puerto 8080 y cualquier dirección IP.
  • Para desplegar el cliente abre otro terminal y usa 'make client'. Se conectará al servidor.

NAVEGADOR

  • Para conectarte al servidor desde el navegador usa: http//localhost:8080

TEORIA

  • La teoria del funcionamiento del server esta en src/Server.cpp

Temporary merge branch 2

Webserv - Proyecto 42

Este proyecto consiste en implementar un servidor HTTP desde cero en C++, sin el uso de bibliotecas externas como Boost. El objetivo es comprender y construir la arquitectura fundamental de un servidor web como Nginx o Apache, respetando los estándares HTTP/1.1 y los requerimientos del subject.


✅ Requisitos obligatorios

  • 🧾 Soporte para archivos de configuración tipo nginx (.conf)
  • 🌐 Servidor capaz de escuchar en múltiples puertos/IPs
  • 👥 Manejo simultáneo de al menos 3 clientes
  • 📩 Métodos HTTP soportados: GET, POST y DELETE
  • 🗂 Autoindex habilitado si no hay archivo index
  • 🔁 Redirecciones 301 y 302
  • 🧠 Manejo de códigos de estado HTTP correctos (200, 404, 500...)
  • 🧨 Páginas de error personalizadas
  • ⚙️ Soporte de CGI (por ejemplo: ejecutar scripts PHP o Python)
  • 💾 Gestión de uploads via POST (por ejemplo: multipart/form-data)
  • 🧼 Liberación completa de recursos y sin memory leaks (valgrind)

🧱 Arquitectura general

📐 Arquitectura Elegida: Event-Driven + Middleware + Router Modular

📊 Ventajas:

  • 🔁 Escalable (ideal para múltiples conexiones simultáneas)
  • 🧱 Modular (fácil añadir PUT, HEAD, 301, cookies, etc.)
  • 📦 Extensible (compatible con WebSocket y CGI)
  • 🧵 Adaptable a multithread o single-thread eficiente
flowchart TD
A[Web Server (C++)]
A --> B[Parser]
B -->|Carga config| C[Server]
C --> D[Request Handler]
D --> E[Request Parsing]
D --> F[Action Execution]
D --> G[Response Builder]
F --> H[CGI Manager]
Loading

🧠 Explicación paso a paso

A[Web Server (C++)]

Nodo principal: es el servidor web escrito en C++, que contiene todos los componentes del sistema.

A --> B[Parser]

El servidor primero llama al Parser, que se encarga de leer y analizar el archivo de configuración .conf, como en Nginx.

B -->|Carga config| C[Server]

Una vez procesada la configuración, se pasa al módulo Server, que es el encargado de abrir sockets, escuchar en puertos/IPs definidos y aceptar conexiones.

C --> D[Request Handler]

Por cada conexión que llega, el servidor invoca el Request Handler, quien se encarga de procesar cada petición HTTP.

D --> E[Request Parsing]

El handler primero interpreta la solicitud: método (GET, POST...), URI, headers, body, etc.

D --> F[Action Execution]

Luego ejecuta la acción correspondiente: buscar archivo, ejecutar CGI, borrar un recurso, etc.

D --> G[Response Builder]

Después, genera la respuesta HTTP adecuada con su código (200, 404...), headers y cuerpo.

F --> H[CGI Manager]

Si la acción incluye ejecutar un script (por ejemplo PHP), se delega a CGI Manager, que se encarga de correr el script externo y devolver su salida como respuesta.


🔄 Flujo resumido

CONFIGURACIÓN → SERVIDOR → PETICIÓN → PARSEO → ACCIÓN (CGI o no) → RESPUESTA


🗂 Componentes Principales:

epoll()

[ epoll() ]
|
v
[ fd activo ] --> [ Connection Handler ]
|
v
[ Parser HTTP ]
|
v
[ Middleware Stack ]
| |
[Session] [Cookie]
|
v
[ Router ]
/ | \
CGI Static WebSocket
\ | /
[ Response ]
|
[ write() ]

🌲 Árbol del Proyecto

webserv/
│
├── Makefile # Compilación principal
├── README.md # Documentación general del proyecto
├── LICENSE # (opcional) Licencia del proyecto
│
├── config/
│ └── server.conf # Configuración tipo NGINX
│
├── data/ # Recursos dinámicos
│ ├── uploads/ # Archivos subidos por usuarios
│ └── cgi-bin/ # Scripts CGI (PHP, Python, etc.)
│
├── www/ # Archivos estáticos del sitio web
│ └── index.html # Página por defecto
│
├── include/ # Headers del proyecto
│ ├── core/
│ │ ├── Server.hpp
│ │ ├── Poller.hpp
│ │ ├── Connection.hpp
│ │ └── EventLoop.hpp
│ ├── http/
│ │ ├── HttpRequest.hpp
│ │ ├── HttpResponse.hpp
│ │ └── HttpParser.hpp
│ ├── middleware/
│ │ ├── CookieMiddleware.hpp
│ │ ├── SessionMiddleware.hpp
│ │ └── LoggerMiddleware.hpp
│ ├── router/
│ │ ├── Route.hpp
│ │ └── Router.hpp
│ ├── handlers/
│ │ ├── StaticHandler.hpp
│ │ ├── CgiHandler.hpp
│ │ ├── WebSocketHandler.hpp
│ │ └── UploadHandler.hpp
│ ├── utils/
│ │ ├── Logger.hpp
│ │ ├── MimeTypes.hpp
│ │ └── StatusCodes.hpp
│ └── ConfigParser.hpp # Parser del archivo de configuración
│
├── src/
│ ├── main.cpp # Punto de entrada
│ ├── core/
│ │ ├── Server.cpp
│ │ ├── Poller.cpp
│ │ ├── Connection.cpp
│ │ └── EventLoop.cpp
│ ├── http/
│ │ ├── HttpRequest.cpp
│ │ ├── HttpResponse.cpp
│ │ └── HttpParser.cpp
│ ├── middleware/
│ │ ├── CookieMiddleware.cpp
│ │ ├── SessionMiddleware.cpp
│ │ └── LoggerMiddleware.cpp
│ ├── router/
│ │ ├── Route.cpp
│ │ └── Router.cpp
│ ├── handlers/
│ │ ├── StaticHandler.cpp
│ │ ├── CgiHandler.cpp
│ │ ├── WebSocketHandler.cpp
│ │ └── UploadHandler.cpp
│ ├── utils/
│ │ ├── Logger.cpp
│ │ ├── MimeTypes.cpp
│ │ └── StatusCodes.cpp
│ └── ConfigParser.cpp
│
├── tests/
│ ├── test_config/
│ ├── test_http/
│ ├── test_parser/
│ └── test_router/
│
└── docs/
├── architecture.md # Explicación de diseño
├── api.md # Especificaciones internas
├── bonus_checklist.md # Progreso de bonus
└── rfc/ # RFCs de referencia (copias locales opcionales)

🌐 Documentación Oficial Relevante para el Proyecto Webserv 📘

1. Protocolo HTTP

2. Sockets y Redes en UNIX (POSIX)

3. Estándar C++98

4. Documentación CGI

5. NGINX

6. Certificados SSL para desarrollo

7. Referencia HTTP de Mozilla Developer Network (MDN)


🧠 Análisis de Arquitecturas Posibles para Webserv

ArquitecturaDescripción breveVentajasInconvenientes¿Viable para Webserv + bonus?
MonolíticaToda la lógica en un solo binario o móduloFácil de desarrollar al principioDifícil de mantener con múltiples funcionalidades❌ No recomendado
MicroserviciosCada componente es un servicio independienteEscalable, robusto, ideal para grandes sistemasMuy complejo, necesitas red interna, contenedores, etc.❌ Excesivo para Webserv
MVC (Model View Controller)Separación entre lógica (Controlador), datos (Modelo) y presentación (Vista)Facilita añadir rutas, lógica, vistas, respuestas estructuradasNo es nativa para servidores HTTP desde 0⚠️ Interesante para capas internas
Reactor Pattern (💡)Un loop de eventos que distribuye eventos I/O a manejadores (handlers) sin bloqueoIdeal para poll()/select, escalable, usado en NGINX y Node.jsRequiere diseño claro de conexiones y estados✅ Sí. Ideal como núcleo de Webserv
Multithread con Pool de WorkersUn hilo principal acepta conexiones y distribuye a un pool de threadsMuy eficiente para CPU-bound o CGIComplejidad de sincronización✅ Sí, si quieres bonus multithread
Pipeline/MiddlewareLas solicitudes pasan por etapas (parser, router, lógica, respuesta) en cadenaAltamente extensible, ideal para agregar funcionalidades como sesionesNecesita diseño modular, pero factible✅ Altamente recomendado
Event-Driven + Middleware híbridoCombinación del patrón Reactor + Pipeline internoMáxima flexibilidad y escalabilidadRequiere pensar en fases y estado por conexión✅ Arquitectura recomendada

About

Web Server is a project which you create your own HTPP server!.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages