This shows you the differences between two versions of the page.
sde2:teme:tema_fr_4_rust [2022/05/11 15:52] alexandru.radovici created |
sde2:teme:tema_fr_4_rust [2022/05/23 13:36] (current) alexandru.radovici |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Devoir 4 - Serveur web ====== | + | ====== Devoir 4 - Rustywebserver ====== |
Le but de ce devoir est de créer un serveur Web qui doit servir des fichiers et exécuter des scripts. | Le but de ce devoir est de créer un serveur Web qui doit servir des fichiers et exécuter des scripts. | ||
Line 7: | Line 7: | ||
<note important> | <note important> | ||
- | Date limite: ** Le 10 mai, 23h59 ** \\ | + | Date limite: ** Le 25 mai, 23h59 ** \\ |
Note: ** 2 points ** de la note \\ | Note: ** 2 points ** de la note \\ | ||
- | Lien: [[https://classroom.github.com/a/NenM8B_7|Devoir 4]] \\ | + | Lien: [[https://classroom.github.com/a/lee9GzjC|Devoir 4]] \\ |
Télécharger en retard: **2 points / jour** (maximum 4 jours)\\ | Télécharger en retard: **2 points / jour** (maximum 4 jours)\\ | ||
</note> | </note> | ||
Line 32: | Line 32: | ||
- | Si vous avez des questions concernant le devoir, posez-les en publiant un //issue// sur le github [[https://github.com/UPB-FILS-SdE2/questions]] avec le format // [busybox] <le titre de votre question> //. Vous aurez besoin d'un compte github pour publier des questions. | + | Si vous avez des questions concernant le devoir, posez-les en publiant un //issue// sur le github [[https://github.com/UPB-FILS-SdE2/questions]] avec le format // [webserver] <le titre de votre question> //. Vous aurez besoin d'un compte github pour publier des questions. |
<note warning> | <note warning> | ||
Line 45: | Line 45: | ||
<code bash> | <code bash> | ||
- | rustwebserver ROOT_FOLDER | + | rustwebserver PORT ROOT_FOLDER |
</code> | </code> | ||
Line 63: | Line 63: | ||
<header_key>:<header_value> | <header_key>:<header_value> | ||
- | <message - optional> | + | <message> |
</code> | </code> | ||
Line 82: | Line 82: | ||
* path- le chemin vers le fichier demandé (ex: / scripts / update); | * 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); | * 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); | + | * message - le corps du message (la longueur du message est de 8 Ko maximum); |
* 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). | * 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). | ||
Line 90: | Line 90: | ||
<note> | <note> | ||
- | Le serveur retournera seulement des fichiers qui se trouvent en ''root_folder''. | + | Le serveur retournera seulement des fichiers qui se trouvent en ''root_folder'' ou ses sous-dossiers. |
</note> | </note> | ||
Line 127: | Line 127: | ||
* text / plain; charset = utf-8 - pour les fichiers texte (extension .txt); | * text / plain; charset = utf-8 - pour les fichiers texte (extension .txt); | ||
* text / html; charset = utf-8 - pour les fichiers html; | * text / html; charset = utf-8 - pour les fichiers html; | ||
+ | * text / css; charset = utf-8 - pour les fichiers css; | ||
+ | * text / javascript; charset = utf-8 - pour les fichiers js; | ||
* image / jpeg - pour les fichiers JPEG; | * image / jpeg - pour les fichiers JPEG; | ||
* image / png - pour les fichiers PNG; | * image / png - pour les fichiers PNG; | ||
Line 138: | Line 140: | ||
Tous les fichiers exécutables peuvent exister dans le répertoire /scripts. 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. | Tous les fichiers exécutables peuvent exister dans le répertoire /scripts. 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. | ||
+ | |||
+ | <note> | ||
+ | Le résultat de l'exécution correspond à ce que le script a écrit à l'écran (indice : utilisez un pipe) | ||
+ | </note> | ||
+ | |||
+ | ==== Variables ==== | ||
+ | |||
+ | Lorsque le script est exécuté, tous les en-têtes HTTP reçus du client sont envoyés en tant que variables d'environnement au script (astuce : utilisez execve). | ||
+ | |||
+ | Le script recevra deux variables d'environnement supplémentaires : Method et Path. Method a la valeur GET ou POST et Path a la valeur du chemin demandé. | ||
+ | |||
+ | ==== Query String ==== | ||
+ | |||
+ | Le moment de lire sur la définition de la [[https://en.wikipedia.org/wiki/Query_string|query string]]. | ||
+ | |||
+ | Chaque variable de query string doit être envoyée au script en tant que variable d'environnement au format Query_title=value. | ||
==== Demande HTTP ==== | ==== Demande HTTP ==== | ||
Line 168: | Line 186: | ||
<file_contents> | <file_contents> | ||
</code> | </code> | ||
- | |||
- | 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''. | ||
- | |||
- | <note> | ||
- | 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. | ||
- | </note> | ||
Le statut dans la réponse aura l'une des valeurs suivantes: | Le statut dans la réponse aura l'une des valeurs suivantes: | ||
Line 186: | Line 198: | ||
</note> | </note> | ||
+ | ===== Log ===== | ||
+ | Au démarrage, le serveur imprimera ce qui suit: | ||
+ | <code> | ||
+ | Root folder: <ansolute path to root folder> | ||
+ | Server listening on 0.0.0.0:PORT | ||
+ | </code> | ||
+ | |||
+ | Pour chaque requête, le serveur imprimera une ligne: | ||
+ | <code> | ||
+ | $Request request_source_ip_address $Path -> status_code (status_text) | ||
+ | </code> | ||
+ | |||
+ | ===== Bonus ===== | ||
+ | |||
+ | Mettre en œuvre la liste des dossiers pour le serveur Web. Si le chemin demandé est un dossier, générez une réponse html au format suivant. | ||
+ | |||
+ | <code html> | ||
+ | <html> | ||
+ | <h1>$Request</h1> | ||
+ | <ul> | ||
+ | <li><a href="/..">..</a></li> | ||
+ | <li><a href="/file1">file1</a></li> | ||
+ | <li><a href="/file2">file2</a></li> | ||
+ | ... | ||
+ | </ul> | ||
+ | </html> | ||
+ | </code> |