Cours de C – Séance dexercices 19 Octobre 2007
Objectif Ecrire un serveur HTTP Sans gérer la partie réseau, on utilisera un utilitaire pour cela Serveur gérant une seule requête
Protocole: client Protocole : – Requête client : GET /test.html HTTP/1.1\r\n Host: nom_de_l_hote\r\n Parameter: Value\r\n ….. \r\n Nécéssité de traiter les \r\n et les \n\n aussi.
Protocole: Serveur Protocole – Réponse serveur HTTP/ OK\r\n – ( ou 404 Not Found, ou 500 Internal Error ) Content-Type: text/html\r\n – (ou image/jpeg, image/png, image/gif … ) Content-Length: 1242\r\n Connection: Close \r\n DATA
Etape 0 A laide de main_http.c et Struct_http.h créer le projet Rajouter à la main les fonctions manquantes (vides) Le faire compiler
Etape 1 Utiliser la structure définie dans Struct_http.h Implémentation de la fonction read_request – Lire stdin jusquà la première ligne vide – Prévoir le cas où \r est converti en \n – Identifier le type de requête, et éventuellement appeler prepare_get_request
Etape 2 Implémentation de la fonction process_get_request – Trouver dans la première ligne le nom du fichier demandé (utiliser strchr) – Remplir la structure dont le pointeur est passé en argument
Etape 3 Coder la fonction prepare_get_response – Lire le fichier – Remplir le buffer de la structure – Remplir la longueur – Remplir le Content-Type
Etape 4 Coder la fonction post_response – Afficher dans lordre les métadonnées contenues dans la structure – \r\n – Afficher le contenu du buffer de réponse Cette fonction doit gérer les codes derreur RESPONSE_ERROR et RESPONSE_NOT_FOUND
Les astuces Le fichier : louvrir en lecture avec le more « rb », le « b » est TRES important Ajouter le mode binaire : _setmode(fileno(stdout), _O_BINARY); Penser que lutilitaire convertit les \r en \n !
On branche Utiliser le programme « netcat_modified » Le lancer avec largument « -L 8000 –e » Pointer le navigateur vers