Decode gzipped web page retrieved via cURL in PHP

PhpEncodingGzipDecoding

Php Problem Overview


I'm retrieving a gzipped web page via curl, but when I output the retrieved content to the browser I just get the raw gzipped data. How can I decode the data in PHP?

One method I found was to write the content to a tmp file and then ...

$f = gzopen($filename,"r");
$content = gzread($filename,250000);
gzclose($f);

.... but man, there's got to be a better way.

Edit: This isn't a file, but a gzipped html page returned by a web server.

Php Solutions


Solution 1 - Php

I use curl and:

curl_setopt($ch, CURLOPT_ENCODING , "gzip");

Solution 2 - Php

Versatile GUNZIP function:

function gunzip($zipped) {
$offset = 0;
if (substr($zipped,0,2) == "\x1f\x8b")
$offset = 2;
if (substr($zipped,$offset,1) == "\x08")  {
# file_put_contents("tmp.gz", substr($zipped, $offset - 2));
return gzinflate(substr($zipped, $offset + 8));
}
return "Unknown Format";
}

Example of integrating function with CURL:

$headers_enabled = 1;
curl_setopt($c, CURLOPT_HEADER,  $headers_enabled)
$ret = curl_exec($c);

  if ($headers_enabled) {
     # file_put_contents("preungzip.html", $ret);

     $sections = explode("\x0d\x0a\x0d\x0a", $ret, 2);
     while (!strncmp($sections[1], 'HTTP/', 5)) {
        $sections = explode("\x0d\x0a\x0d\x0a", $sections[1], 2);
     }
     $headers = $sections[0];
     $data = $sections[1];

     if (preg_match('/^Content-Encoding: gzip/mi', $headers)) {
        printf("gzip header found\n");
        return gunzip($data);
     }
  }

  return $ret;

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionIanView Question on Stackoverflow
Solution 1 - PhpJonas LejonView Answer on Stackoverflow
Solution 2 - PhpMaryam JeddianView Answer on Stackoverflow