Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 3 sur 3
  1. #1
    Futur Membre du Club
    Homme Profil pro Carl
    Étudiant
    Inscrit en
    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:
    gzip: test_3156.gz: not in gzip format
    Il arrive que la décompression fonctionne et m'affiche:
    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..

  2. #2
    Membre expérimenté Avatar de Flob91
    Profil pro Florent
    Ingénieur
    Inscrit en
    mai 2005
    Messages
    810
    Détails du profil
    Informations personnelles :
    Nom : Florent
    Âge : 30
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : mai 2005
    Messages : 810
    Points : 549
    Points
    549

    Par défaut

    pourrais tu expliquer comment tu as résolu ton problème ?

  3. #3
    Futur Membre du Club
    Homme Profil pro Carl
    Étudiant
    Inscrit en
    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

    Bien sur, je ne pensais pas que qqun suivait ce post à vrai dire..

    La première erreur décrite ci-dessus:
    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

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •