Este projeto foi concluído como parte de um currículo de 42 núcleo. foi feito com alouane04
O objetivo do projeto é criar um servidor Web HTTP compatível com C ++ 98 a partir do zero. O servidor da Web pode lidar com HTTP GET, CHEAD, POST, PUT e excluir solicitações e pode servir arquivos estáticos de um diretório raiz especificado ou conteúdo dinâmico usando CGI. Também é capaz de lidar com várias conexões do cliente simultaneamente com a ajuda de select ().
Uso
Introdução
Partes de um servidor da web
make
./webserv [Config File] # # leave empty to use the default configuration.HTTP (Hypertext Transfer Protocol) é um protocolo para enviar e receber informações pela Internet. É a base da World Wide Web e é usada por navegadores da Web e servidores da Web para se comunicar.
Um servidor da Web HTTP é um aplicativo de software que escuta e responde a solicitações HTTP de clientes (como navegadores da Web). O principal objetivo de um servidor da Web é hospedar conteúdo da Web e disponibilizá -lo para os usuários pela Internet.
O HTTP consiste em solicitações e respostas. Quando um cliente (como um navegador da Web) deseja recuperar uma página da Web de um servidor, ele envia uma solicitação HTTP para o servidor. O servidor processa a solicitação e envia de volta uma resposta HTTP.
Formato da mensagem HTTP
start-line CRLF
Headers CRLF
CRLF(end of headers)
[message-body]
CRLF are Carriage Return and Line Feed (rn), which is just a new line.
A mensagem HTTP pode ser uma solicitação ou resposta.
Solicitação http
Uma solicitação HTTP consiste em uma linha de solicitação, cabeçalhos e um corpo de mensagem opcional. Aqui está um exemplo de uma solicitação HTTP:
GET /index.html HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
A linha de solicitação consiste em três partes: o método, o caminho e a versão HTTP. O método especifica a ação que o cliente deseja executar, como get (para recuperar um recurso) ou postar (para enviar dados ao servidor). O caminho ou URI especifica a localização do recurso no servidor. A versão HTTP indica a versão do protocolo HTTP que está sendo usado.
Os cabeçalhos contêm informações adicionais sobre a solicitação, como o nome do host do servidor, e o tipo de navegador que está sendo usado.
No exemplo acima, não havia corpo de mensagem porque o método GET geralmente não inclui nenhum corpo.
Resposta HTTP
Uma resposta HTTP também consiste em uma linha de status, cabeçalhos e um corpo de mensagem opcional. Aqui está um exemplo de resposta HTTP:
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1234
<Message Body>
A linha de status consiste em três partes: a versão HTTP, o código de status e o motivo da frase. O código de status indica o resultado da solicitação, como 200 OK (bem -sucedida) ou 404 não encontrada (recurso não encontrado). A frase da razão é uma descrição curta do código de status. A seguir, é um resumo muito breve do que um código de status indica:
1xx indica apenas uma mensagem informativa
2xx indica o sucesso de algum tipo
3xx redireciona o cliente para outro URL
4xx indica um erro da parte do cliente
5xx indica um erro na parte do servidor
Os cabeçalhos contêm informações adicionais sobre a resposta, como o tipo e o tamanho do conteúdo que está sendo retornado. O corpo da mensagem contém o conteúdo real da resposta, como o código HTML para uma página da Web.
Métodos HTTP
| Método | Descrição | Possível corpo |
|---|---|---|
GET | Recuperar um recurso específico ou uma coleção de recursos, não deve afetar os dados/recursos | Não |
POST | Execute o processamento específico de recursos no conteúdo da solicitação | Sim |
DELETE | Remove o recurso de destino dado por um URI | Sim |
PUT | Cria um novo recurso com dados do corpo da mensagem, se já existir recursos, atualize -os com dados no corpo | Sim |
HEAD | O mesmo que obtenha, mas não transfira o conteúdo da resposta | Não |
PEGAR
O método http get é usado para ler (ou recuperar) uma representação de um recurso. Em caso de sucesso (ou não erro), obtenha retornos de uma representação do recurso no corpo de resposta e no código de status da resposta HTTP de 200 (OK). Em um caso de erro, geralmente retorna um 404 (não encontrado) ou 400 (solicitação ruim).
PUBLICAR
O método de post http é mais frequentemente utilizado para criar novos recursos. Na criação bem -sucedida, o código de resposta HTTP 201 (criado) é retornado.
EXCLUIR
HTTP Excluir é o Stright Forward. Ele exclui um recurso especificado no URI. Na exclusão bem -sucedida, ele retorna o código de status de resposta HTTP 204 (sem conteúdo).
Leia mais sobre os métodos HTTP RFC9110#9.1
Um servidor Web básico HTTP consiste em vários componentes que trabalham juntos para receber e processar solicitações HTTP dos clientes e enviar respostas de volta. Abaixo estão as principais partes do nosso servidor da web.
A parte da rede de um servidor da Web que lida com conexões TCP e executa tarefas como ouvir solicitações recebidas e enviar respostas de volta. É responsável pelas tarefas de rede de baixo nível do servidor da Web, como criar e gerenciar soquetes, lidar com fluxos de entrada e saída e gerenciar o fluxo de dados entre o servidor e os clientes.
Antes de escrever seu servidor da web, eu recomendaria ler este guia incrível sobre a criação do cliente/servidor TCP simples em C, pois isso o ajudará a entender como o TCP funciona no C/C ++. Além disso, você precisaria entender a multiplix de E/S, este vídeo ajudará você a entender a idéia principal de selecionar ().
O processo de multiplexação de E/S em nosso servidor da Web está resumido no fluxograma abaixo. (CGI não está incluído no fluxograma, mas pode ser adicionado no futuro)
A parte de análise de um servidor da Web refere -se ao processo responsável por interpretar e extrair informações das solicitações HTTP. Neste servidor da Web, a análise de solicitações é executada pela classe HTTPrequest. Um objeto HttPrequest recebe uma solicitação recebida, o analisa e extrai as informações relevantes, como método, caminho, cabeçalhos e corpo de mensagens (se presente). Se algum erro de sintaxe foi encontrado na solicitação durante a análise, os sinalizadores de erro serão definidos e a análise parada. A solicitação pode ser alimentada ao objeto através do método feed () total ou parcialmente, isso é possível porque o analisador verifica o byte de solicitação por vez e atualiza o estado de análise sempre que necessário. A mesma maneira de analisar é usada pelos analisadores de solicitação NGINX e NODEJS.
Abaixo está uma visão geral de como o analisador funciona.
O construtor de respostas é responsável por construir e formatar as respostas HTTP que são enviadas de volta aos clientes em resposta às suas solicitações. Neste servidor da Web, a classe de resposta é responsável por criar e armazenar a resposta HTTP, incluindo a linha de status, cabeçalhos e corpo de mensagens. O construtor de respostas também pode executar tarefas, como definir o código de status apropriado e a frase da razão com base no resultado da solicitação, adicionando cabeçalhos à resposta para fornecer informações adicionais sobre o conteúdo ou o servidor e formatar o corpo da mensagem de acordo com o tipo de conteúdo e a codificação da resposta. Por exemplo, se o servidor receber uma solicitação de uma página da Web de um cliente, o servidor analisará a solicitação e a passará para um objeto de resposta que buscará o conteúdo da página da Web e construirá a resposta HTTP com o conteúdo HTML no corpo de mensagens e os cabeçalhos apropriados, como o tipo conteúdo e os cabeçalhos de conteúdo.
O arquivo de configuração é um arquivo de texto que contém várias configurações e diretrizes que ditam como o servidor da Web deve operar. Essas configurações podem incluir coisas como o número da porta que o servidor da Web deve ouvir, a localização do diretório raiz do servidor da Web e muitas outras configurações.
Aqui está um exemplo do FIE que mostra o formato de arquivo de configuração e as diretivas suportadas.
server {
listen 8001 ; # listening port, mandatory parameter
host 127.0.0.1; # host or 127.0.0.1 by default
server_name test; # specify server_name, need to be added into /etc/hosts to work
error_page 404 /error/404.html; # default error page
client_max_body_size 1024 ; # max request body size in bytes
root docs/fusion_web/; # root folder of site directory, full or relative path, mandatory parameter
index index.html; # default page when requesting a directory, index.html by default
location /tours {
root docs/fusion_web; # root folder of the location, if not specified, taken from the server.
# EX: - URI /tours --> docs/fusion_web/tours
# - URI /tours/page.html --> docs/fusion_web/tours/page.html
autoindex on ; # turn on/off directory listing
allow_methods POST GET; # allowed methods in location, GET only by default
index index.html; # default page when requesting a directory, copies root index by default
return abc/index1.html; # redirection
alias docs/fusion_web; # replaces location part of URI.
# EX: - URI /tours --> docs/fusion_web
# - URI /tours/page.html --> docs/fusion_web/page.html
}
location cgi-bin {
root ./; # cgi-bin location, mandatory parameter
cgi_path /usr/bin/python3 /bin/bash; # location of interpreters installed on the current system, mandatory parameter
cgi_ext .py .sh; # extensions for executable files, mandatory parameter
}
}O CGI é um padrão para executar programas externos de um servidor da Web. Quando um usuário solicita uma página da Web que deve ser tratada por um programa CGI, o servidor da Web executa o programa e retorna a saída para o navegador da Web do usuário.
Os programas CGI são simplesmente scripts que podem ser gravados em qualquer linguagem de programação, como Perl, Python ou Bash, e geralmente são usados para processar dados enviados por um usuário através de um navegador da Web ou para gerar conteúdo dinâmico em uma página da Web.