diff --git a/lib/utils.js b/lib/utils.js index 6dcbc41ed..732e8b3cd 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -84,29 +84,45 @@ var getUrl = exports.getUrl = function(url, options) { }) .on('response', function(res) { - if (supportGzip && ['gzip', 'deflate'].indexOf(res.headers['content-encoding']) > -1) { - - var gunzip = zlib.createUnzip(); - gunzip.request = res.request; - gunzip.statusCode = res.statusCode; - gunzip.headers = res.headers; - - if (!options.asBuffer) { - gunzip.setEncoding("binary"); - } - - req.emit('response', gunzip); - - res.pipe(gunzip); - - } else { - - if (!options.asBuffer) { - res.setEncoding("binary"); - } - - req.emit('response', res); - } + var contentEncoding = res.headers['content-encoding'] || 'identity'; + contentEncoding = contentEncoding.trim().toLowerCase(); + + var zlibOptions = { + flush: zlib.Z_SYNC_FLUSH, + finishFlush: zlib.Z_SYNC_FLUSH + }; + + if (contentEncoding === 'gzip') { + var gunzip = zlib.createGunzip(zlibOptions); + gunzip.request = res.request; + gunzip.statusCode = res.statusCode; + gunzip.headers = res.headers; + + if (!options.asBuffer) { + gunzip.setEncoding("binary"); + } + + req.emit('response', gunzip); + res.pipe(gunzip); + } else if (contentEncoding === 'deflate') { + var inflate = zlib.createInflate(zlibOptions); + inflate.request = res.request; + inflate.statusCode = res.statusCode; + inflate.headers = res.headers; + + if (!options.asBuffer) { + inflate.setEncoding("binary"); + } + + req.emit('response', inflate); + res.pipe(inflate); + } else { + if (!options.asBuffer) { + res.setEncoding("binary"); + } + + req.emit('response', res); + } }); req.emit('request', r);