decompression gzip avec zlib
Bonjour tout le monde.
je me trouve avec un probleme etrange. jai un fichier r.gzip que j'ai obtenue apres telechargement d'une page html compressee.
je peux bien ouvrire le fichier gzip avec mon archive manager habituel mais
quand il s'agit de decompresser avec mon code depuis un buffer j'ai l'erreur Z_DATA_ERROR.
je me demande meme si zlib me permet de decompresser le gzip.
voici le code pour obtenir le gzip en buffeur que j'enregistre dans un fichier r.gzip (pour tester que l'archive manageur l'ouvre bien et c'est le cas) et appres je tente la decompression:
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
| int main(int argc,char **argv)
{
tnREQT_G *opt=tn_initGetReqt();
tnRESP *resp=NULL;
opt->user_a=malloc(10);
if(opt->user_a==NULL)
{
fprintf(stderr,"plooooouuuf on te refuse de la memoire, allez oust!\n");
return EXIT_FAILURE;
}
sprintf(opt->user_a,"mycrawler");
resp=tn_httpget(argv[1],opt);
tn_releaseREQT(&opt);
if(resp==NULL)
return EXIT_FAILURE;
fprintf(stdout,"http status:%d\ncontent size:%ld\n",resp->status,resp->cnt_size);
if(resp->cnt_enc==NULL || cgfind(resp->cnt_enc,"gzip",0)<0)
fprintf(stdout,"***content***\n%s**********************",resp->content);
else
{
FILE *f=fopen("r.gz","wb");
if(f==NULL)
{
fprintf(stderr,"file open error\n");
return EXIT_FAILURE;
}
fwrite(&(resp->content),resp->cnt_size,1,f);
fclose(f);
ungzip(&(resp->content),resp->cnt_size,'t');
//fprintf(stderr,"content :%s",resp->cnt_enc);
//fprintf(stderr,"content size:%s,%ld",resp->cnt_enc,resp->cnt_size);
}
tn_releaseRESP(&resp);
return EXIT_SUCCESS;
} |
donc jusqu'a ungzip() tout se passe bien, si la page telecharcher est html non compresse elle s'affiche nikel. mais quand je rentre dans la fonction gzip, j'ai l'erreur. voici la fonction
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
| size_t ungzip(char **datas,size_t s_gzip,char t)
{
char *data=*datas;
size_t s_data=2*s_gzip;
char *res=NULL;
int val,i;
if(s_gzip>=4294967296L) //pour l'instant on gere pas les fichiers de 4G
return 0;
s_data=(unsigned int)((((unsigned char)data[s_gzip-1])<<24)|(((unsigned char)data[s_gzip-2])<<16)|(((unsigned char)data[s_gzip-3])<<8)|(((unsigned char)data[s_gzip-4])));
if(s_data>=4294967296L) //pour l'instant on gere pas les fichiers de 4G
return 0;
if(t=='t') //si le contenue doit etre mis dans une chaine de caracteres
res=malloc(sizeof(char)*s_data+1);
else
res=malloc(sizeof(char)*s_data);
if(res==NULL)
{
fprintf(stderr,"allocation error in %s %d\n",__func__,__LINE__);
exit(1);
}
val=uncompress(res,&s_data,data,s_gzip);
fprintf(stderr,"%d ,ok:%d,data:%d,buff:%d,mem:%d\n",val,Z_OK,Z_DATA_ERROR,Z_BUF_ERROR,Z_MEM_ERROR);
free(data);
if(t=='t')
res[s_data]=0;
*datas=res;
return s_data;
} |
puis je teste sur un site dont je suis sur de recevoir un contenu compresse:
Citation:
RT='t'
RT='x'
http status:200
content size:13386
-3 ,ok:0,data:-3,buff:-5,mem:-4
le premier -3 montre que la fonction uncompress me renvois Z_DATA_ERROR(-3).
pourtant une verification du fichier r.gz me dit que tout est en ordre.
j'ai ecrit un petit prog pour comparer octet par octet le fichier r.gz et mon buffer res->content et ils sont identique.
je suis bloque je comprend pas pourquoi j'ai une erreure -3