Enseignements

Systemes D Exploitation Projet 15

Le but du projet cette année est de concevoir un mini-serveur web.

Cahier des charge minimal

Le contrat minimum pour avoir la moyenne (1) est de fournir un code python original (2) qui implémente (3) la spécification suivante:

  • le port sur lequel le serveur écoute est indiqué en paramètre du programme python
  • le programme python implémente le code qui permet de réaliser les opérations suivantes à l’aide des primitives vues en cours (4):
    • ouverture ou création de deux fichiers de log dans le répertoire courant: un fichier error.log pour les erreurs et un fichier success.log pour les requêtes servies avec succès
    • attente d’une connection socket entrante sur le port reçu en paramètre sur la ligne de commande
    • réception d’une requête
    • analyse de la requête: ok si GET, erreur autrement et vérifier présence du fichier désigné par URL ou erreur autrement
    • génération de messages de traces dans les fichiers de log adéquat (error ou success)
    • préparation de l’en-tête de la réponse
    • si aucune erreur: ouverture du fichier designé par URL
    • envoi du contenu du fichier vers le client
    • fermeture de la connection
    • retour à l’attente d’une connection
    • Votre serveur se terminera proprement (5) par la reception d’un signal SIGINT ou SIGTERM

Remarques:
(1) 10/20 si le code tourne sans erreur, jusqu’à 12/20 si en plus c’est écrit proprement et bien documenté
(2) c’est-à-dire un code écrit par vous: tout code copié sur un voisin ou internet sera non recevable!
(3) ici implémente signifie que le code fonctionne et sans plantage intempestif.
(4) si vous avez envie un doute demandez à votre enseignant: tout code utilisant des primitives non approuvé sera rejeté, même s’il fonctionne parfaitement.
(5) écriture d’un message dans les logs et fermeture des connections et fichiers de log.

Pour vérifier que votre code fonctionne: - vous créerez deux fichiers html, un court et un long (texte > 4Ko) - vous utiliserez votre navigateur favori en consultant l’url correspondant a chacun des deux fichiers à l’adresse 127.0.0.1:xxxx ou xxxx est le port passé en paramètre

Pour gagner des points supplémentaires

Supplément 1

Ce supplément rapporte + 6 points, donc note maxi = 16 a 18 (si réalisation parfaite)

Vous proposerez une version parallèle du serveur capable de traiter simultanément plusieurs requêtes à l’aide de plusieurs processus:

  • Option 1 (+2 point): en créant un nouveau processus fils à chaque nouvelle connection (solution vue en cours). Attention, cotre solution doit éviter de produire des zombies…
  • Option 2a (+4 points): en utilisant la technique du pre-fork: le père crée plusieurs fils à l’avance, et chaque fils se met en attente d’une requête de connection sur le socket de connection puis retourne se mettre en attente de connection. Lorsque le père reçoit un signal de terminaison, il doit le propoager à ses fils et se terminer proprement sans laisser de zombies…
  • Option 2b (+6 points): en utilisant un fichier et des verrous, faire en sorte qu’à tout moment un seul processus seulement soit en train d’exécuter l’attente sur accept (les autres attendent le verrou). Idem, éviter les zombies lors de la terminsiason

Pour vérifier que votre code fonctionne: - vous ecrirez un petit script shell pour envoyer automatiquement de nombreuses requêtes (p. ex 100) avec des commandes comme wget ou curl (envoi des réponses aux requetes dans /dev/null)

Supplément 2

Ce supplément rapporte jusqu’à +4 points, si la réalisation parfaite.

L’objectif est de supporter les requêtes CGI (Common Gateway Interface). Un script CGI est un script dont l’execution produit sur sa sortie standard le code HTML qui devra être renvoyé au client. Il faut donc que le serveur crée un processus fils pour déclencher l’exécution du script et faire suivre le résultat au client. Mais attention, le serveur doit envoyer un en-tête avant d’envoyer le résultat du script, et cet en-tête contient des informations a propos de l’exécution du script…

La reconnaissance d’éventuels paramètres dans l’URL n’est pas demandée.

Page d’Accueil

Enseignements 2017-18

Enseignements Antérieurs

Recherche…

edit SideBar

Blix theme adapted by David Gilbert, powered by PmWiki