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-gzip
    

    Der 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?


Anmelden zum Antworten