Devoir 5 - Serveur web

Le but de ce devoir est de créer un serveur Web qui doit servir des fichiers et exécuter des scripts.

Ce devoir sera résolu dans l'environnement de programmation Node.js, en utilisant JavaScript comme langage de programmation.

Informations générales

Deadline: 22 Mai, 23:55
Score: 2 points de la note finale
Téléchargement: https://vmchecker.cs.pub.ro/
Téléchargement en retard: 0.1point/jour (maximum 4 jours)

Connaissances évaluées

  • Utilisation des opérations asynchrones
  • Compréhension du paradigme client-servur
  • Compréhension du protocole HTTP

Regles

  1. Le devoir doit contenir un fichier Readme ou vous allez expliquer votre solution (-0.1p)
  2. Vous pouvez utiliser seulement le langage JavaScript (Node.js)
  3. Un devoir qui passe tous les les tests obtiendra 10 points de 10 (seulement si vous n'utilisez pas un API interdit; danc ce cas, il ne sera pas noté)
  4. Un devoir qui est implémenté seulement pour passer les tests ne sera pas noté pour ces tests-la

Tricher

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.

Questions

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.

NE PUBLIEZ PAS LE CODE SOURCE. Cette action sera considérée comme tentative de tricher et sera pénalisée avec 0p pour le devoir.

Server

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é).

Configuration du serveur

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é.

Messages HTTP

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:

  • request_type - le type de demande (GET ou POST);
  • path- le chemin vers le fichier demandé (ex: / scripts / update);
  • header_key: header_value - paires de clés de valeur qui font partie de l'en-tête (ex: type de contenu: application / json);
  • message - le corps du message (pour la demande, le corps du message n'existe que si la demande est de type POST);
  • status_code status - le code d'état suivi de la description de l'état; nous définirons les valeurs possibles ci-dessous (par exemple 404 Not found).

Retour des fichiers

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.

Le serveur retournera seulement des fichiers qui se trouvent en root_path.

Demande HTTP

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.

Réponse HTTP

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:

  • 200 OK - le fichier a été retourné;
  • 403 Forbidden - le serveur n'est pas autorisé à lire le fichier;
  • 404 Not Found - le fichier n'existe pas.

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:

  • text / plain; charset = utf-8 - pour les fichiers texte (extension .txt);
  • text / html; charset = utf-8 - pour les fichiers html;
  • image / jpeg - pour les fichiers JPEG;
  • image / png - pour les fichiers PNG;
  • application / zip - pour les archives ZIP.
  • application / octet-stream - pour les fichiers avec ou sans autres extensions

Exécution d'un script

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.

Demande HTTP

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.

Réponse HTTP

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.

L'en-tête renvoyé par un exécutable peut être identifié comme la première séquence de lignes jusqu'à ce qu'une ligne vierge apparaisse.

Le statut dans la réponse aura l'une des valeurs suivantes:

  • 200 OK - le traitement a été effectué avec succès et le résultat peut être trouvé dans le corps du message;
  • 403 Forbidden - le serveur n'est pas autorisé à lire ou exécuter le fichier;
  • 404 Not Found - l'exécutable requis n'existe pas;
  • 500 Internal Server Error - l'exécutable demandé n'a pas été exécuté avec succès; Dans ce cas, le texte du stderr sera ajouté au corps du message.

Le serveur doit s'assurer que les fichiers d'un répertoire autre que celui mentionné dans le fichier de configuration ne peuvent pas être exécutés.

Operations asynchrones

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:

  • net pour accepter les connexions et recevoir / envoyer des messages HTTP;
  • child_process pour lancer des processus enfants.

Seule l'utilisation du module “net” est autorisée pour la communication réseau.

Dans l'implémentation du thème, vous ne pouvez utiliser que des bibliothèques Node.js natives et uniquement des fonctions asynchrones.

Envoi tu devoir

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.

Readme

Le fichier readme aura la forme suivante:

Nom entier
Groupe
 
Description de la solution

Archiver le devoir

Pour télécharger le thème, suivez les étapes:

  1. Créez une archive zip (pas rar, ace, 7zip ou autre format) qui contient:
    • tous les fichiers JavaScript (* .js)
    • Fichier Readme
  2. Connectez-vous à vmchecker
  3. Sélectionnez le cours Systems d'Explotation (FILS)
  4. sélectionnez 5. Serveur
  5. Téléchargez l'archive

L'archive doit contenir tous les fichiers (principaux) à la racine, pas dans les sous-répertoires. NE PAS archiver le répertoire du thème, archiver les fichiers DIRECTEMENT.

Après avoir téléchargé l'archive, vmchecker exécutera:

unzip archive.zip homework
cd homework
make -f Makefile.check
sde/teme/tema_5_python.txt · Last modified: 2020/05/05 18:19 by ioana_maria.culic
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0