Auslesen des HTTP-headers einer Datei geht nicht
-
Hallo,
ich habe vor kurzem zu meiner eigenen Library ein paar Netzwerk-Funktionen hinzugefügt. Jetzt versuche ich gerade, meine HTTP-GET-Funktion zum laufen zu bringen.
Die Datei an sich inkl. HTTP-Header ist schon geschrieben. Als erstes will ich jetzt den Status auslesen.
Der Header sieht so aus:
HTTP/1.1 200 OK Date: Mon, 05 Jan 2009 19:54:36 GMT Server: Apache/2.2.11 (Unix) mod_perl/2.0.4 Perl/v5.10.0 Last-Modified: Fri, 02 Jan 2009 18:09:19 GMT ETag: "90d8baf2-fc194-45f83d70048b3" Accept-Ranges: bytes Content-Length: 1032596 Content-Type: application/x-tar Content-Encoding: x-gzipDer Header soll nun mithilfe des selben Filepointers ausgelesen werden, mit dem die gesamte Datei geschrieben wurde.
Der Code dazu sieht folgendermaßen aus:
FILE* fp; fp = t_fopen(savepath.c_str(), "wb"); while(true) { bytesRecv = recv(buf, sizeof(buf), 0); if(bytesRecv <= 0) break; fwrite(buf, sizeof(char), bytesRecv, fp); } try { rewind(fp); char *status=NULL; //kopiert die aktuelle Zeile nach "status" und initialisiert den String mit new if(!read_line_seek(fp, status, '\n')); { remove(savepath.c_str()); throw NEW_ERROR("Answer not in HTTP-format", EC_CONTINUE); } if(strncmp(status+9, "200 OK", 6)) { remove(savepath.c_str()); delete[] status; char error_msg[128]="Server returned error-code: "; strcat(error_msg, status+9); throw NEW_ERROR(error_msg, EC_CONTINUE); } delete[] status; //geht in der Datei so weit vor, bis der angegebene String gefunden //wurde und setzt den Filepointer hinter den gesuchten Eintrag seek_after_str(fp, "Content-Length: "); char length[16]; fgets(length, 16, fp); int right_filesize=atoi(length); int wrong_filesize=length_of_file(savepath.c_str()); rewind(fp); //soll den Header aus der Datei löschen block_remove(fp, wrong_filesize-right_filesize, wrong_filesize); t_fclose(fp);Die Funktion "read_line_seek()" kopiert die aktuelle Zeile bis zu einer Newline in "status", welcher mit new innerhalb der Funktion initialisiert wird. Der Code dazu:
bool read_line_seek(FILE* fp, char*& str, char trailer, unsigned int maxsize) throw(ErrorClass,bad_alloc) { char to_read=trailer+1; unsigned int i=0; for(; to_read != trailer && !feof(fp); ++i) { to_read=fgetc(fp); cout << "to_read=" << to_read << endl; if(feof(fp)) return false; } if(maxsize && i>maxsize) throw NEW_ERROR("Line was too long for allocation!",EC_CONTINUE); t_fseek(fp,-i,SEEK_CUR); str = new char[i]; t_fread(str,sizeof(char),i,fp); str[i-1]='\0'; return true; }Doch aus irgend einem Grund scheint das rewind() wohl nicht zu klappen! Denn egal wie, ob ich die Zeile nun mit meiner Funktion oder fgets() einlese, bekomme ich nur Fehler.
Bei meiner Funktion werden immer nur binäre Zeichen eingelesen, undzwar endlos. Die cout-Ausgabe zeigt mir immer ein Ypsilon mit 2 Punkten drüber.
Bei fgets() sieht es dann aus wie ein leerer, nicht nullterminierter String, wobei mich das ziemlich verwundert, da es ja automatisch ein "\0" anhängen soll.
Ich kann mir beim besten Willen nicht erklären, wo der Fehler liegen soll. ftell() jedenfalls bestätigt mir, am Anfang der Datei zu sein.
Hat jemand eine Idee?