Nodejs关于gzip/deflate压缩详解

2020-06-17 05:32:13易采站长站整理

0x01.关于

写http时候,在接收http请求时候,出现乱码,后来发现是gzip没有解压。

关于gzip/deflate压缩,有放入管道压缩,和非管道压缩方法。

0x02.管道压缩

Node中的I/O是异步的,因此对磁盘和网络的读写需要通过回调函数来读取数据。

当内存中无法一次装下需要处理的数据时,或者一边读取一边处理更加高效时,我们就需要用到数据流。

NodeJS中通过各种Stream来提供对数据流的操作。

官网提供了管道方法:


// client request example
var 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;
    }
});

0x03.非管道压缩

代码如下:


#! /usr/local/bin/node
var http = require(‘http’),
    querystring = require(‘querystring’),
    zlib = require(‘zlib’);
var args = {
    //参数以及备用数据
    contents : querystring.stringify({ 
        //发包的信息
        name:’homeway.me’,