/Webserv

This project is about writing your own HTTP server.

Primary LanguageC++

✏️ WebServ


Esse projeto é sobre escrever seu próprio servidor HTTP. Uma versão bem mais simplificada de um NGINX ou Apache.
Nele é possível configurar seu(s) servidor(es) com porta, server_name, rotas e muito mais.

Code language count GitHub top language GitHub last commit

Por Rafaela Bustamante e Raphael dos Santos Esteves, cadetes na 42 São Paulo.


📃 Sobre o projeto

This is when you finally understand why a URL starts with HTTP

Para fazer um servidor web, primeiro precisamos aprender sobre sockets (ou soquetes). Depois sobre I/O Multiplexing com select(), poll() ou epoll(). E, por fim, seguir o protocolo HTTP para transferência de informação entre nosso servidor e o cliente. Esse protocolo nada mais é do que uma padronização para o envio de informações pela web. Os requisitos mínimos para seu funcionamento, é informar o protocolo (HTTP/1.1, é o que vamos usar) e o status da resposta (200 OK, 404 Not Found, etc...). Outras informações que podemos enviar são: o tipo de conteúdo da resposta (se é texto ou imagem), a data, o tamanho da resposta, o corpo da resposta (a página html de um site, por exemplo), entre outras mais. Podemos checar todos os requsitos lendo o próprio Hypertext Transfer Protocol -- HTTP/1.1.

📩 Métodos implementados

GET: ao bater em uma rota do nosso servidor, que são configuradas no arquivo .conf, o cliente usa o método GET para receber de volta o conteúdo da página ou arquivo que está acessando.

POST: ao usar o método POST em uma rota que aceita esse método, o cliente consegue mandar informações para o nosso servidor processar. Pode ser uma imagem/texto pra ser armazenada no servidor, ou um texto para ser mandado para um programa que vai ser executado, entre outros usos diversos.

DELETE: ao usar o método DELETE em uma das rotas que aceita esse método, o cliente consegue informar qual conteúdo quer retirar do servidor, informando o nome do arquivo.

🔨 O que pode ser configurado

  • SERVER NAME: nome do seu servidor, o que vem logo após o "http://SERVER_NAME", pode ser qualquer coisa, desde que conste no arquivo hosts da sua máquina local;
  • PORT: porta que seu servidor vai escutar -> "http://SERVERNAME:PORT". Fique lembrado que portas abaixo de 1024 precisa de permissão sudo para rodar;
  • ERROR PAGES: páginas de erro personalizadas para o servidor, caso não queira usar as páginas default;
  • ROOT: diretório correspondente à rota buscada pelo cliente. Onde será buscado o recurso requisitado;
  • INDEXES: arquivo que vai responder caso a rota aponte para um diretório do servidor. Normalmente combinamos Root+Indexes para responder o cliente;
  • REDIRECT: rota que se o cliente acessar, irá redirecioná-lo para outro endereço;
  • AUTOINDEX: ao habilitar a listagem de diretório o cliente consegue navegar pelas pastas daquela rota como se fossem páginas html;
  • ALLOWED METHODS: métodos permitidos naquela rota. Por padrão são permitidos todos os implementados;
  • UPLOAD DIR: onde serão salvos os arquivos que o cliente quiser armazenar no servidor. Importante lembrar que o diretório deve existir no camihho especificado pelo Root para conseguir salvar o arquivo de fato. Caso não exista o servidor devolverá 404;
  • MAX BODY SIZE: o tamanha máximo do arquivo que pode ser armazenado no servidor. Por padrão é 1MB;
  • CGI: habilita sites diâmicos, em que o conteúdo da página quando o cliente acessar pode mudar de acordo com o programa que estiver rodando por trás dela.

⚙️ Como configurar seu servidor

# Exemplo de arquivo de configuração para servidor HTTP

# Configurações para o primeiro servidor
server {
	port			8080			# Porta do servidor
	server_names		localhost		# Nome do servidor (opcional)
	error_page		404 404.html		# Página de erro personalizada (opcional)

	# Configurações para rotas
	location / {
		root	/var/www/html			# Diretório raiz da rota
		indexes	index.html index2.html		# Páginas de índice padrão da rota
	}

	location /about {
		root	/var/www/html
		indexes	about.html
	}

	# Configuração para rota que redireciona
	location /redirect {
		root				/var/www/html
		redirect			/about		# Redireciona para a rota /about
	}

	# Configuração para rota que aceita uploads de arquivos
	location /upload {
		root			/var/www/html
		indexes			upload.html
		allowed_methods		GET POST		# informa quais métodos são permitidos nessa rota (opcional)
		upload_dir		/var/www/uploads	# Diretório onde os arquivos enviados serão salvos (opcional)
		max_body_size		300000			# Tamanho permitido do arquivo em bytes (opcional)
	}

	# Configuração para rota que executa um CGI
	location /delete {
		root			/var/www/html/delete
		indexes			delete.html
		allowed_methods		GET DELETE		
	}

	# Configuração para rota que executa um CGI
	location /cgi {
		root		/var/www/cgi
		indexes		game.py				# arquivo do programa a ser executado
	}

	location /autoindex {
		root			/var/www/html/autoindex
		autoindex		true			# habilita listagem de diretórios
	}
}

💻 Como usar

Na pasta raiz do projeto rode o Makefile: make
Depois de compilado, suba o servidor com as configurações padrão: ./webserv
Ou com o arquivo de configuração de sua escolha: ./webserv [caminho_para_seu_arquivo.conf]
Em caso de mais dúvidas, use o comando ./webserv --help

Usage: ./webserv [<Configuration File>.conf] 
   or: ./webserv

A HTTP server in C++ 98

    -h, --help    display this help page and exit.

By default, \"./examples/webserv.conf\" will load if no 
configuration file is provided.

More about this project can be found on
https://github.com/rafaelabdm/Webserv/