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 : 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;
}
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
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:
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