Update readme
il manque ex2 partie 2
This commit is contained in:
158
README.md
158
README.md
@@ -10,8 +10,15 @@ Le 4 février 2025
|
|||||||
Nous nous sommes inspirés du cours pour implémenter le serveur écho.
|
Nous nous sommes inspirés du cours pour implémenter le serveur écho.
|
||||||
|
|
||||||
### EXERCICE 2 : Test et capture
|
### EXERCICE 2 : Test et capture
|
||||||

|
Après lancé le serveur, on a ouvert un terminal cmd sur windows pour tester:
|
||||||
|
```
|
||||||
|
ncat localhost 8080
|
||||||
|
Hello World!
|
||||||
|
Hello World!
|
||||||
|
Je teste, je suis content, je dors
|
||||||
|
Je teste, je suis content, je dors
|
||||||
|
^C
|
||||||
|
```
|
||||||
Quand on voit le contenu du TCP, on voit tout le texte d'échange mais on voit qu'il y a un espace entre chaque 8 caractères quand on passe la taille du buffer. Et à la fin du caractère, nous pouvons voir le dernier caractère pour déterminer la fin du texte.
|
Quand on voit le contenu du TCP, on voit tout le texte d'échange mais on voit qu'il y a un espace entre chaque 8 caractères quand on passe la taille du buffer. Et à la fin du caractère, nous pouvons voir le dernier caractère pour déterminer la fin du texte.
|
||||||
|
|
||||||

|

|
||||||
@@ -27,45 +34,69 @@ Dans le texte "Je teste, je suis content, je dors" nous avons 99 octets, dont 64
|
|||||||
### EXERCICE 3 : Version Multithreadée
|
### EXERCICE 3 : Version Multithreadée
|
||||||
|
|
||||||
Dans cet exercice, on réussit à créer un multi thread pour 4 personnes seulement, on teste avec le 5ème et il ne peut pas être "echo"
|
Dans cet exercice, on réussit à créer un multi thread pour 4 personnes seulement, on teste avec le 5ème et il ne peut pas être "echo"
|
||||||
|
On peut voir dans l'image qu'on a 2 clients demandent l'accès du serveur:
|
||||||
|
Paquet no.49 et 51 sont client 1 et paquet 324 et 326 sont client 2.
|
||||||
|
|
||||||
|

|
||||||
## Partie II: Implémentation d’un client HTTPping
|
## Partie II: Implémentation d’un client HTTPping
|
||||||
|
|
||||||
### EXERCICE 1 : Analyse du protocole HTTP
|
### EXERCICE 1 : Analyse du protocole HTTP
|
||||||
```
|
|
||||||
On vous demande de produire une capture de l’intéraction entre votre navigateur et le site http://example.com.
|
|
||||||
|
|
||||||
Vous devrez utiliser “Follow TCP Stream”
|
|
||||||
|
|
||||||
En vous aidant de la spécification ou de Wikipedia.
|
|
||||||
|
|
||||||
Coté requête :
|
Coté requête :
|
||||||
|
1. Ex: La première ligne `GET / HTTP/1.1` est la ligne de requête avec structure:
|
||||||
Quel est le rôle de la première ligne ? ( GET / HTTP/1.1 ):
|
|
||||||
Càd on a demandé les resources sur la racine de example.com avec la version HTTP 1.1
|
|
||||||
|
|
||||||
Décrivez le rôle des options : “Accept-Encoding:”, “Accept:” et “Connection: keep-alive” ?
|
|
||||||
|
|
||||||
Accept-Encoding
|
|
||||||
|
|
||||||
Coté serveur :
|
|
||||||
|
|
||||||
Décrire la première ligne. A quoi sert le code de réponse ?
|
|
||||||
Trouvez un site dont la réponse est 404 ou 403.
|
|
||||||
En vous aidant de la spec décrivez les grandes étapes du protocole pour la récupération d’une page ?
|
|
||||||
Par la suite nous vous suggérons d’utiliser l’option “Connection: Close” dans les réponses.
|
|
||||||
```
|
```
|
||||||
|
Méthode Lien Version_de_HTTP
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Rôle des options:
|
||||||
|
- Accept-Encoding: L'encodage que le client peut comprendre
|
||||||
|
- Accept: Type de conetnu que le client peut accepter
|
||||||
|
- Connection: keep-alive: C'est une intruction qui permets de rester ouvert pour multiples requêtes/ réponses HTTP
|
||||||
|
|
||||||
|
Cote serveur:
|
||||||
|
1. La première ligne est la ligne de status avec structure:
|
||||||
|
```
|
||||||
|
Version_de_HTTP Code_de_status Message
|
||||||
|
```
|
||||||
|
2. On ne peut pas trouver un siteweb qui retourne 404. On a testé avec nombreux de sitewebs et reçu 400 Bad Request.
|
||||||
|
Donc on a utiliser localhost de 3ème partie qui lance test.html et change à abc.html pour créer erreur 404
|
||||||
|
```
|
||||||
|
ncat localhost 8080
|
||||||
|
GET /a.html HTTP/1.1
|
||||||
|
HTTP/1.1 404 File Not Found
|
||||||
|
Content-Type: text/html
|
||||||
|
Connection: close
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Les étapes du protocole pour la récupération d’une page:
|
||||||
|
- Le client demande la connexion
|
||||||
|
- Le client envoie les requêtes
|
||||||
|
- Serveur va vérifier et connecter
|
||||||
|
- Serveur verra s'il existe le web page
|
||||||
|
- Serveur renvoie le résultat et son contenu si c'est possible
|
||||||
|
- Fermeture la connexion
|
||||||
|
|
||||||
### Exercice 2 : Récupération d’une page avec netcat
|
### Exercice 2 : Récupération d’une page avec netcat
|
||||||
```
|
```
|
||||||
Pensez à faire un retour à la ligne.
|
Pensez à faire un retour à la ligne.
|
||||||
|
|
||||||
example.com supporte-t-il le protocole HTTP/1.0 ?
|
example.com supporte-t-il le protocole HTTP/1.0
|
||||||
quel est l’encodage utilisé pour le type de retour ?
|
quel est l’encodage utilisé pour le type de retour ?
|
||||||
que se passe-t-il si vous ajoutez “Accept-Encoding : gzip” ?
|
que se passe-t-il si vous ajoutez “Accept-Encoding : gzip” ?
|
||||||
```
|
```
|
||||||
### Exercice 3, Implémentation du HTTP ping
|
### Exercice 3, Implémentation du HTTP ping
|
||||||
|
|
||||||
### Exercice 4 : Socket securisée
|
### Exercice 4 : Socket securisée
|
||||||

|
On test avec google.fr et on a reçu ce résultat:
|
||||||
|
```
|
||||||
|
ncat --ssl google.fr 443
|
||||||
|
GET / HTTP/1.0
|
||||||
|
|
||||||
|
HTTP/1.0 200 OK
|
||||||
|
Date: Tue, 04 Feb 2025 22:57:57 GMT
|
||||||
|
Expires: -1
|
||||||
|
Cache-Control: private, max-age=0
|
||||||
|
Content-Type: text/html; charset=ISO-8859-1
|
||||||
|
```
|
||||||
|
|
||||||
Ensuite, nous devons changer `GET / HTTP/1.1` en `GET / HTTP/1.0` pour détecter https, son port et créer SSLSocketFactory pour détecter le http sécurisé.
|
Ensuite, nous devons changer `GET / HTTP/1.1` en `GET / HTTP/1.0` pour détecter https, son port et créer SSLSocketFactory pour détecter le http sécurisé.
|
||||||
On lance wireshark et obtient le message crypté. Malheureusement, je ne peux pas mettre le fichier pcapng car j'utilise l'adresse IP chez moi.
|
On lance wireshark et obtient le message crypté. Malheureusement, je ne peux pas mettre le fichier pcapng car j'utilise l'adresse IP chez moi.
|
||||||
@@ -78,78 +109,5 @@ Vérification de message encrypté:
|
|||||||

|

|
||||||
|
|
||||||
## Partie III : Implémentation d’un serveur HTTP simple
|
## Partie III : Implémentation d’un serveur HTTP simple
|
||||||
|
Dans cette dernière partie, on a codé un serveur auquel on peut accéder depuis ncat et notre navigateur. On utilise PrintWriter pour envoyer les données au client.
|
||||||
## Utilisation
|
Et on vérifie également auprès de Wireshark pour assurer que cela a fonctionné correctement.
|
||||||
|
|
||||||
Pour utiliser ce tp vous devez :
|
|
||||||
|
|
||||||
1. le forker via le lien fork ci-dessus.
|
|
||||||
2. Votre repository doit être **privé**. Vous devez le partager avec votre encadrant de TP.
|
|
||||||
3. vous obtiendrez un nouveau lien : par exemple git@gitlab.istic.univ-rennes1.fr:monpseudo/tp1.http.git
|
|
||||||
4. Dans le **workspace d'eclipse** faites `git clone git@gitlab.istic.univ-rennes1.fr:monpseudo/tp1.http.git` avec l'url précédente.
|
|
||||||
5. Ouvrez le workspace dans eclipse.
|
|
||||||
6. Utilisez Import> "Existing Maven Projects".
|
|
||||||
7. Selectionnez le projet et validez.
|
|
||||||
|
|
||||||
Vous devriez avoir une version du projet dans votre propre compte gitlab.
|
|
||||||
|
|
||||||
Vous pouvez le partager avec votre binome et l'encadrant de TP.
|
|
||||||
|
|
||||||
|
|
||||||
## Rapport
|
|
||||||
|
|
||||||
J'ai fait ça avec Tuan Minh Vu.
|
|
||||||
|
|
||||||
Votre rapport doit être écrit ici en markdown.
|
|
||||||
|
|
||||||
Vous trouverez la syntaxe de markdown ici : https://docs.gitlab.com/ee/user/markdown.html
|
|
||||||
|
|
||||||
Placez vos images dans le répertoire images si nécessaire.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Faire des diagrammes
|
|
||||||
|
|
||||||
En particulier vous pouvez utiliser [mermaid](https://mermaidjs.github.io/) :
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
```mermaid
|
|
||||||
sequenceDiagram
|
|
||||||
participant Alice
|
|
||||||
participant Bob
|
|
||||||
Alice->John: Hello John, how are you?
|
|
||||||
loop Healthcheck
|
|
||||||
John->John: Fight against hypochondria
|
|
||||||
end
|
|
||||||
Note right of John: Rational thoughts <br/>prevail...
|
|
||||||
John-->Alice: Great!
|
|
||||||
John->Bob: How about you?
|
|
||||||
Bob-->John: Jolly good!
|
|
||||||
```
|
|
||||||
|
|
||||||
## Insérer du code
|
|
||||||
|
|
||||||
Insérer du `code` :
|
|
||||||
|
|
||||||
```java
|
|
||||||
public interface ClientHandler {
|
|
||||||
public void handle();
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
et des résultats :
|
|
||||||
|
|
||||||
```bash
|
|
||||||
[yo@capybara dkgr]$ nc google.fr 80
|
|
||||||
PWET /
|
|
||||||
HTTP/1.0 400 Bad Request
|
|
||||||
Content-Type: text/html; charset=UTF-8
|
|
||||||
Referrer-Policy: no-referrer
|
|
||||||
Content-Length: 1555
|
|
||||||
Date: Mon, 21 Jan 2019 12:18:02 GMT
|
|
||||||
|
|
||||||
<!DOCTYPE html>
|
|
||||||
<html lang=en>
|
|
||||||
<meta charset=utf-8>
|
|
||||||
```
|
|
||||||
BIN
images/p1_ex3_2clients.png
Normal file
BIN
images/p1_ex3_2clients.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 29 KiB |
@@ -15,12 +15,15 @@ public class HTTPHandler implements ClientHandler, Runnable {
|
|||||||
public void handle() {
|
public void handle() {
|
||||||
try {
|
try {
|
||||||
// Crée les print writer et buffered reader
|
// Crée les print writer et buffered reader
|
||||||
PrintWriter out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
|
PrintWriter out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()),true);
|
||||||
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
|
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
|
||||||
|
|
||||||
// lit l'entête de la requête
|
// lit l'entête de la requête
|
||||||
String[] premiere_ligne=in.readLine().split(" ");
|
String[] premiere_ligne=in.readLine().split(" ");
|
||||||
System.out.println(premiere_ligne.length);
|
System.out.println(premiere_ligne.length);
|
||||||
|
if(premiere_ligne.length<2){
|
||||||
|
doError(out);
|
||||||
|
}
|
||||||
System.out.println(premiere_ligne[0] + " " + premiere_ligne[1]);
|
System.out.println(premiere_ligne[0] + " " + premiere_ligne[1]);
|
||||||
// Appelle doGet si la méthode est une méthode GET.
|
// Appelle doGet si la méthode est une méthode GET.
|
||||||
if (premiere_ligne[0].equals("GET")){
|
if (premiere_ligne[0].equals("GET")){
|
||||||
@@ -45,10 +48,11 @@ public class HTTPHandler implements ClientHandler, Runnable {
|
|||||||
|
|
||||||
// si le fichier existe :
|
// si le fichier existe :
|
||||||
if (f.exists() && !f.isDirectory()) {
|
if (f.exists() && !f.isDirectory()) {
|
||||||
|
|
||||||
//Ecrit l'en-tête de réponse (Code, Content-type, Connexion, ...)
|
//Ecrit l'en-tête de réponse (Code, Content-type, Connexion, ...)
|
||||||
out.println("HTTP/1.1 200 OK");
|
out.println("HTTP/1.1 200 OK");
|
||||||
out.println("Content-Type: text/html");
|
out.println("Content-Type: text/html");
|
||||||
|
out.println("Connection: close");
|
||||||
|
out.println("");
|
||||||
|
|
||||||
//Ecrit le contenu du fichier si il existe
|
//Ecrit le contenu du fichier si il existe
|
||||||
BufferedReader fin = new BufferedReader(new FileReader(f));
|
BufferedReader fin = new BufferedReader(new FileReader(f));
|
||||||
@@ -56,8 +60,9 @@ public class HTTPHandler implements ClientHandler, Runnable {
|
|||||||
while ((line = fin.readLine()) != null) {
|
while ((line = fin.readLine()) != null) {
|
||||||
out.println(line);
|
out.println(line);
|
||||||
}
|
}
|
||||||
out.println("Connection: close");
|
out.flush();
|
||||||
out.println();
|
out.close();
|
||||||
|
fin.close();
|
||||||
}else{
|
}else{
|
||||||
// sinon
|
// sinon
|
||||||
// appelle la méthode send404.
|
// appelle la méthode send404.
|
||||||
@@ -71,6 +76,7 @@ public class HTTPHandler implements ClientHandler, Runnable {
|
|||||||
out.println("Content-Type: text/html");
|
out.println("Content-Type: text/html");
|
||||||
out.println("Connection: close");
|
out.println("Connection: close");
|
||||||
out.println("");
|
out.println("");
|
||||||
|
out.flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void doError(PrintWriter out) {
|
public void doError(PrintWriter out) {
|
||||||
@@ -79,20 +85,11 @@ public class HTTPHandler implements ClientHandler, Runnable {
|
|||||||
out.println("Content-Type: text/html");
|
out.println("Content-Type: text/html");
|
||||||
out.println("Connection: close");
|
out.println("Connection: close");
|
||||||
out.println("");
|
out.println("");
|
||||||
|
out.flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
try {
|
handle();
|
||||||
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
|
|
||||||
String message = in.readLine();
|
|
||||||
System.out.println(message);
|
|
||||||
String[] a= message.split(" ");
|
|
||||||
if(a[0].equals("GET")) {
|
|
||||||
doGet("test.html",new PrintWriter(new OutputStreamWriter(socket.getOutputStream())));
|
|
||||||
}
|
|
||||||
} catch (IOException e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user