Christian: content wird mit http-response nicht mitgesendet

Beitrag lesen

Hi,
erstmal vielen Dank für die Antwort :)

Hi,

Bis zu folgendem Response schicken Firefox und mein Skript das gleiche:

HTTP/1.1 302 Found\r\n
...
Location: info.html\r\n

Der Browser schickt nun einen GET-Request an die URI /head.php?showmus=1

Dazu hat er, zumindest wenn er obigen Response empfangen hat, aus HTTP-Sicht keinen Grund.

Wo im gegebenen Response liest der Browser diese URI ab?? Ich finde sie nicht.

Sie steht auch nicht in den HTTP-Headern.
Vielleicht erhaelt er die Aufforderung zum Wechsel zur genannten Ressource nicht per HTTP.

Wie können Daten noch übertragen werden? Hatte wohl fälschlicherweise angenommen, daß Browser und Server nur per HTTP komunizieren. Und wie kann man diese Daten auslesen? Geht das per PHP?

Mein Request richtete sich also nach der angegebenen Location: info.html

Wenn du info.html anforderst, wieso wirst du dann auf info.html per 302 weitergeleitet?

info.php habe ich erst angefordert nach der 302. Vorher war es noch eine andere Adresse.

Sicher, dass der Server "vernuenftig" arbeitet?

Also wenn ich mich mit dem Browser einlogge, dann funktioniert alles einwandfrei.

Die Content-Length ist 477, aber ich erhalte dann keinen "Content". Muß man den irgendwie manuell abfragen?

Zeig uns erst mal, wie du das Einlesen ueberhaupt machst.

Und die realen Adressen, die du abfragst, waeren vielleicht auch hilfreich.

MfG ChrisB

Also das Einlesen der Daten mache ich so:

Das chunked entschlüssel ich mit hexdec. Ich habe nun extra nochmal eine Funktion aus dem Netz genommen, um die Wahrscheinlichkeit eines Fehlers an dieser Stelle zu mindern. (Quelle ist PHP Manual für fsockopen, Beitrag von "mikey at badpenguins dot com" (danke^^))
Ändert mein Problem aber auch nicht, leider.

  
    function unchunkHttpResponse($str=null) {  
        if (!is_string($str) or strlen($str) < 1) { return false; }  
        $eol = "\r\n";  
        $add = strlen($eol);  
        $tmp = $str;  
        $str = '';  
        do {  
            $tmp = ltrim($tmp);  
            $pos = strpos($tmp, $eol);  
            if ($pos === false) { return false; }  
            $len = hexdec(substr($tmp,0,$pos));  
            if (!is_numeric($len) or $len < 0) { return false; }  
            $str .= substr($tmp, ($pos + $add), $len);  
            $tmp  = substr($tmp, ($len + $pos + $add));  
            $check = trim($tmp);  
            } while(!empty($check));  
        unset($tmp);  
        return $str;  
    }  

Nachdem ich mit fsockopen die Verbindung herstestellt habe und den HTTP-Response per fread gelesen und in der Variable $content gespeichert habe, suche ich das Ende des Headers und speichere mir Header und Body ab:

  
    $headend = strpos($content,"\r\n\r\n")+4;  
    $head = substr($content,0,$headend);  
    $body = substr($content,$headend,strlen($content)-$headend);  

Jetzt wird $body entschlüsselt:

  
    // Chunked Data Decode  
    if (strpos($head, "Transfer-Encoding: chunked")) {  
        $body = unchunkHttpResponse($body);  
    }  
  
    // gzip Data decode  
    if (strpos($head, "Content-Encoding: gzip")) {  
        $body = gzinflate(substr($body,10));  
    }  

Das funktionierte für mich auf der gleichen Seite nen HTTP-Response früher und ein korrekter Body wird zurückgeliefert.
Beim oben beschriebenen 302-Response mit dem kurzen Inhalt bekomme ich dadurch einen leeren String.

Ich ziehe ja hier die 10 Zeichen ab. Habe es schon mit 0 bis 15 Zeichen versucht, da kommt sonst nie was sinnvolles zurück.

Danke nochmal/schonmal :)
Gruß,
Christian