[c] Parsing & Dekompression
Christian Kruse
- programmiertechnik
0 Bio
Hoi,
also, ich hab da ein kleines Problemchen. Ich hole mir (in C) per Ports den
Content eines Simplen HTTP-Gets. Der ist unterteilt in: HTTP-Header, Header und
Content. Das ganze sieht ca. so aus:
HTTP-Header\r\n\r\nHeader\n\nbiaerer content
Anschauen koennt ihr euch das auf
http://forum.de.selfhtml.org/cgi-bin/sub_server.pl
Das ganze moechte ich mit volgender Funktion parsen:
char *get_thread_list(const char *url)
{
int sock = -1;
int port = 80;
int maxlen = 1024;
int in_header = 1;
int n = 0;
int header_len= 1;
int body_len = 1;
uLongf len = 0;
char *host = NULL;
char *uri = NULL;
char *request = NULL;
char *result = NULL;
char *header = NULL;
char *buffer = NULL;
host = parse_url(url,&uri,&port);
sock = create_socket();
if(!connect_to(sock,host,port))
{
printf("Connection failed!\n");
exit(-1);
}
request = make_get_request(host,uri);
if(write(sock,request,strlen(request)) != strlen(request))
{
fprintf(stderr,"Warning: write problems!\n");
}
/* read forum data */
buffer = malloc(maxlen);
result = malloc(1);
header = malloc(1);
result[0] = '\0';
header[0] = '\0';
while((n = read(sock,buffer,maxlen)) > 0)
{
if(in_header)
{
char *temp = strstr(buffer,"\n\n");
if(temp == NULL)
{
header_len += n;
header = realloc(header,header_len);
header = strcat(header,buffer);
}
else
{
int pos = temp - buffer + 1;
header_len += pos;
header = realloc(header,header_len);
header = strncat(header,buffer,pos);
body_len += n - pos;
result = realloc(result,body_len);
result = strcat(result,&buffer[pos+1]);
in_header = 0;
}
}
else
{
body_len += n;
result = realloc(result,body_len);
result = strcat(result,buffer);
}
}
free(request);
free(buffer);
close(sock);
printf("%s",result);
exit(-1);
n = 20; // should be enough
len = n * body_len;
buffer = malloc(len);
while((in_header = uncompress(buffer,&len,result,body_len)) != Z_OK)
{
if(in_header == Z_DATA_ERROR)
{
fprintf(stderr,"Data error!\n");
exit(-1);
}
free(buffer);
n += 10;
buffer = malloc(n * body_len);
}
printf("%s",buffer);
free(buffer);
free(result);
free(header);
return NULL;
}
Soweit, so gut. Es scheint auch alles richtig in 'header' und 'result' gepackt
zu werden, aber ich bekomme von der Zlib immer nur Z_DATA_ERROR zurueck.
Ich kann mir beim besten willen nicht erklaeren, woran das liegt. Sieht
einer von euch vielleicht den Fehler? Gepackt wurde das ganze
mit Compress::Zlib::compress(), in Perl.
Gruss,
CK
Sup!
Tjaha... also... im Endeffekt... habe ich gehört, daß es ziemlich oft ziemlich kuriose Errors im Zusammenhang mit der zlib geben soll. Tröstet Dich das zumindest?
Gruesse,
Bio
Hoi,
Tjaha... also... im Endeffekt... habe ich gehört, daß es ziemlich oft
ziemlich kuriose Errors im Zusammenhang mit der zlib geben soll.
Das merke ich gerade. In meinem lokalen Forum ging es solange, bis ich
die Daten aus dem Forum hier benutzt habe... da kann doch irgendwas nicht
stimmen?!
Tröstet Dich das zumindest?
Nein, gar nicht.
Gruss,
CK