This is an old revision of the document!
Le but de ce devoir est de créer un serveur Web qui doit servir des fichiers et exécuter des scripts.
Le devoir sera résolu individuellement. Si vous essayez de tricher, vous obtiendrez 0p pour le devoir. On va utiliser des systemes automatisés pour détecter si vous avez copié. Si on a des doutes, on va vous adresser des questions supplémentaires concernant le devoir.
Si vous avez des questions liées au devoir, on vous prie d'ouvrir un issue sur le repository de github, ayant le titre avec le format suivant: [server] <titre de la question> . Vous avez besoin d'un compte de github pour poser des questions.
Le serveur sera implémenté dans le fichier index.js
et il sera exécuté de la maniere suivante:
node index.js
Pour résoudre le devoir, vous allez implémenter un serveur HTTP, qui peut traiter les demandes via des opérations asynchrones. Le serveur recevra des paquets HTTP des clients, effectuera diverses opérations et répondra avec des paquets HTTP (un format simplifié).
Au démarrage, le serveur lira un fichier de configuration, situé dans le même répertoire que index.js
. Le nom du fichier est config.json
et contiendra la structure JSON suivante:
{ "scripts" : "scripts_path", "www" : "root_path" }
scripts_path
est un chemin supprimé vers un répertoire contenant les scripts à exécuter par le serveur.
root_path
est un chemin absolu vers le répertoire racine, par rapport auquel toutes les requêtes seront effectuées. Par exemple, si une demande a le chemin /images/sunny.png
et que le chemin racine est /home/server/root
, le fichier avec le chemin absolu /home/server/root/images/sunny.png
sera retourné.
Les messages HTTP reçus par le serveur auront le format générique suivant:
<request_type> <path> HTTP/1.1 <header_key>:<header_value> ... <header_key>:<header_value> <message - optional>
Les messages HTTP envoyés par le serveur auront le format générique suivant:
HTTP/1.0 <status_code status> <header_key>:<header_value> ... Connection: close <message>
Les variables suivantes seront remplacées comme suit:
La première fonctionnalité du serveur est de renvoyer les fichiers demandés par les clients. Dans ce cas, le serveur recevra une demande GET vers un fichier et répondra avec le contenu du fichier.
root_path
.
Dans ce cas, la demande recue par le serveur aura le format suivant:
GET <file_path_relative_to_root> HTTP/1.1 Host: localhost:8000 <other header lines>
La première ligne de l'application spécifie le chemin d'accès au fichier demandé. L'en-tête peut contenir d'autres lignes en plus de celles spécifiées ci-dessus.
Pour répondre aux demandes de fichiers, le serveur renverra un message similaire a:
HTTP/1.1 <status_code status> Content-type: <file_type> Connection: close <file_contents>
Selon la demande reçue et l'état du fichier demandé, l'état de la réponse peut être:
La troisième ligne de l'application spécifie le type de fichier renvoyé. Selon le type de fichier, file_type
peut avoir les valeurs suivantes:
Certains des messages reçus des clients nécessiteront l'exécution de scripts. Ce type de demande est identifié par le chemin du fichier, et dans ce cas le chemin est un fichier du répertoire scripts_path
.
Tous les fichiers exécutables peuvent exister dans le répertoire scripts_path
. N'importe lequel de ces fichiers sera exécuté avec la commande ./script_name
. Après l'exécution, le serveur répondra avec le résultat de l'exécution.
Dans ce cas, la demande recue par le serveur ressemblera a:
<request_type> <file_path_relative_to_root> HTTP/1.1 Host: localhost:8000 <other header lines> <message - optional>
Dans ce cas, les requêtes (request_type
) peuvent être de deux types: GET
et POST
.
Pour ces demandes, les lignes de l'en-tête, à l'exception des deux premières, sont transmises en tant que variables d'environnement pour le fichier à exécuter.
Si la demande est POST, il y aura également un corps de message. Ceci est transmis en entrée au script à exécuter.
Dans ce cas, le serveur renverra un message sous la forme:
HTTP/1.1 <status_code status> Connection: close <other_headers> <file_contents>
Certains exécutables renverront le corps du message avec l'en-tête, tandis que d'autres ne renverront que le corps du message. Si l'exécutable renvoie également l'en-tête, il contiendra toutes les informations nécessaires, à l'exception des deux premières lignes du message. Si l'exécutable ne renvoie aucun en-tête, en plus des deux premières lignes, le serveur générera également l'en-tête Content-type: application/octet-stream
.
Le statut dans la réponse aura l'une des valeurs suivantes:
Le devoir sera implémenté dans l'environnement de programmation Node.js et vous utiliserez des fonctions asynchrones pour traiter les demandes reçues des clients.
Seules les bibliothèques Node.js natives sont autorisées à résoudre le problème, et les modules suivants sont recommandés:
Le thème se chargera sur vmchecker. Connectez-vous au site avec l'utilisateur moodle, sélectionnez le cours Systemes d'Explotation (FILS) et téléchargez l'archive thématique.
Le fichier readme aura la forme suivante:
Nom entier Groupe Description de la solution
Pour télécharger le thème, suivez les étapes:
Après avoir téléchargé l'archive, vmchecker exécutera:
unzip archive.zip homework cd homework make -f Makefile.check