IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau C Discussion :

Décompression des corps de réponse HTTP


Sujet :

Réseau C

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 62
    Points : 36
    Points
    36
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 confirmé Avatar de Flow_75
    Femme Profil pro
    Ingénieure
    Inscrit en
    Mai 2005
    Messages
    1 096
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieure
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 096
    Points : 633
    Points
    633
    Par défaut
    pourrais tu expliquer comment tu as résolu ton problème ?

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 62
    Points : 36
    Points
    36
    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.

Discussions similaires

  1. CpteDom - amélioration des temps de réponse
    Par Domi2 dans le forum Access
    Réponses: 2
    Dernier message: 25/10/2006, 14h29
  2. [Outil]Simulation de dégradation des temps de réponse
    Par Laurent Dardenne dans le forum Développement
    Réponses: 4
    Dernier message: 07/06/2006, 16h23
  3. [zLib] Compresser/Décompresser des données
    Par alex6891 dans le forum Réseau
    Réponses: 10
    Dernier message: 25/03/2006, 11h35
  4. décompresser des .zip
    Par Nico65 dans le forum C++
    Réponses: 3
    Dernier message: 30/11/2004, 14h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo