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:
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 : 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 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; }
puis je teste sur un site dont je suis sur de recevoir un contenu compresse:
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 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; }
le premier -3 montre que la fonction uncompress me renvois Z_DATA_ERROR(-3).RT='t'
RT='x'
http status:200
content size:13386
-3 ,ok:0,data:-3,buff:-5,mem:-4
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
Partager