Christian Kruse: [c] Parsing & Dekompression

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

  1. 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

    1. 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