文章目录
  1. 1. gzip解压问题
    1. 1.0.1. 解决办法

gzip解压问题

使用request发送请求,原来总是将编码变成deflate,一直没有解决是gzip格式时怎么解析,今天终于静下心来解决掉了。。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var request = require('request');
var zlib = require('zlib');
request({
uri: 'http://laomu1988.github.io/js/totop.js',
method: 'GET',
headers: {
"Accept-Encoding": "gzip, deflate, sdch"
}
}, function (err, response, body) {
if (err) console.log(err);
console.log('statusCode:', response.statusCode);
console.log('encoding:', response.headers['content-encoding']);
console.log('type:',typeof body);
console.log(zlib.gunzipSync(body) + '');
});

结果输出错误提示zlib解压失败

1
2
3
4
5
6
7
8
9
statusCode: 200
encoding: gzip
type: string
zlib.js:534
throw error;
^
Error: incorrect header check
at Zlib._handle.onerror (zlib.js:363:17)

为什么呢,直接将这段js文件保存并用zlib.gzipSync压缩后,通过网上代理对比直接请求时返回的内容,结果一致。但在代码解压的时候就是不能解压, 这说明是body有问题, 输出body内容的charCode对比压缩文件,发现有很多重复的65535,这说明request返回的body没有正确拼接。

1
2
3
for(var i = 0;i<100;i++) {
console.log(body.charCodeAt(i));
}

解决办法

查找request的文档,发现request有个参数encoding可以定义body的编码方式, 改为null则不自动编码。最终代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var request = require('request');
var zlib = require('zlib');
request({
uri: 'http://laomu1988.github.io/js/totop.js',
method: 'GET',
encoding: null,
headers: {
"Accept-Encoding": "gzip, deflate, sdch"
}
}, function (err, response, body) {
if (err) console.log(err);
console.log('statusCode:', response.statusCode);
console.log('encoding:', response.headers['content-encoding']);
console.log('type:',typeof body);
console.log(zlib.gunzipSync(body) + '');
});
文章目录
  1. 1. gzip解压问题
    1. 1.0.1. 解决办法