<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Auslesen des HTTP-headers einer Datei geht nicht]]></title><description><![CDATA[<p>Hallo,</p>
<p>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.</p>
<p>Die Datei an sich inkl. HTTP-Header ist schon geschrieben. Als erstes will ich jetzt den Status auslesen.</p>
<p>Der Header sieht so aus:</p>
<pre><code>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: &quot;90d8baf2-fc194-45f83d70048b3&quot;
Accept-Ranges: bytes
Content-Length: 1032596
Content-Type: application/x-tar
Content-Encoding: x-gzip
</code></pre>
<p>Der Header soll nun mithilfe des selben Filepointers ausgelesen werden, mit dem die gesamte Datei geschrieben wurde.</p>
<p>Der Code dazu sieht folgendermaßen aus:</p>
<pre><code class="language-cpp">FILE* fp;
	fp = t_fopen(savepath.c_str(), &quot;wb&quot;);

	while(true)
	{
		bytesRecv = recv(buf, sizeof(buf), 0);

		if(bytesRecv &lt;= 0)
		 break;

		fwrite(buf, sizeof(char), bytesRecv, fp);
	}

	try {

	rewind(fp);

	char *status=NULL;

    //kopiert die aktuelle Zeile nach &quot;status&quot; und initialisiert den String mit new
	if(!read_line_seek(fp, status, '\n'));
	{
		remove(savepath.c_str());
		throw NEW_ERROR(&quot;Answer not in HTTP-format&quot;, EC_CONTINUE);
	}

	if(strncmp(status+9, &quot;200 OK&quot;, 6))
	{
		remove(savepath.c_str());

		delete[] status;

		char error_msg[128]=&quot;Server returned error-code: &quot;;
		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, &quot;Content-Length: &quot;);

	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);
</code></pre>
<p>Die Funktion &quot;read_line_seek()&quot; kopiert die aktuelle Zeile bis zu einer Newline in &quot;status&quot;, welcher mit new innerhalb der Funktion initialisiert wird. Der Code dazu:</p>
<pre><code class="language-cpp">bool read_line_seek(FILE* fp, char*&amp; str, char trailer, unsigned int maxsize) throw(ErrorClass,bad_alloc)
{
        char to_read=trailer+1;
        unsigned int i=0;

        for(; to_read != trailer &amp;&amp; !feof(fp); ++i) {
                to_read=fgetc(fp);
                cout &lt;&lt; &quot;to_read=&quot; &lt;&lt; to_read &lt;&lt; endl;
                if(feof(fp)) return false;
        }

        if(maxsize &amp;&amp; i&gt;maxsize)
         throw NEW_ERROR(&quot;Line was too long for allocation!&quot;,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;
}
</code></pre>
<p>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.</p>
<p>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.</p>
<p>Bei fgets() sieht es dann aus wie ein leerer, nicht nullterminierter String, wobei mich das ziemlich verwundert, da es ja automatisch ein &quot;\0&quot; anhängen soll.</p>
<p>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.</p>
<p>Hat jemand eine Idee?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/231040/auslesen-des-http-headers-einer-datei-geht-nicht</link><generator>RSS for Node</generator><lastBuildDate>Sat, 26 Sep 2026 01:11:56 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/231040.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 05 Jan 2009 20:08:34 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Auslesen des HTTP-headers einer Datei geht nicht on Mon, 05 Jan 2009 20:12:09 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>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.</p>
<p>Die Datei an sich inkl. HTTP-Header ist schon geschrieben. Als erstes will ich jetzt den Status auslesen.</p>
<p>Der Header sieht so aus:</p>
<pre><code>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: &quot;90d8baf2-fc194-45f83d70048b3&quot;
Accept-Ranges: bytes
Content-Length: 1032596
Content-Type: application/x-tar
Content-Encoding: x-gzip
</code></pre>
<p>Der Header soll nun mithilfe des selben Filepointers ausgelesen werden, mit dem die gesamte Datei geschrieben wurde.</p>
<p>Der Code dazu sieht folgendermaßen aus:</p>
<pre><code class="language-cpp">FILE* fp;
	fp = t_fopen(savepath.c_str(), &quot;wb&quot;);

	while(true)
	{
		bytesRecv = recv(buf, sizeof(buf), 0);

		if(bytesRecv &lt;= 0)
		 break;

		fwrite(buf, sizeof(char), bytesRecv, fp);
	}

	try {

	rewind(fp);

	char *status=NULL;

    //kopiert die aktuelle Zeile nach &quot;status&quot; und initialisiert den String mit new
	if(!read_line_seek(fp, status, '\n'));
	{
		remove(savepath.c_str());
		throw NEW_ERROR(&quot;Answer not in HTTP-format&quot;, EC_CONTINUE);
	}

	if(strncmp(status+9, &quot;200 OK&quot;, 6))
	{
		remove(savepath.c_str());

		delete[] status;

		char error_msg[128]=&quot;Server returned error-code: &quot;;
		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, &quot;Content-Length: &quot;);

	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);
</code></pre>
<p>Die Funktion &quot;read_line_seek()&quot; kopiert die aktuelle Zeile bis zu einer Newline in &quot;status&quot;, welcher mit new innerhalb der Funktion initialisiert wird. Der Code dazu:</p>
<pre><code class="language-cpp">bool read_line_seek(FILE* fp, char*&amp; str, char trailer, unsigned int maxsize) throw(ErrorClass,bad_alloc)
{
        char to_read=trailer+1;
        unsigned int i=0;

        for(; to_read != trailer &amp;&amp; !feof(fp); ++i) {
                to_read=fgetc(fp);
                cout &lt;&lt; &quot;to_read=&quot; &lt;&lt; to_read &lt;&lt; endl;
                if(feof(fp)) return false;
        }

        if(maxsize &amp;&amp; i&gt;maxsize)
         throw NEW_ERROR(&quot;Line was too long for allocation!&quot;,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;
}
</code></pre>
<p>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.</p>
<p>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.</p>
<p>Bei fgets() sieht es dann aus wie ein leerer, nicht nullterminierter String, wobei mich das ziemlich verwundert, da es ja automatisch ein &quot;\0&quot; anhängen soll.</p>
<p>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.</p>
<p>Hat jemand eine Idee?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1640082</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1640082</guid><dc:creator><![CDATA[D.Cent]]></dc:creator><pubDate>Mon, 05 Jan 2009 20:12:09 GMT</pubDate></item></channel></rss>