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