eddi: gzip/deflate aus einem Socket dekomprimieren

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

  1. 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

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. 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 93

      Bisschen schwache Prüfung, würde ich sagen ...

      na na na!

      Gruß aus Berlin!
      eddi

      1. 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

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
        1. 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