Homepage selbermachen 7.846 Themen, 35.563 Beiträge

Problem mit Content-type

xafford / 0 Antworten / Flachansicht Nickles

Ich hätt da gern mal ein Problem. Ich bin gerade am Testen der Möglichkeit von Push-Dokumenten über den Content-type multipart/mixed (x-mixed-replace), aber irgendwie funktioniert es in keinem Browser wie es soll.
Internet Explorer interpretiert mixed und x-mixed-replace gleich als mixed, hängt also die nachgeladenen Inhalte an das Ende der Datei, dafür ignoriert er boundary (er zeigt es auf der Seite an) und die weiteren Content-types.
Firefox interpretiert mixed und x-mixed-replace identisch als x-mixed-replace und ersetzt bei beiden die Inhalte, ebenso macht es Opera.

Nach RFC wäre aber bei allen Browsern ein anderes Verhalten zu erwarten (okay, nicht bei IE, da weiß man, daß er es nicht standardkonform löst).
Content-type: mutipart/mixed sollte die neuen Inhalte an das Ende hängen, Content-type: multipart/x-mixed-replace sollte den aktuellen Inhalt durch den neuen ersetzen.

Hier der Testcode (nicht schön, aber selten) ;o)... Ist da eventuell ein Fehler drinnen, der dies verursacht, denn eigentlich sollte laut Recherche Firefox beide Angaben richtig interpretieren?



<?php



class Multipart {



    
/*

        Klasse um Inhalte zum Client zu "pushen".

        

        $delimiter hat zwei Funktionen. Erstens definiert er einen

        Zufalls-String als Boundary zudem zeigt er an, ob es sich um

        den Internet Explorer handelt. In letzterem Fall werden

        Content-type und boundary nicht ausgegeben (IE-Bug).

    */



    
var $delimiter;




    function
Multipart($mode = false) {

        
// Konstruktor. Der Parameter $mode    entscheidet, ob mixed, oder x-mixed-replace genutzt werden soll.

        // max_execution_time auf 6 Stunden (fuer Produktivcode zu lang!)

        
set_time_limit(21600);

        
// Destruktor registrieren um abschliessendes boundary zu uebertragen

        
register_shutdown_function(array (& $this, \'MultipartEnd\'));


        
// Delimiter als Zufallsstring erzeugen fuer Header

        
$this->delimiter = md5( uniqid ( rand() ) );

        
// Weiche fuer die verschiedenen Modi

        
if ($mode === false) {


            
// Inhalte werden durch neue ersetzt

            
header(\'Content-type: multipart/x-mixed-replace; boundary="\'.$this->delimiter.\'"\');

            print
"x-mixed-replace\\n";

        } else {

            
// Inhalte werden durch neue ergaenzt

            
header(\'Content-type: multipart/mixed; boundary="\'.$this->delimiter.\'"\');


            print
"mixed\\n";

        }

        
// Delimiter um -- ergaenzen, bzw fuer IE eliminieren

        
$this->delimiter = ( strstr(getenv(\'HTTP_USER_AGENT\'), \'MSIE\') ? false : \'--\'.$this->delimiter );


    }



    function
MultipartSend($content, $type=\'text/plain\') {

        
// Inahlte pushen (TODO: encoding)

      
if($this->delimiter) {


            
// Hier fuer Browser != IE (boundary und Content-type ausgeben)

          
print $this->delimiter."\\n";

            print
\'Content-type: \'.$type."\\n\\n";

        }

        print
$content;


        
// Impliziertes Leeren des Ausgabepuffers

      
flush();

    }



    function
MultipartEnd() {

        
// Destruktor

      
if($this->delimiter)

          print
$this->delimiter."--\\n"; // Abschliessendes boundary


        
flush();

    }

}



$mp = new Multipart(1);



for(
$i=1;$i<11;$i++) {


    
$mp->MultipartSend("$i von 10\\n");

  
sleep(1);

}

?>

Pauschalurteile sind immer falsch!!!
bei Antwort benachrichtigen