Workaround zum PEAR Modul HTTP Request

Dieses Meisterstück von mir ist ein Workaround, welches eine kleine Schwachstelle im PEAR-Modul HTTP Request in Verbindung mit komprimierten Dateien zerfetzen wird. Ab und an kann es nämlich einmal passieren, dass Daten, die mit dem Modul abgerufen werden, wegen Headerinformationen komprimiert sein sollten (content -encoding ==gzip), so gemein sind und doch ungezippt übertragen werden. Die Folge dieser Fehlinformation ist der Abbruch durch die Warnung “Warning: gzinflate(): data error in /usr/local/lib/php/HTTP/Request.php on line 1060″.

Um genau zu sein ist das nicht die Schuld des HTTP-Moduls; es ist nämlich der sendende Server, der dies verbockt.  Dennoch ist ein Fehlern gegenüber offeneres Fehlerhandling erwünscht. Allein die Tatsache, dass im Falle dieses Fehlers alle abgerufenen Daten futsch sind und das Script nun in einem undefinierten Zustand dasteht.

Um dem entgegen zu wirken, muss man die Datei HTTP/Request.php im Verzeichnis der PEAR Module um eine if-Anweisung ergänzen.

Man ersetzt einfach:

if ($hasBody) {
  // Uncompress the body if needed
  if ($gzipped) {
    $this->_body = gzinflate(substr($this->_body, 10)));
  }

durch:

if ($hasBody) {
  // Uncompress the body if needed
  if ($gzipped) {
    if ($tmp = @gzinflate(substr($this->_body, 10))) {
      $this->_body = $tmp;
    }
  }

And that’s it. ;)

An alle Interessierten: hier habt ihr meine spitzen Erklärung:

Durch das Asterisk-Zeichen (@), oder auch Klammeraffen genannt (ha…), wird die Minderheitengruppe “Fehlermeldung” unterdrückt und das Script kann erst einmal weiter regieren. Durch das Ausführen der Zuweisung in einer if-Anweisung  wird überprüft, ob die Funktion - in diesem Fall die Funktion gzinflate() - sauber ausgeführt wurde. Ist das nun so, haben wir in der Variable $tmp die dekomprimierten Daten. Diese können wir nun wie vorgesehen, endgültig der Object-Variable $this->_body zuweisen.

Der Umweg über die Variable $tmp muss in Kauf genommen werden, da im Fall eines Fehlers ja keine Daten von der Funktion gzinflate() zurück gegeben werden. Und würden wir in diesem Fall direkt in die Object variable $this->_body umleiten, würden wir auch in diesem Fall die Daten vernichten und das wollen wir ja nicht.

sonnige Grüsse

HaPe

No Comments yet

Leave a reply


« ältere Beiträge

neuere Beiträge »