gzip/deflate aus einem Socket dekomprimieren
eddi
- php
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
hi,
aus mir nicht nachvollziehbaren Gründen schlägt eine Dekompression von ausgelesenen Daten, die von einem Webserver stammen, fehl.
Und du hast verifiziert, dass du auch wirklich komprimierte Daten bekommen hast?
if(stristr($cont,'deflate')!==false)
$t=gzinflate($t);
else $t=gzuncompress($t); // Zeile 93
Bisschen schwache Prüfung, würde ich sagen ...
gruß,
wahsaga
Hallo,
aus mir nicht nachvollziehbaren Gründen schlägt eine Dekompression von ausgelesenen Daten, die von einem Webserver stammen, fehl.
Und du hast verifiziert, dass du auch wirklich komprimierte Daten bekommen hast?
ja.
if(strtolower($t[0])=='content-encoding') $cont=trim($t[1]);
// ...
if(stristr($cont,'deflate')!==false)
$t=gzinflate($t);
else $t=gzuncompress($t); // Zeile 93Bisschen schwache Prüfung, würde ich sagen ...
na na na!
Gruß aus Berlin!
eddi
hi,
Und du hast verifiziert, dass du auch wirklich komprimierte Daten bekommen hast?
ja.
Wie?
Bisschen schwache Prüfung, würde ich sagen ...
na na na!
Du _wünschst_ dir deflate oder gzip.
Und wenn es nicht deflate ist, _muss_ es also gzip sein ...?
Ja, das halte ich in der Tat für eine sehr schwache Prüfung.
gruß,
wahsaga
Re:
Und du hast verifiziert, dass du auch wirklich komprimierte Daten bekommen hast?
ja.
Wie?
Durch Testausgabe des Contents vor der Komprimierung.
Bisschen schwache Prüfung, würde ich sagen ...
na na na!
Du _wünschst_ dir deflate oder gzip.
Und wenn es nicht deflate ist, _muss_ es also gzip sein ...?
Ich sehe gerade, Du hast recht, aber das ist nicht das Problem. Stell Dir vor, es sehe so aus:
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);
elseif(stristr($cont,'gzip')!==false) $t=gzuncompress($t);
}
$this->content=$t;
}
else $this->error='Resource nicht da';
}
else $this->error='keine Verbindung';
}
Gruß aus Berlin!
eddi