Ce projet a été achevé dans le cadre d'un programme d'études 42 de base. Cela a été fait avec Alouane04
L'objectif du projet est de créer un serveur Web HTTP compatible C ++ 98 à partir de zéro. Le serveur Web peut gérer les demandes HTTP Get, Head, Publiage, posez et supprimez, et peut servir des fichiers statiques à partir d'un répertoire racine spécifié ou d'un contenu dynamique à l'aide de CGI. Il est également en mesure de gérer plusieurs connexions client en même temps que l'aide de Select ().
Usage
Introduction
Parties d'un serveur Web
make
./webserv [Config File] # # leave empty to use the default configuration.HTTP (Hypertext Transfer Protocol) est un protocole pour envoyer et recevoir des informations sur Internet. C'est le fondement du World Wide Web et est utilisé par les navigateurs Web et les serveurs Web pour communiquer entre eux.
Un serveur Web HTTP est une application logicielle qui écoute et répond aux demandes HTTP des clients (tels que les navigateurs Web). L'objectif principal d'un serveur Web est d'héberger du contenu Web et de le mettre à la disposition des utilisateurs sur Internet.
HTTP se compose de demandes et de réponses. Lorsqu'un client (comme un navigateur Web) souhaite récupérer une page Web à partir d'un serveur, il envoie une demande HTTP au serveur. Le serveur traite ensuite la demande et renvoie une réponse HTTP.
Format de message 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.
Le message HTTP peut être une demande ou une réponse.
Demande HTTP
Une demande HTTP se compose d'une ligne de demande, d'en-têtes et d'un corps de message facultatif. Voici un exemple de demande HTTP:
GET /index.html HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
La ligne de demande se compose de trois parties: la méthode, le chemin et la version HTTP. La méthode spécifie l'action que le client souhaite effectuer, telles que GET (pour récupérer une ressource) ou publier (pour soumettre des données au serveur). Le chemin d'accès ou URI spécifie l'emplacement de la ressource sur le serveur. La version HTTP indique la version du protocole HTTP utilisé.
Les en-têtes contiennent des informations supplémentaires sur la demande, telles que le nom d'hôte du serveur et le type de navigateur utilisé.
Dans l'exemple ci-dessus, il n'y avait pas de corps de message car la méthode Get n'inclut généralement aucun corps.
Réponse HTTP
Une réponse HTTP se compose également d'une ligne de statut, d'une en-têtes et d'un corps de message facultatif. Voici un exemple de réponse HTTP:
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1234
<Message Body>
La ligne d'état se compose de trois parties: la version HTTP, le code d'état et la phrase de raison. Le code d'état indique le résultat de la demande, telle que 200 OK (réussi) ou 404 introuvable (ressource introuvable). La phrase de raison est une brève description du code d'état. Voici un très bref résumé de ce qu'un code d'état désigne:
1xx indique un message d'information uniquement
2xx indique le succès d'une sorte
3xx redirige le client vers une autre URL
4xx indique une erreur de la partie du client
5xx indique une erreur de la partie du serveur
Les en-têtes contiennent des informations supplémentaires sur la réponse, telles que le type et la taille du contenu renvoyé. Le corps du message contient le contenu réel de la réponse, tel que le code HTML pour une page Web.
Méthodes HTTP
| Méthode | Description | Corps possible |
|---|---|---|
GET | Récupérer une ressource spécifique ou une collection de ressources, ne doit pas affecter les données / ressources | Non |
POST | Effectuer un traitement spécifique aux ressources sur le contenu de la demande | Oui |
DELETE | Supprime la ressource cible donnée par un URI | Oui |
PUT | Crée une nouvelle ressource avec des données de Message Body, si des ressources existent déjà, mettez-les à jour avec des données dans le corps | Oui |
HEAD | Identique à Get, mais ne transférez pas le contenu de réponse | Non |
OBTENIR
La méthode HTTP Get est utilisée pour lire (ou récupérer) une représentation d'une ressource. En cas de réussite (ou non error), obtenez une représentation de la ressource dans le corps de réponse et le code d'état de réponse HTTP de 200 (OK). Dans un cas d'erreur, il renvoie le plus souvent un 404 (non trouvé) ou 400 (mauvaise demande).
POSTE
La méthode HTTP Post est le plus souvent utilisée pour créer de nouvelles ressources. Sur la création réussie, le code de réponse HTTP 201 (créé) est renvoyé.
SUPPRIMER
Http Delete est en avant. Il supprime une ressource spécifiée dans URI. Lors de la suppression réussie, il renvoie le code d'état de réponse HTTP 204 (pas de contenu).
En savoir plus sur les méthodes HTTP RFC9110 # 9.1
Un serveur Web HTTP de base se compose de plusieurs composants qui travaillent ensemble pour recevoir et traiter les demandes HTTP des clients et renvoyer des réponses. Vous trouverez ci-dessous les principales parties de notre serveur Web.
La partie de réseautage d'un serveur Web qui gère les connexions TCP et effectue des tâches telles que l'écoute des demandes entrantes et les réponses de renvoi. Il est responsable des tâches de mise en réseau de bas niveau du serveur Web, telles que la création et la gestion des sockets, la gestion des flux d'entrée et de sortie et la gestion du flux de données entre le serveur et les clients.
Avant d'écrire votre serveur Web, je vous recommande de lire ce guide impressionnant sur la création d'un client / serveur TCP simple en C car cela vous aidera à comprendre le fonctionnement du TCP en C / C ++. De plus, vous devrez comprendre le multiplixage des E / S, cette vidéo vous aidera à saisir l'idée principale de Select ().
Le processus de multiplexage d'E / S dans notre serveur Web est résumé dans l'organigramme ci-dessous. (CGI n'est pas inclus dans l'organigramme mais peut être ajouté à l'avenir)
La partie d'analyse d'un serveur Web fait référence au processus responsable de l'interprétation et de l'extraction d'informations des demandes HTTP. Dans ce serveur Web, l'analyse des demandes est effectuée par la classe HttpRequest. Un objet HttpRequest reçoit une demande entrante, l'analyse et extrait les informations pertinentes telles que la méthode, le chemin, les en-têtes et le corps de message (si présent). Si une erreur de syntaxe a été trouvée dans la demande lors de l'analyse, les drapeaux d'erreur sont définis et l'analyse des arrêts. La demande peut être alimentée à l'objet via la méthode feed () entièrement ou partiellement, cela est possible car l'analyseur analyse l'octet de demande à la fois et mettent à jour l'état d'analyse chaque fois que cela est nécessaire. La même manière d'analyse est utilisée par Nginx et NodeJS PARSERS.
Vous trouverez ci-dessous un aperçu du fonctionnement de l'analyseur.
Le constructeur de réponse est responsable de la construction et de la mise en forme des réponses HTTP qui sont renvoyées aux clients en réponse à leurs demandes. Dans ce serveur Web, la classe de réponse est responsable de la construction et du stockage de la réponse HTTP, y compris la ligne d'état, les en-têtes et le corps du message. Le constructeur de réponse peut également effectuer des tâches telles que la définition du code d'état approprié et de la phrase de motif en fonction du résultat de la demande, de l'ajout d'en-têtes à la réponse pour fournir des informations supplémentaires sur le contenu ou le serveur, et en formatant le corps du message en fonction du type de contenu et de l'encodage de la réponse. Par exemple, si le serveur reçoit une demande de page Web à partir d'un client, le serveur analysera la demande et le transmettra à un objet de réponse qui rapportera le contenu de la page Web et construira la réponse HTTP avec le contenu HTML dans le corps du message et les en-têtes appropriés, tels que les en-têtes de contenu et de contenu.
Le fichier de configuration est un fichier texte qui contient divers paramètres et directives qui dictent le fonctionnement du serveur Web. Ces paramètres peuvent inclure des choses comme le numéro de port sur lequel le serveur Web doit écouter, l'emplacement du répertoire racine du serveur Web et de nombreux autres paramètres.
Voici un exemple FIE qui montre le format de fichier de configuration et les directives prises en charge.
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
}
}CGI est une norme pour l'exécution de programmes externes à partir d'un serveur Web. Lorsqu'un utilisateur demande une page Web qui doit être gérée par un programme CGI, le serveur Web exécute le programme et renvoie la sortie au navigateur Web de l'utilisateur.
Les programmes CGI sont simplement des scripts qui peuvent être écrits dans n'importe quel langage de programmation, tels que Perl, Python ou Bash, et sont généralement utilisés pour traiter les données soumises par un utilisateur via un navigateur Web, ou pour générer du contenu dynamique sur une page Web.