http://blog.buylit.com/?p=52
chunked_decode 把网页的 chunked 格式 换成一个整体的字串:
function chunked_decode($in)
{
$out = '';
while ($in != '') {
$lf_pos = strpos ($in, "\012");
if ($lf_pos === false) { $out .= $in; break; }
$chunk_hex = trim (substr ($in, 0, $lf_pos));
$sc_pos = strpos ($chunk_hex, ';');
if ($sc_pos !== false) $chunk_hex = substr ($chunk_hex, 0, $sc_pos);
if ($chunk_hex == ''){
$out .= substr ($in, 0, $lf_pos);
$in = substr ($in, $lf_pos + 1);
continue;
}
$chunk_len = hexdec ($chunk_hex);
if ($chunk_len){
$out .= substr ($in, $lf_pos + 1, $chunk_len);
$in = substr ($in, $lf_pos + 2 + $chunk_len);
} else {
$in = '';
}
}
return $out;
}
gzdecode 函数,把 gzip 字串解码:
function gzdecode($data)
{
$flags = ord (substr ($data, 3, 1));
$headerlen = 10;
$extralen = 0;
$filenamelen = 0;
if ($flags & 4){
$extralen = unpack ('v', substr ($data, 10, 2));
$extralen = $extralen [1];
$headerlen += 2 + $extralen;
}
if ($flags & 8) // Filename
$headerlen = strpos ($data, chr (0), $headerlen) + 1;
if ($flags & 16) // Comment
$headerlen = strpos ($data, chr (0), $headerlen) + 1;
if ($flags & 2) // CRC at end of file
$headerlen += 2;
$unpacked = @gzinflate (substr ($data, $headerlen));
if ($unpacked === FALSE) $unpacked = $data;
return $unpacked;
}
curl 可以返回转换过的 chunked 的内容,但是不能 返回 gzip 解码内容; fsockopen 方式,得先 chunked_decode, 然后再 gzdecode