TD2-1

Dans ce TD, nous allons découvrir le fonctionnement de HTTP. Pour ce faire, nous n'utiliserons pas PHP!

Un serveur HTTP minimaliste

Dans l'archive, vous découvrirez un simple programme (en Python). Exécutez le en lançant:

python server.py

Lancez votre navigateur, et connectez-vous à 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:

Waiting for a connection... Connected!

> Request: 
GET / HTTP/1.1
Host: 127.0.0.1:8080
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:76.0) Gecko/20100101 Firefox/76.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: fr-FR
Accept-Encoding: gzip, deflate
Connection: keep-alive
Cookie: PHPSESSID=obcai59k3e6smouvkjb1ek6af0
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0

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

18:42:37

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>

Executez 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 coder de manière générique, par exemple en remplissant les valeurs dans un dictionnaire Python (Ici on aurait par exemple {"n1": "123", "n2": "456"})

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:

<img src="http://127.0.0.1:8080/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 un fichier binaire 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 5 : Définir puis lire un cookie

En vous aidant de ces informations, créez une réponse qui créera un cookie sur le navigateur client.

Faites alors en sorte de le lire. Vous pouvez par exemple créer une page qui affiche un nombre qui sera incrémenté à chaque rafraichissement de cette manière.

Exercice 6 : Créer une session

Souvenez vous que les sessions utilisent les cookies pour fonctionner.

En Python, vous pourrez vous aider d'un dictionnaire du type:

sessions = {}

Pour associer les clés de sessions (ici des chaînes de caractères) aux valeurs stockées en session (par exemple un entier).

Ainsi, reproduisez le fonctionnement de la question précédente, mais à l'aide de sessions "faites maison" et sockées en mémoire dans le dictionnaire, au lieu de valeurs directement stockées dans les cookies.