Nodejs关于gzip/deflate压缩详解
0x01.关于
写http时候,在接收http请求时候,出现乱码,后来发现是gzip没有解压。
关于gzip/deflate压缩,有放入管道压缩,和非管道压缩方法。
0x02.管道压缩
Node中的I/O是异步的,因此对磁盘和网络的读写需要通过回调函数来读取数据。
当内存中无法一次装下需要处理的数据时,或者一边读取一边处理更加高效时,我们就需要用到数据流。
NodeJS中通过各种Stream来提供对数据流的操作。
官网提供了管道方法:
//clientrequestexample
varzlib=require('zlib');
varhttp=require('http');
varfs=require('fs');
varrequest=http.get({host:'homeway.me',
path:'/',
port:80,
headers:{'accept-encoding':'gzip,deflate'}});
request.on('response',function(response){
varoutput=fs.createWriteStream('izs.me_index.html');
switch(response.headers['content-encoding']){
//or,justusezlib.createUnzip()tohandlebothcases
case'gzip':
response.pipe(zlib.createGunzip()).pipe(output);
break;
case'deflate':
response.pipe(zlib.createInflate()).pipe(output);
break;
default:
response.pipe(output);
break;
}
});
0x03.非管道压缩
代码如下:
#!/usr/local/bin/node
varhttp=require('http'),
querystring=require('querystring'),
zlib=require('zlib');
varargs={
//参数以及备用数据
contents:querystring.stringify({
//发包的信息
name:'homeway.me',
}),
};
varoptions={
hostname:'homeway.me',
port:80,
path:'/',
method:'GET',
headers:{
'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Content-Length':args.contents.length,
'User-Agent':'Mozilla/5.0(Macintosh;IntelMacOSX10_10_2)AppleWebKit/537.36(KHTML,likeGecko)Chrome/42.0.2311.11Safari/537.36',
'Accept-Encoding':'gzip,deflate',
},
};
varget=function(options,args,callback){
varreq=http.request(options,function(res){
varchunks=[],data,encoding=res.headers['content-encoding'];
//非gzip/deflate要转成utf-8格式
if(encoding==='undefined'){
res.setEncoding('utf-8');
}
res.on('data',function(chunk){
chunks.push(chunk);
});
res.on('end',function(){
varbuffer=Buffer.concat(chunks);
if(encoding=='gzip'){
zlib.gunzip(buffer,function(err,decoded){
data=decoded.toString();
callback(err,args,res.headers,data);
});
}elseif(encoding=='deflate'){
zlib.inflate(buffer,function(err,decoded){
data=decoded.toString();
callback(err,args,res.headers,data);
});
}else{
data=buffer.toString();
callback(null,args,res.headers,data);
}
});
});
req.write(args.contents);
req.end();
};
get(options,args,function(err,args,headers,data){
console.log('==>header\n',headers);
console.log('==data\n',data);
});
以上就是Nodejs关于gzip/deflate压缩的全部内容了,希望大家能够喜欢。