This shows you the differences between two versions of the page.
|
sde2:teme:tema_fr_4_rust [2022/05/11 15:57] alexandru.radovici |
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 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 142: | Line 144: | ||
| Le résultat de l'exécution correspond à ce que le script a écrit à l'écran (indice : utilisez un pipe) | Le résultat de l'exécution correspond à ce que le script a écrit à l'écran (indice : utilisez un pipe) | ||
| </note> | </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 172: | 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 190: | 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> | ||