Précédent   Forum du club des développeurs et IT Pro > C et C++ > C > Réseau
Réseau Forum d'entraide sur la programmation réseau en C
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 27/09/2012, 19h32   #1
Arkenis
Futur Membre du Club
 
Homme Carl
Étudiant
Inscription : janvier 2009
Messages : 62
Détails du profil
Informations personnelles :
Nom : Homme Carl
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2009
Messages : 62
Points : 19
Points : 19
Par défaut Décompression des corps de réponse HTTP

Bonsoir,

Je code actuellement un proxy local afin de récupérer les requêtes envoyées par ma machine et les réponses reçues, mon problèmes est que j'aimerais pouvoir lire les données reçues mais que ces dernières sont généralement compressées avant d'être envoyées.
Après quelques recherches, j'ai cru comprendre que l'algo de compression le plus utilisé pour ce genre de chose est gzip ou deflate, d'ailleurs, ces algo sont-ils identiques ? La réponse varie selon les sites ou on regarde..
J'ai alors essayé d'utiliser gunzip sur les corps de réponses, sans succes, de même avec la fonction uncompress de la librairie zlib qui me retourne un résultat incohérent.

Voila le code:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
        /* dest représente la socket qui relie ce programme
        a mon navigateur, src la socket qui relie ce programme à l'hôte distant*/
        int getencodedmsg(int dest, int src){
	printf("Appel de getencodedmsg\n");
 
	int 	i, data = 0;
	int	taille = 1024;
	int	lu, total = 0;
	char	tmp[taille];
	char	*header_end = "\r\n\r\n";
	char	*begin;
	char	file[24];
 
	sprintf(file, "test_%d.gz", getpid());
 
	int fd = open(file, O_WRONLY | O_TRUNC | O_CREAT, 0700);
 
	while((lu = read(src, tmp, taille-1)) > 0){
		write(dest, tmp, lu);
		total += lu;
 
                //Si le buffer ne contient plus de header
		if(data == 1){
			write(fd, tmp, lu);
		}
 
                //Si le buffer contient des headers et une partie du corps du message
		if((begin = memmem(tmp, lu, header_end, strlen(header_end))) != NULL){
			begin += strlen(header_end);
			write(fd, begin, lu - (begin - tmp));
			data = 1;
		}
 
		memset(tmp, 0, taille);
	}
 
        //Nécessaire ?
	write(fd,"\0", 1);
 
	close(fd);
 
	return total;	// Nombre de bytes écrits dans msg	
}
Outre ce problème de décompression, le programme fonctionne, du moins avec HTTP

Voila l'erreur que me sort gunzip:
Citation:
gzip: test_3156.gz: not in gzip format
Il arrive que la décompression fonctionne et m'affiche:
Citation:
gzip: test_3594.gz: decompression OK, trailing garbage ignored
Mais je ne sais pas pourquoi ca marche dans ces cas la et pas dans les autres

Si qqun peut m'eclairer..
Arkenis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/09/2012, 09h01   #2
Flob91
Membre expérimenté
 
Avatar de Flob91
 
Florent
Ingénieur
Inscription : mai 2005
Messages : 791
Détails du profil
Informations personnelles :
Nom : Florent
Âge : 29
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Ingénieur
Secteur : Industrie

Informations forums :
Inscription : mai 2005
Messages : 791
Points : 548
Points : 548
pourrais tu expliquer comment tu as résolu ton problème ?
Flob91 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 30/09/2012, 13h03   #3
Arkenis
Futur Membre du Club
 
Homme Carl
Étudiant
Inscription : janvier 2009
Messages : 62
Détails du profil
Informations personnelles :
Nom : Homme Carl
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2009
Messages : 62
Points : 19
Points : 19
Bien sur, je ne pensais pas que qqun suivait ce post à vrai dire..

La première erreur décrite ci-dessus:
Citation:
gzip: test_3156.gz: not in gzip format
est due au fait que beaucoup de sites n'utilisent pas le header "Content-Encoding" avec comme paramètre gzip mais utilisent plutôt le header "Transfer-Encoding" avec comme paramètre chunk, or mon programme ne faisait pas la différence, et se retrouvait à écrire dans des fichier .gz des données qui n'avaient pas été compressé avec gzip.

J'ai par la suite eu une autre erreur me disant que mes fichiers .gz contenant des données compressé avec gzip étaient corrompus, ce qui était du au fait que le programme modifiait le message en remplaçant certains caractères '\r' par des '\0' afin de récupérer des infos tel que le nom de l'hote ou le type d'encodage, j'ai donc juste dupliqué le message afin d'effectuer ces modifications sur une copie et non sur le message original. Enfin, il me semble que le programme n'attendais parfois pas d'avoir toutes les données avant de les renvoyer a mon navigateur, je l'ai donc forcé a attendre d'avoir un message dont le corps de données avait une taille égale à celle mentionné par le header "Content-Length"

Mes fichiers pouvaient alors être décompressé via gzip, j'ai donc réessayé d'utiliser zlib et ca a fonctionné Il me reste encore a gérer les message contenant le header "Transfert-Encoding: chunk" du coup
Arkenis est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 23h18.


 
 
 
 
Partenaires

Hébergement Web