Spaces:
Runtime error
Runtime error
| /** | |
| * Module dependencies. | |
| */ | |
| var StringDecoder = require('string_decoder').StringDecoder; | |
| var Stream = require('stream'); | |
| var zlib = require('zlib'); | |
| /** | |
| * Buffers response data events and re-emits when they're unzipped. | |
| * | |
| * @param {Request} req | |
| * @param {Response} res | |
| * @api private | |
| */ | |
| exports.unzip = function(req, res){ | |
| var unzip = zlib.createUnzip(); | |
| var stream = new Stream; | |
| var decoder; | |
| // make node responseOnEnd() happy | |
| stream.req = req; | |
| unzip.on('error', function(err){ | |
| if (err && err.code === 'Z_BUF_ERROR') { // unexpected end of file is ignored by browsers and curl | |
| stream.emit('end'); | |
| return; | |
| } | |
| stream.emit('error', err); | |
| }); | |
| // pipe to unzip | |
| res.pipe(unzip); | |
| // override `setEncoding` to capture encoding | |
| res.setEncoding = function(type){ | |
| decoder = new StringDecoder(type); | |
| }; | |
| // decode upon decompressing with captured encoding | |
| unzip.on('data', function(buf){ | |
| if (decoder) { | |
| var str = decoder.write(buf); | |
| if (str.length) stream.emit('data', str); | |
| } else { | |
| stream.emit('data', buf); | |
| } | |
| }); | |
| unzip.on('end', function(){ | |
| stream.emit('end'); | |
| }); | |
| // override `on` to capture data listeners | |
| var _on = res.on; | |
| res.on = function(type, fn){ | |
| if ('data' == type || 'end' == type) { | |
| stream.on(type, fn); | |
| } else if ('error' == type) { | |
| stream.on(type, fn); | |
| _on.call(res, type, fn); | |
| } else { | |
| _on.call(res, type, fn); | |
| } | |
| return this; | |
| }; | |
| }; |