fsockopen返回gzip内容无法gzdecode解压的问题

#1.返回头Transfer-Encoding: chunked表明是chunked的传输编码
这个意思是,服务器分批把http body返回给你,比如http body如下
2 --表示下一个chunked的长度为2,这个数字是16进制,不是10进制
ab -- 长度为2的串
3 -- 同上
abc -- 长度为3的串
1 -- 同上
a -- 长度为1的串
0 -- 长度为0,这个是结束标识

所以最终的http body应该是ababca ,长度标识是不需要的。

#2.经过deflate的http body需要忽略前10个字符.

[code language="php"]
header("content-type:text/html;charset=utf-8");
$host="www.renren.com";
$request="GET / HTTP/1.1\r\n"
."Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/msword, application/vnd.ms-excel, application/vnd.ms-powerpoint, */*\r\n"
."Accept-Language: zh-cn\r\n"
."User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727)\r\n"
."Accept-Encoding: gzip, deflate\r\n"
."Host: www.renren.com\r\n"
."Connection:close\r\n"
."Cookie: _r01_=1; depovince=GW\r\n\r\n";

$fp=fsockopen($host,80);
fputs($fp,$request);
$result="";
while(!feof($fp)){
$result.=fgets($fp,1024);
}
fclose($fp);
$hb = explode("\r\n\r\n",$result);//分隔http head和body
$body = $hb[1]; //http body
$chunk = strtok($body,"\r\n");//获取第一个chunked string的16进制串长标识
while( $len = (hexdec($chunk) + 0) ) //最后一个chunked string的串长铁定是0,这是协议规范
{
$start = strlen($chunk) + 2;//从chunked标识后读取串, +2是因为还要考虑"\r\n"
$bd .= substr($body , $start , $len );//读取真正要decode的http body
$body = substr($body , $start + $len + 2); //body把上一个chunked去掉
$chunk = strtok($body,"\r\n");//查找下一个chunked长度标识
}
echo gzinflate(substr($bd,10));//忽略前10个字符
[/code]

标签: fsockopen, gzip解压

添加新评论