TD: HTTP

Un serveur HTTP minimaliste

Dans l'archive, vous découvrirez un simple programme (en Python).
Executez-le:

python server.py

Lancez votre navigateur, connectez-vous alors à http://127.0.0.1:8080/.

Observez ce qu'il se passe, ainsi que les messages qui apparaissent dans la console.

Voici ce qui devrait apparaître:

> Request: 
GET / HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:77.0) Gecko/20100101 Firefox/77.0
Accept: image/webp,*/*
Accept-Language: fr-FR
Accept-Encoding: gzip, deflate
Connection: keep-alive

> Response: 
HTTP/1.1 200 OK
Content-type: text/html

18:39:26

Exercice 1 : Des pages!

Lorque vous changez de page, en vous rendant par exemple sur http://127.0.0.1:8080/test, la même réponse est fournie. Observez les différences dans la console.

Modifiez alors le code de manière à pouvoir naviguer entre plusieurs pages.

Exercice 2 : Un formulaire

Sur l'une de vos pages, placez le code HTML suivant:

<form method="get">
    Nombre 1: <input type="text" name="n1" /><br />
    Nombre 2: <input type="text" name="n2" /><br />
    <input type="submit" value="Additioner!" />
</form>

Exécutez le code et observez dans la barre d'adresse, ainsi que dans la console l'impact que les nombres que vous saisissez ont sur la requête.

Modifiez le code de façon à ce que la page en question affiche la somme des deux nombres envoyés par le formulaire.

Essayez de stocker les valeurs passées en GET dans un dictionnaire {}.

Exercice 3 : Une image

Essayez maintenant d'afficher une image à l'aide de votre application web.

Ne trichez pas! Votre image doit être hébergée sur votre application, et pas à l'extérieur. Par exemple, le code suivant:

<img src="/image.jpg" />

Devrait afficher une image de votre choix, à vous de bien écrire la réponse de manière à ce que le navigateur la comprenne.

En Python, il est possible de lire des fichiers de cette manière:

img = open('fichier', 'rb')
data = img.read()
img.close()

Exercice 4 : Formulaire en POST

Changez la méthode du formulaire en POST:

<form method="post">

Et observez ce qu'il se passe.

Attention: le code d'origine répond à partir de la première ligne vide reçue. Cependant, dans le cas d'une requête POST, la requête contient des données dont la longueur est précisée dans l'en-tête Content-Length, il faudra donc modifier ce comportement.

Modifiez ensuite votre code afin qu'il puisse répondre à la somme des deux nombres en POST et non en GET.

Exercice (bonus) 5 : Serveur de fichier générique

Lorsqu'on demande une resource qui n'existe pas, faites en sorte que votre programme regarde si le fichier existe, et l'envoie au client

Vous pourrez intégrer quelques types mimes en vous basant sur l'extension du fichier

Exercice (bonus) 6 : Cookies

En utilisant les cookies, faites une page qui affiche un numéro qui s'incrémente à chaque requête.