Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use request or http module to read gzip page into a string

I found the request module in js cannot handle gzip or inflate format http response correctly.

for example:

request({url:'some url'}, function (error, response, body) {
   //if the content-encoding is gzip, the body param here contains binaries other than readable string. And even worse after you convert the body to buffer, u even can not gunzip it.
}

so I want to use the sample code in official docs.

var request = http.get({ host: 'izs.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;
  }
});

The problem is that the code is writing the webpage into a file, I hope it can write the page into a string, so that i can process the page. I could not find any class like 'StringStream'.

If anyone has any idea on this,it will be great.

like image 494
user966085 Avatar asked Apr 18 '12 10:04

user966085


1 Answers

Pipe the response to the gzip stream and use it as you would use the original response object.

var req = http.request(options, function(res) {
    var body = "";

    res.on('error', function(err) {
       next(err);
    });

    var output;
    if( res.headers['content-encoding'] == 'gzip' ) {
      var gzip = zlib.createGunzip();
      res.pipe(gzip);
      output = gzip;
    } else {
      output = res;
    }

    output.on('data', function (data) {
       data = data.toString('utf-8');
       body += data;
    });

    output.on('end', function() {
        return next(false, body);
    });
 });

req.on('error', function(err) {
   next(err);
})
like image 92
Teemu Ikonen Avatar answered Oct 11 '22 12:10

Teemu Ikonen