[原]Nodejs关于gzip/deflate压缩
来源:互联网 发布:网络侦探杰斯兽 编辑:程序博客网 时间:2024/06/11 17:06
http://homeway.me
0x01.关于
写http时候,在接收http请求时候,出现乱码,后来发现是gzip没有解压。
关于gzip/deflate压缩,有放入管道压缩,和非管道压缩方法。
0x02.非管道压缩
代码如下:
#! /usr/local/bin/nodevar http = require('http'), querystring = require('querystring'), zlib = require('zlib');var args = { //参数以及备用数据 contents : querystring.stringify({ //发包的信息 name:'homeway.me', }), };var options = { 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; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.11 Safari/537.36', 'Accept-Encoding':'gzip, deflate', },};var get = function ( options, args, callback ){ var req = http.request(options, function (res) { var chunks =[], 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 (){ var buffer = Buffer.concat(chunks); if (encoding == 'gzip') { zlib.gunzip(buffer, function (err, decoded) { data = decoded.toString(); callback( err, args, res.headers, data); }); } else if (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);});
0x02.管道压缩
Node中的I/O是异步的,因此对磁盘和网络的读写需要通过回调函数来读取数据。
当内存中无法一次装下需要处理的数据时,或者一边读取一边处理更加高效时,我们就需要用到数据流。
NodeJS中通过各种Stream来提供对数据流的操作。
官网提供了管道方法:
// client request examplevar zlib = require('zlib');var http = require('http');var fs = require('fs');var request = http.get({ host: 'homeway.me', path: '/', port: 80, headers: { 'accept-encoding': 'gzip,deflate' } });request.on('response', function(response) { var output = fs.createWriteStream('izs.me_index.html'); switch (response.headers['content-encoding']) { // or, just use zlib.createUnzip() to handle both cases case 'gzip': response.pipe(zlib.createGunzip()).pipe(output); break; case 'deflate': response.pipe(zlib.createInflate()).pipe(output); break; default: response.pipe(output); break; }});
引用来源:
Node.js v0.12.0 Manual & Documentation
本文出自 夏日小草,转载请注明出处: http://homeway.me/2015/03/03/nodejs-gzip-deflate-compression
by 小草
2015-03-03 14:17:20
0 0
- [原]Nodejs关于gzip/deflate压缩
- GZip 和 deflate压缩
- .NET GZIP,deflate压缩(转)
- ActionFilterAttribute之CompressFilter,GZIP,DEFLATE压缩
- C# GZip、Deflate 压缩解压算法函数
- C# Deflate、GZip压缩与解压缩
- HttpClient自动处理Gzip,Deflate压缩
- GZip、Deflate压缩算法对应的C#压缩解压函数
- Web服务器处理HTTP压缩之gzip、deflate压缩
- Web服务器处理HTTP压缩之gzip、deflate压缩
- Web服务器处理HTTP压缩之gzip、deflate压缩
- Web服务器处理HTTP压缩之gzip、deflate压缩
- Web服务器处理HTTP压缩之gzip、deflate压缩
- 如何用HttpWebRequest下载gzip, deflate压缩的页面
- 如何用HttpWebRequest下载gzip, deflate压缩的页面
- web中gzip,deflate的压缩与解压
- Accept-Encoding: gzip,deflate 以压缩格式接收请求数据
- http accept-encoding详解 HTTP协议-压缩(gzip,deflate)
- 在非UI线程中调用ProgressBar的setProgress函数,刷新进度条
- linux-ubuntu14.04下面使用gdb出现的问题
- ParameterizedType获取java泛型参数类型
- Java NIO系列教程(九) ServerSocketChannel
- 阿里三面 失败告终
- [原]Nodejs关于gzip/deflate压缩
- atoi
- java IO总结
- 10款Github上最火爆的国产开源项目
- Lock, semaphore, condition variables and monitors.
- linux中定义的几个网络报文的结构体
- WCF分布式事务(EF)
- NYOJ 496 [巡回赛-拓扑排序]
- Openstack nova(二)——架构(一)