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..