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) + ''); });
|