$host="www.renren.com";
$request="GET / HTTP/1.1\r\nAccept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/msword, application/vnd.ms-excel, application/vnd.ms-powerpoint, */*\r\nAccept-Language: zh-cn\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727)\r\nAccept-Encoding: gzip, deflate\r\nHost: www.renren.com\r\nConnection: Keep-Alive\r\nCookie: _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);echo $result;
获取到的是Content-Encoding: gzip乱码
如果把Accept-Encoding: gzip, deflate改为Accept-Encoding: deflate可以
但是我想直接把gzip解压缩成正常代码
用gzuncompress 已经将http头去掉 还是提示data error
用其他函数直接显示空白
那位高手帮忙看下,急用谢谢
$request="GET / HTTP/1.1\r\nAccept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/msword, application/vnd.ms-excel, application/vnd.ms-powerpoint, */*\r\nAccept-Language: zh-cn\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727)\r\nAccept-Encoding: gzip, deflate\r\nHost: www.renren.com\r\nConnection: Keep-Alive\r\nCookie: _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);echo $result;
获取到的是Content-Encoding: gzip乱码
如果把Accept-Encoding: gzip, deflate改为Accept-Encoding: deflate可以
但是我想直接把gzip解压缩成正常代码
用gzuncompress 已经将http头去掉 还是提示data error
用其他函数直接显示空白
那位高手帮忙看下,急用谢谢
把这个从request里去掉即可。
比如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个字符.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个字符
2楼是发送请求时不发送支持解码信息,这样服务器一般不Response压缩数据。