Este projeto foi criado como parte do currículo da 42 por nmatondo, ajacinto, emalungo.
O Webserver é um servidor HTTP implementado em C++98 conforme o padrão HTTP/1.1. O projeto tem como objetivo desenvolver um servidor web funcional capaz de processar múltiplas requisições simultâneas, servir arquivos estáticos, executar scripts CGI e gerenciar recursos de rede de forma eficiente.
Este projeto faz parte do currículo da 42 e visa aprofundar o conhecimento em programação de sistemas, redes de computadores, sockets, I/O multiplexing e manipulação de protocolos de rede. O servidor implementa funcionalidades essenciais encontradas em servidores web modernos como nginx e Apache, incluindo redirecionamentos, tratamento de erros personalizados e execução de CGI.
- Tratamento de múltiplas conexões simultâneas usando
epoll()para multiplexing de I/O - Suporte aos métodos HTTP: GET, POST e DELETE
- Leitura e interpretação de arquivos de configuração customizados
- Servir arquivos estáticos (HTML, CSS, JavaScript, imagens)
- Execução de scripts CGI (Common Gateway Interface)
- Redirecionamentos HTTP
- Páginas de erro personalizadas
- Upload de arquivos
- Gerenciamento automático de tipos MIME
- Linguagem: C++98
- Funções do sistema: socket, bind, listen, accept, recv, send, fork, execve, dup2, pipe, close, chdir, poll
- Protocolo: HTTP/1.1 (RFC 2616 e RFC 7230-7235)
- Arquitetura: Event-driven com I/O não-bloqueante
- Padrões: Programação orientada a objetos para modularidade
Para compilar o projeto, execute:
makeO executável webserv será gerado no diretório raiz do projeto.
Para limpar os arquivos objeto:
make cleanPara limpar completamente (incluindo o executável):
make fcleanPara recompilar tudo:
make rePara iniciar o servidor, forneça um arquivo de configuração como argumento:
./webserv config/default.confO servidor lerá as configurações do arquivo especificado e iniciará os servidores virtuais definidos.
Você pode testar o servidor de várias formas:
Usando curl:
curl -v http://localhost:8080/Usando um navegador:
http://localhost:8080
Testando upload de arquivos:
curl -X POST -F "file=@arquivo.txt" http://localhost:8080/uploadTestando CGI:
curl http://localhost:8080/cgi-bin/hello.pywebserv/
├── Makefile
├── README.md
├── config/
│ ├── default.conf
│ ├── mudefault.conf
│ └── Youpi.conf
├── include/
│ └── [arquivos .hpp]
├── src/
│ ├── main.cpp
│ ├── cgi/
│ │ └── EnvBuilder.cpp
│ ├── config/
│ │ ├── ConfigHelper.cpp
│ │ ├── ConfigParser.cpp
│ │ └── ConfigValidator.cpp
│ ├── http/
│ │ ├── HttpMethods.cpp
│ │ ├── HttpRequest.cpp
│ │ ├── Response.cpp
│ │ ├── ResponseDirectoryListing.cpp
│ │ ├── ResponseHelpers.cpp
│ │ ├── ResponseMultipart.cpp
│ │ └── StatusCodes.cpp
│ ├── server/
│ │ ├── Client.cpp
│ │ ├── ClientCgi.cpp
│ │ ├── ClientProcessing.cpp
│ │ ├── ClientRequest.cpp
│ │ ├── Server.cpp
│ │ ├── ServerConnections.cpp
│ │ └── ServerEventLoop.cpp
│ └── utils/
│ ├── FileUtils.cpp
│ └── StringUtils.cpp
├── tests/
│ └── commands.yml
├── www/
│ └── [arquivos do site www]
└── YoupiBanane/
└── [arquivos do site YoupiBanane]
- RFC 2616 - Hypertext Transfer Protocol -- HTTP/1.1
- RFC 7230-7235 - HTTP/1.1 Message Syntax and Routing
- Beej's Guide to Network Programming - Guia fundamental sobre sockets e programação de rede
- NGINX Documentation - Documentação do nginx para entender arquitetura de servidores modernos
- Apache HTTP Server Documentation - Referência sobre configuração e funcionamento de servidores HTTP
- Man pages: socket(2), bind(2), listen(2), accept(2), poll(2), send(2), recv(2), fork(2), execve(2)
- CGI 1.1 Specification - Especificação do Common Gateway Interface
- "How to build a simple HTTP server" - Tutoriais sobre implementação de servidores HTTP
- "Understanding HTTP/1.1 Protocol" - Artigos sobre o protocolo HTTP
- "Multiplexing I/O with poll()" - Documentação sobre multiplexing de I/O
- "Como Funciona Sockets, Cliente, Servidor e a Web?" - Tutorial do funcionamento de socket
- Documentação do C++ Reference (cppreference.com) para funções padrão C++98
Durante o desenvolvimento deste projeto, ferramentas de IA foram utilizadas nas seguintes tarefas:
- Esclarecimento de conceitos: Consultas sobre detalhes técnicos do protocolo HTTP/1.1, interpretação de RFCs e funcionamento de system calls UNIX
- Debugging: Identificação de problemas em código específico, análise de comportamentos inesperados e sugestões de correção
- Documentação: Auxiliar na elaboração de comentários e documentação do código
- Refatoração: Sugestões de melhorias na estrutura do código e padrões de design
Partes do projeto desenvolvidas com auxílio de IA:
- Estruturação inicial da arquitetura do servidor
- Tratamento de casos especiais do protocolo HTTP
- Otimização do gerenciamento de recursos e conexões
- Sugestão de melhoria na estrutura do parsing de configuração
Todo código foi revisado, compreendido e adaptado manualmente para garantir conformidade com os requisitos do projeto e padrão C++98.