curl解决gzip和Transfer-Encoding:chunked的问题

时间: 2022-03-23 / 分类: 网站制作技术 / 浏览次数: 302 views / 0个评论 发表评论

客户的小偷站不能用了,今天有空看了一下

原来是对方站由http变https了,好在我有相关的代码,于是我换了上去

发现访问竟然是一片空白,按理说不可能啊

于是我想到了可能是证书验证,要先去掉验证

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);//为了不要证书

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);//为了不要证书

然后给长点时间

curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5000);//超时时间

然后终于有反应了,出来的是乱码,气得我牙痒痒

我查了一下相关资料,说是要看被抓页面的header

我发现了两个比较奇怪的~

一个是用了gzip压缩,另外一个是Transfer-Encoding:chunked

Gzip比较好解决,一句话搞定

curl_setopt($ch, CURLOPT_ENCODING, ‘gzip’);

但是chunked让我头疼,网上资料说是分块传输什么的,相当于把源代码分几块传输

有人说把http版本弄成1.0

curl_setopt($ch, CURLOPT_HTTP_VERSION, ‘1.0’);//为了回避Transfer-Encoding:chunked

但我当时测试的时候,没有修改$ch,一直没成功,只好找其他出路,(所有事情结束后才发现原来是$ch没改对)

然后我找了第二个办法,从别人资料里找了unchunk和unchunkHttp11函数

测试的时候unchunkHttp11老是丢失前面的一大段字符,不懂为啥

后面只好用了unchunk,幸好成功了

function unchunk($result) {
return preg_replace_callback(
'/(?:(?:\r\n|\n)|^)([0-9A-F]+)(?:\r\n|\n){1,2}(.*?)'.
'((?:\r\n|\n)(?:[0-9A-F]+(?:\r\n|\n))|$)/si',
create_function(
'$matches',
'return hexdec($matches[1]) == strlen($matches[2]) ? $matches[2] : $matches[0];'
),
$result
);
}
function unchunkHttp11($data) {
$fp = 0;
$outData = "";
while ($fp < strlen($data)) {
$rawnum = substr($data, $fp, strpos(substr($data, $fp), "\r\n") + 2);
$num = hexdec(trim($rawnum));
$fp += strlen($rawnum);
$chunk = substr($data, $fp, $num);
$outData .= $chunk;
$fp += strlen($chunk);
}
return $outData;
}

发表评论

您的昵称 *

您的邮箱 *

您的网站