cours de c – séance dexercices 19 octobre 2007. objectif ecrire un serveur http sans gérer la...

11
Cours de C – Séance d’exercices 19 Octobre 2007

Upload: estelle-maurice

Post on 03-Apr-2015

104 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 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

Cours de C – Séance d’exercices

19 Octobre 2007

Page 2: 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

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

Page 3: 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

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.

Page 4: 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

Protocole: Serveur

• Protocole– Réponse serveur• HTTP/1.0 200 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

Page 5: 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

Etape 0

• A l’aide de main_http.c et Struct_http.h créer le projet

• Rajouter à la main les fonctions manquantes (vides)

• Le faire compiler

Page 6: 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

Etape 1

• Utiliser la structure définie danshttp://people.via.ecp.fr/~henri/SA2008/....

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

Page 7: 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

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

Page 8: 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

Etape 3

• Coder la fonction prepare_get_response– Lire le fichier– Remplir le buffer de la structure– Remplir la longueur– Remplir le Content-Type

Page 9: 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

Etape 4

• Coder la fonction post_response– Afficher dans l’ordre 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 d’erreur RESPONSE_ERROR et RESPONSE_NOT_FOUND

Page 10: 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

Les astuces

• Le fichier : l’ouvrir en lecture avec le more « rb », le « b » est TRES important

• Ajouter le mode binaire : _setmode(fileno(stdout), _O_BINARY);• Penser que l’utilitaire convertit les \r en \n !

Page 11: 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

On branche

• Utiliser le programme « netcat_modified »• Le lancer avec l’argument

« -L 8000 –e <votre_programme.exe> »• Pointer le navigateur vers

http://localhost:8000/test.html