eddi: gzip/deflate aus einem Socket dekomprimieren

Beitrag lesen

Hallo,

aus mir nicht nachvollziehbaren Gründen schlägt eine Dekompression von ausgelesenen Daten, die von einem Webserver stammen, fehl.

Folgende Funktion ist Teil eines Objekts:

function getHTTP($l){  
        # sendet einen HTTP-Request  
        $flag=true;  
        $s=@stream_socket_client(((substr($l[0],-1)=='p') ? 'tcp://' : 'ssl://').$l[1].':'.$l[2],$er,$es,10);  
        if(is_resource($s)){  
                if($l[1]==$this->host)  
                        fwrite($s,'GET '.$l[3]." HTTP/1.1\r\n");  
                else{  
                        fwrite($s,'HEAD '.$l[3]." HTTP/1.1\r\n");  
                        $flag=false;  
                }  
  
                fwrite($s,'Host: '.$l[1]."\r\n");  
                fwrite($s,"Accept: */*;q=0.9\r\n");  
                fwrite($s,"Accept-Encoding: gzip,deflate;q=0.9\r\n");  
                fwrite($s,"keep-Alive: 60\r\n");  
                fwrite($s,"Connection: keep-alive\r\n\r\n");  
  
                $size=false;  
                $cont=false;  
  
                if(substr(fgets($s),9,3)==200){  
                        do{     $t=explode(":",fgets($s,21000),2);  
                                if(strtolower($t[0])=='content-encoding')       $cont=trim($t[1]);  
                                elseif(strtolower($t[0])=='content-length')     $size=trim($t[1]);  
                        }while($t[0]!="\r\n");  
  
                        if($flag){  
                                $t='';  
                                while(!feof($s)){  
                                        $t.=fread($s,$size ? $size : 4096);  
                                        if(strlen($t)>1048575){  
                                                $this->error='Resource über 1 MB groß';  
                                                break;  
                                        }  
                                }  
                                if($cont)  
                                        if(stristr($cont,'deflate')!==false)  
                                                $t=gzinflate($t);  
                                        else    $t=gzuncompress($t); // Zeile 93  
                        }  
                        $this->content=$t;  
                }  
                else    $this->error='Resource nicht da';  
        }  
        else    $this->error='keine Verbindung';  
}

Fehlermeldung:

Warning: gzuncompress(): data error in /opt/php/testscripts/x.php on line 93

Gruß aus Berlin!
eddi