Christian Kruse: [c] Parsing & Dekompression

Beitrag lesen

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